istio Ambient Mode 구축하기

장쿠배·2025년 5월 25일

kubernetes

목록 보기
2/6

Ambient Mode의 좋은점!

#L4 정책 (Layer 4)
IP/포트 단위로 허용/차단

트래픽 내용까지는 보지 않음

성능이 빠르고 단순함

#L7 정책 (Layer 7)
HTTP 요청의 경로, 메서드, 헤더 등을 기반으로 제어

더 정밀한 제어 가능 (예: GET만 허용, POST 차단)

성능은 약간 더 소모됨

#Ambient Mode에서 L4 제어는 ztunnel이, L7 제어는 waypoint가 담당합니다.


#Istio CLI 다운로드
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.25.2
export PATH=$PWD/bin:$PATH
#버전 확인
istioctl version
#Calico VXLAN 활성화
#ipip: 인터넷 프로토콜 헤더 안에 또 다른 IP 패킷을 집어넣는 방식. 환경에 따라 커널 지원이나 방화벽 이슈가 많음.
#vxlan: UDP 기반의 레이어2 오버레이. 대부분 환경에서 별도 설정 없이 작동.
#istiod<->ztunnel간 연결 하기 위한 설정
kubectl patch ippool default-ipv4-ippool \
--type merge \
-p '{"spec":{"ipipMode":"Never","vxlanMode":"Always"}}'
#Istio 클러스터에 설치하기
istioctl install --set profile=ambient --skip-confirmation
#crd 설정
kubectl get crd [gateways.gateway.networking.k8s.io](http://gateways.gateway.networking.k8s.io/) &> /dev/null || \
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml

##############방법2 helm으로 설치########################

(1) istio-base: CRD+공통 컴포넌트

helm upgrade --install istio-base ./manifests/charts/base \
-n istio-system --create-namespace

(2) istio-cni: Ambient CNI

helm upgrade --install istio-cni ./manifests/charts/istio-cni \
-n istio-system \
--set global.istioNamespace=istio-system \
--set cni.ambient.enabled=true

(3) istiod: Ambient 모드 활성화

helm upgrade --install istiod ./manifests/charts/istio-control/istio-discovery \
-n istio-system \
--set global.istioNamespace=istio-system \
--set meshConfig.defaultConfig.proxyMetadata.ENABLE_HBONE=true \
--set global.cni.ambient.enabled=true \
--set pilot.env.PILOT_ENABLE_AMBIENT=true

(4) ztunnel: Ambient 데이터플레인

helm upgrade --install ztunnel ./manifests/charts/ztunnel \
-n istio-system \
--set global.istioNamespace=istio-system
##kiali 설치##
kubectl apply -f samples/addons/kiali.yaml
kubectl apply -f samples/addons/prometheus.yaml

#kiali nodeport로 설정
kubectl -n istio-system patch svc kiali --type merge -p '{
  "spec": {
    "type": "NodePort",
    "ports": [
      {
        "name": "http",
        "port": 20001,
        "targetPort": 20001,
        "nodePort": 30001
      },
      {
        "name": "metrics",
        "port": 9090,
        "targetPort": 9090,
        "nodePort": 30090
      }
    ]
  }
}'
#istio gateway로 외부 접속 하는법
apiVersion: v1
kind: Service
metadata:
  name: kiali-svc
  namespace: istio-system
  labels:
    app: kiali
spec:
  selector:
    app: kiali
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 20001  # Kiali 기본 포트
  type: ClusterIP
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: kiali-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---

### kiali-gateway.yaml (예시)

```bash
apiVersion: [networking.istio.io/v1beta1](http://networking.istio.io/v1beta1)
kind: VirtualService
metadata:
name: kiali-vs
namespace: istio-system
spec:
hosts:

- "*"
gateways:
- kiali-gateway
http:
- match:
    - uri:
    prefix: /
    route:
    - destination:
    host: kiali.istio-system.svc.cluster.local
    port:
    number: 20001

##테스트용 프로젝트 설치
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f samples/bookinfo/platform/kube/bookinfo-versions.yaml
kubectl apply -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml
kubectl get gateway

#Istio Ambient 모드란

Ztunnel = L4 (네트워크 레벨) 프록시
Waypoint = L7 (애플리케이션 레벨) 프록시
→ 두 프록시 조합으로 세분화된 보안 제어가 가능해집니다.

여기서는 bookinfo gateway → productpage 간 L4 연결 허용 (즉, TCP 수준에서만 허용).
아직 L7 제어는 안 되며, 모든 요청(GET/POST/DELETE 등)은 통과될 수 있습니다.

#L4 Ztunnel 연결
kubectl apply -f - <<EOF
apiVersion: [security.istio.io/v1](http://security.istio.io/v1)
kind: AuthorizationPolicy
metadata:
name: productpage-ztunnel
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:

- from:
    - source:
    principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
        EOF

kubectl apply -f samples/curl/curl.yaml

#테스트
curl → productpage 접근 시도

현재는 curl 이 bookinfo-gateway가 아니므로 접근 불가

curl 을 L4에서 열어주거나, L7에서 위임해야 함

kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"

#L7 Waypoint 설치
이 프록시는 L7 요청들(GET/POST 등)을 감시함

동시에 namespace에 라벨이 추가됨:
istioctl waypoint apply --enroll-namespace --wait

kubectl get gtw waypoint

#L7 수준 AuthorizationPolicy 적용 (Waypoint가 감시)
curl → productpage로 GET 요청만 허용

POST, DELETE 등은 거부됨

다른 서비스 예: reviews-v1 → 접근도 차단됨

kubectl apply -f - <<EOF
apiVersion: [security.istio.io/v1](http://security.istio.io/v1)
kind: AuthorizationPolicy
metadata:
name: productpage-waypoint
namespace: default
spec:
targetRefs:

- kind: Service
group: ""
name: productpage
action: ALLOW
rules:
- from:
    - source:
    principals:
        - cluster.local/ns/default/sa/curl
        to:
    - operation:
    methods: ["GET"]
    EOF

#Ztunnel 정책도 Waypoint 를 추가 허용
기존 L4 정책에서는 Waypoint가 productpage로 보내는 요청이 차단되므로,
→ Waypoint도 허용 주체에 추가해야 합니다.

kubectl apply -f - <<EOF
apiVersion: [security.istio.io/v1](http://security.istio.io/v1)
kind: AuthorizationPolicy
metadata:
name: productpage-ztunnel
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:

- from:
    - source:
    principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
        - cluster.local/ns/default/sa/waypoint
        EOF

DELETE 요청 → 거부됨 (허용된 메서드 아님)

kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied

다른 서비스 (reviews-v1) → 거부됨 (curl만 허용했기 때문)

kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied

curl → GET 요청 허용됨

kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

#트래픽 관리 (Manage traffic)
이제 Waypoint 프록시가 설치되었으니, 서비스 간 트래픽을 분할하는 방법을 배워보겠습니다.

🔸 서비스 간 트래픽 분할
Bookinfo 애플리케이션에는 reviews 서비스가 v1, v2, v3 총 3개의 버전이 있습니다.
이 중 v1과 v2에 대해 트래픽을 나눠서 테스트할 수 있습니다. (예: A/B 테스트, Canary 배포 등)

다음은 트래픽을 reviews-v1에 90%, reviews-v2에 10% 보내도록 구성하는 예시입니다:

kubectl apply -f - <<EOF
apiVersion: [gateway.networking.k8s.io/v1](http://gateway.networking.k8s.io/v1)
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:

- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
    - name: reviews-v1
    port: 9080
    weight: 90
    - name: reviews-v2
    port: 9080
    weight: 10
    EOF

#트래픽 분배 확인 방법
curl 파드에서 100번 요청을 보내서 몇 번이 reviews-v2로 가는지 확인할 수 있습니다:

kubectl exec deploy/curl -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"

실행 결과에서 reviews-v2가 출력된 횟수가 대략 10% 정도면 정상입니다.

#지우는 방법
kubectl label namespace default [istio.io/use-waypoint-](http://istio.io/use-waypoint-)
istioctl waypoint delete --all

kubectl label namespace default [istio.io/dataplane-mode-](http://istio.io/dataplane-mode-)

#샘플 파일 지우기
kubectl delete httproute reviews
kubectl delete authorizationpolicy productpage-viewer
kubectl delete -f samples/curl/curl.yaml
kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl delete -f samples/bookinfo/platform/kube/bookinfo-versions.yaml
kubectl delete -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml

#istio 지우기
istioctl uninstall -y --purge
kubectl delete namespace istio-system

#Remove the Kubernetes Gateway API CRDs
kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml
profile
Kubernetes/AmazonAWS를 위한 나의 기록

0개의 댓글