Istio Ambient Mesh 설치 가이드

이 포스트는 Istio Ambient Mesh가 무엇인지 알아보고, Kubernetes 클러스터에 Istio Ambient Mesh 를 설치하는 방법을 다룹니다.

Istio Ambient Mesh는 기존 Sidecar 기반의 Istio Service Mesh를 대체하는 새로운 아키텍처로,
서비스 간 보안(mTLS), 트래픽 관리 기능을 제공하면서도 Sidecar 없이 동작하는 것이 특징입니다.
Istio의 Sidecar 방식과 Ambient 방식의 상세한 차이는 Istio 공식 문서에서 확인하실 수 있습니다.

기본적인 Istio Ambient Mesh 설치를 통해 클러스터의 Pod 통신 간 mTLS 적용 및 L4 인증 정책 적용이 가능하며, Waypoint Proxy를 추가로 구성 시 L7 트래픽 처리도 가능합니다. 다만 기존 Istio Service Mesh의 VirtualService를 활용한 구성은 아직 알파 단계로, Gateway API 설정과의 혼합은 지원하지 않습니다.

이 포스트에서는 Istio Ambient Mesh의 기본 설치 과정을 다루며, Waypoint Proxy 구성 및 활용 방법은 다루지 않습니다.

목차

1. Istio Ambient Mesh란?
 1-1. Istio Ambient Mesh 구성 요소
 1-2. Istio Ambient Mesh 동작 원리
2. 버전 정보
3. Istio Ambient Mesh 설치
4. 결론

1. Istio Ambient Mesh란?

Istio Ambient Mesh는 기존 Sidecar 기반의 Istio Service Mesh를 대체하는 새로운 아키텍처로,
Kubernetes의 Pod 간 보안(mTLS), 트래픽 관리, 원격 측정 데이터(telemetry) 기능을 제공하면서도 Sidecar 없이 동작하는 것이 특징입니다.

기존 Istio는 각 애플리케이션 Pod마다 Envoy Sidecar를 주입해야 했지만, Ambient Mesh는 Pod의 트래픽을 클러스터의 노드마다 배포된 Ztunnel이 가로채 관리하여 메시 기능을 제공하며, 다음과 같은 이점을 가집니다.

  1. Sidecar 없이 Service Mesh 기능 제공
    • 애플리케이션 코드나 Pod 설정을 변경하지 않고 메시 기능 활용 가능
    • 기존 서비스에 대한 영향 없이 점진적인 도입 가능
  2. 리소스 사용량 절감
    • Sidecar 방식에서는 Pod마다 Envoy Proxy가 sidecar로 실행되어 CPU/메모리의 추가 할당 필요
    • Ambient Mesh에서는 L4 트래픽은 ZTunnel, L7 트래픽은 Waypoint Proxy가 노드마다 배포되어 처리하여 전체적인 리소스 사용량 감소
  3. 점진적인 L7 기능 도입 가능
    • 기본적으로 ZTunnel이 L4(mTLS) 트래픽을 처리
    • L7 트래픽 (HTTP, gRPC) 처리가 필요할 경우 Waypoint Proxy를 추가하여 사용
  4. 운영 복잡성 감소
    • Pod마다 Sidecar를 관리할 필요 없음
    • 서비스 메시 적용을 위해 Pod 재시작 없이 네임스페이스 레이블 추가만으로 적용 가능

1-1. Istio Ambient Mesh 구성 요소

Istio Ambient Mesh를 최초로 설치하면 istiod, istio-cni, Ztunnel이 기본적으로 배포되며,
이를 통해 L4 트래픽을 처리할 수 있습니다. L7 트래픽 처리를 위한 Waypoint Proxy별도 구성이 필요합니다.

istiod

istiod는 Istio의 컨트롤 플레인으로써 동작하는 컴포넌트로, 클러스터에 Deployment 방식을 통해 Pod로 배포됩니다.

  • 서비스 디스커버리: 서비스 인스턴스를 감지하고, 서비스 간 통신을 위한 정보를 관리
  • 정책 관리: 트래픽 정책 및 보안 정책을 저장하고 적용
  • 보안 인증: 서비스 간 mTLS 인증서 발급 및 갱신 관리
  • Waypoint Proxy 관리: Gateway 리소스를 통해 Waypoint Proxy 구성 및 관리
istio-cni

istio-cni는 Daemonset으로 배포되어 클러스터의 각 노드 당 하나의 Pod로 배포됩니다.

  • 기존에 클러스터에 구성된 CNI 플러그인(Pod)의 확장으로 동작합니다
  • Ambient Mesh에 속한 Pod를 식별하고, CNI 플러그인이 Pod의 네트워크를 구성할 때 해당하는 Pod의 트래픽을 Ztunnel로 리다이렉션하도록 구성합니다
Ztunnel

Ztunnel(Zero Trust tunnel)은 Daemonset으로 배포되어 클러스터의 각 노드 당 하나의 Pod로 배포됩니다. Ztunnel은 Ambient Mesh에서 L4 트래픽을 처리하는 핵심 컴포넌트로 Pod의 트래픽을 보안 터널을 통해 전달합니다.

  • Pod 간 mTLS 암호화 적용
  • L4 인증, 원격 측정 데이터(telemetry) 제공
  • HBONE(HTTP-Based Overlay Network Environment) 프로토콜 사용
    • 기존 Sidecar 방식과 달리, HBONE을 통해 보안 트래픽을 관리
    • 내부적으로 HTTP/2 CONNECT 방식을 활용하여 mTLS 적용
https://istio.io/latest/docs/ambient/architecture/hbone/
Waypoint Proxy

Waypoint Proxy는 Deployment로 배포되어 네임스페이스마다 하나의 Pod로 배포됩니다.

  • L7(애플리케이션 계층) 트래픽 처리를 담당
  • Envoy 프록시 기반으로 구현되어 sidecar 모드와 동일한 엔진을 사용
  • sidecar과 달리 애플리케이션과 독립적으로 구성/스케일 됨
  • L7 인증, 원격 측정 데이터(telemetry) 제공

1-2. Istio Ambient Mesh 동작 원리

Istio Ambient Mesh - Istio-cni Pod 동작
https://istio.io/latest/docs/ambient/architecture/traffic-redirection/

Isito CNI Pod는 Pod의 생성/삭제와 같은 CNI 이벤트, 그리고 Kubernetes API 서버를 통해 Pod와 네임스페이스에 레이블이 추가되는 이벤트에 반응하여 동작합니다.

1. Isito CNI Pod는 Ambient Mesh에 속하는 workload Pod에 들어가고 나가는 패킷을 Ztunnel Pod의 리스닝 포트(15008, 15006,15001)로 리다이렉션 하도록 구성합니다.

2. 이후 Ztunnel Pod에게 Pod의 network namespace에 proxy listening port(15008, 15006,15001)를 생성해야 한다고 알립니다.

3. Ztunnel은 Ambient Mesh에 새로 추가된 Pod에 대한 논리 프록시 인스턴스와 listen port를 생성합니다.

4. workload Pod의 리다이렉트 규칙이 구성되고, Ztunnel의 listen port가 구성되면 Pod는 메시에 추가되고 트래픽이 Ztunnel을 통해 흐르기 시작합니다.

Istio Ambient Mesh - workload Pod와 Ztunnel Pod 동작
https://istio.io/latest/docs/ambient/architecture/traffic-redirection/
workload Pod 트래픽 수신
  1. Pod가 트래픽을 수신 (HBONE to 15008 / target 80)
  2. decap을 위해 Ztunnel로 프록시
  3. workload port로 전송
workload Pod 트래픽 전송
  1. workload Pod에서 5151 port 목적지의 outbound 트래픽 전송
  2. encap을 위해 Ztunnel로 프록시
  3. Ztunnel을 거쳐 HBONE 트래픽이 Pod에서 나감

모든 리다이렉션은 host 영역(노드)이 아닌 Pod 내부에서 일어납니다.

2. 버전 정보

  • Kubernetes: v1.30.3
  • Istio: 1.24.3

3. Istio Ambient Mesh 설치

Kubernetes 클러스터에 Istio Ambeint Mesh를 구성하도록 하겠습니다.
Istio 1.24.3 버전 기준 지원되는 Kubernetes 버전은 1.28, 1.29, 1.30, 1.31으로, 버전별 자세한 지원 내역은 Istio 문서를 참고하세요.

Istio Ambient Mesh를 설치하기 전에 Kubernetes Gateway API CRDs를 설치합니다. Gateway API는 Waypoint 및 트래픽 라우팅 구성에 사용됩니다.

명령어를 사용해 현재 클러스터 내부에 해당 CRD의 구성 여부를 확인하고, 구성되지 않은 경우 설치합니다.

$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  { kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml; }

최신 버전(릴리즈) 정보는 gateway-api GitHub을 참고하세요.

Istio의 CLI인 istioctl 구성을 위해 Istio 파일을 다운로드합니다. istio-1.24.3 디렉터리 내부에는 샘플 애플리케이션 파일도 포함되어 있습니다.
kubectl을 통해 클러스터와 통신이 가능한 환경에서 진행합니다.

$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.24.3
$ export PATH=$PWD/bin:$PATH

명령어를 사용해 Istio를 설치합니다. set profile 옵션을 ambient로 지정하여 Istio Ambient Mesh를 설치할 수 있습니다.

$ istioctl install --set profile=ambient --skip-confirmation

        |\          
        | \         
        |  \        
        |   \       
      /||    \      
     / ||     \     
    /  ||      \    
   /   ||       \   
  /    ||        \  
 /     ||         \ 
/______||__________\
____________________
  \__       _____/  
     \_____/        

✔ Istio core installed ⛵️                                                                                                                                    
✔ Istiod installed 🧠                                                                                                                                        
✔ CNI installed 🪢                                                                                                                                            
✔ Ztunnel installed 🔒                                                                                                                                       
✔ Installation complete                                                                                                                                      
The ambient profile has been installed successfully, enjoy Istio without sidecars!

설치가 완료되면 istio-system 네임스페이스에 다음과 같이 Istio Ambient Mesh 관련 리소스가 생성됩니다.

$ kubectl get all -n istio-system 

NAME                             READY   STATUS    RESTARTS   AGE
pod/istio-cni-node-dkzk5         1/1     Running   0          74s
pod/istio-cni-node-rqzlc         1/1     Running   0          74s
pod/istio-cni-node-tsmph         1/1     Running   0          74s
pod/istiod-7b757b4449-hgk5z      1/1     Running   0          78s
pod/ztunnel-5b2ts                1/1     Running   0          62s
pod/ztunnel-l5zph                1/1     Running   0          62s
pod/ztunnel-qmk6k                1/1     Running   0          62s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                 AGE
service/istiod       ClusterIP   10.98.176.0      <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP   78s

NAME                            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/istio-cni-node   3         3         3       3            3           kubernetes.io/os=linux   74s
daemonset.apps/ztunnel          3         3         3       3            3           kubernetes.io/os=linux   62s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istiod       1/1     1            1           79s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/istiod-7b757b4449      1         1         1       79s

NAME                                         REFERENCE           TARGETS              MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/istiod   Deployment/istiod   cpu: 1%/80%   1         5         1          79s

istio-cniztunnel은 Daemonset으로 배포되어 각 노드에 Pod가 배포됩니다.
istiod는 Delpoyment로 배포되며, 해당 Pod의 CPU 사용량을 기반으로 개수를 조정하는 horizontalpodautoscaler도 구성됩니다.

Istio Ambient Mesh의 설치가 완료된 이후, 클러스터 내부의 Pod를 ambient mesh에 추가하려면 istio.io/dataplane-mode=ambient 레이블 설정이 필요합니다. 해당 레이블은 네임스페이스, Pod에 적용 가능하며 네임스페이스에 적용 시 해당 네임스페이스에 배포된 Pod에 모두 적용됩니다.

istio.io/dataplane-mode=ambient 레이블을 추가하면 Pod를 재시작하지 않고도 Pod 간의 통신이 mTLS로 보호되며, Istio가 TCP 원격 측정 데이터(telemetry)를 수신하기 시작합니다.

$ kubectl label ns default istio.io/dataplane-mode=ambient

namespace/default labeled

$ kubectl get ns default --show-labels 

NAME      STATUS   AGE    LABELS
default   Active   320d   istio.io/dataplane-mode=ambient,kubernetes.io/metadata.name=default

Isitoctl 명령어를 통해 ambient mesh에 추가된 리소스를 확인할 수 있습니다.
Istio의 샘플 애플리케이션인 Bookinfo 애플리케이션

$ istioctl ztunnel-config workload

NAMESPACE             POD NAME                                ADDRESS        NODE    WAYPOINT PROTOCOL
app                   nginx                                   10.244.5.63    worker2 None     TCP
app                   oidc-backend-7bf9b5c7d4-2gzhs           10.244.5.61    worker2 None     TCP
default               curl-7cd64bb6c5-l98f2                   10.244.5.82    worker2 None     HBONE
default               details-v1-6cd6d9df6b-jfj5f             10.244.4.168   worker  None     HBONE
default               kubernetes                              192.168.200.90         None     TCP
default               nginx                                   10.244.4.178   worker  None     HBONE
default               productpage-v1-57ffb6658c-p9pjb         10.244.5.83    worker2 None     HBONE
default               ratings-v1-794744f5fd-2wzj5             10.244.4.166   worker  None     HBONE
default               reviews-v1-67896867f4-qtg7q             10.244.4.167   worker  None     HBONE
default               reviews-v2-86d5db4bd6-2c24h             10.244.4.169   worker  None     HBONE
default               reviews-v3-77947c4c78-4jmbp             10.244.4.170   worker  None     HBONE
demo                  nginx-hello-77b759cf69-g752n            10.244.4.149   worker  None     TCP

...

PROTOCOL 항목의 값이 HBONE으로 표시되는 Pod는 ambient mesh에 추가된 상태입니다. 레이블 설정에 따라 default 네임스페이스의 Pod들이 추가된 것을 확인할 수 있습니다.

Kiali를 통해 default 네임스페이스에 배포된 Bookinfo 애플리케이션을 확인해 보면 자물쇠 아이콘을 통해 mTLS 적용을 확인할 수 있습니다.

Kiali 구성을 통해 클러스터의 Ambient Mesh를 시각화하는 방법은 Istio Service Mesh 시각화: Kiali 설치와 사용법 안내 포스트를 참고하세요.

4. 결론

이번 포스트에서는 Istio Ambient Mesh에 대해 알아보고, Kubernetes 클러스터에 설치하는 방법을 알아봤습니다. Istio Ambient Mesh의 특징과 구성 요소를 알아보고, Istioctl을 활용해 클러스터에 설치하는 방법, 레이블을 통해 클러스터의 Pod를 Ambient Mesh에 포함하는 방법을 알아봤습니다.

Istio Ambient Mesh는 기존 Sidecar 방식과 달리 모든 Pod에 Sidecar가 구성될 필요가 없어 적은 리소스 사용량으로도 Service Mesh의 특징인 mTLS 적용 및 L4(기본 Ztunnel)/L7(Waypoint Proxy) 인증과 원격 측정 데이터(telemetry)를 활용할 수 있습니다.

운영 중인 클러스터에 Service Mesh 도입을 고민 중이신가요? NGINX STORE를 통해 문의해 Istio 기술 지원 서비스에 대해 상담해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required