Istio Ambient Mesh 적용과 NGINX Plus Ingress Controller 연동

Istio Ambient Mesh 는 기존 Sidecar 기반 Service Mesh 구조를 개선하기 위해 등장한 새로운 데이터 플레인 아키텍처입니다. 기존 Istio에서는 각 Pod에 Envoy Sidecar Proxy를 배포하여 트래픽을 처리했지만, Ambient Mesh에서는 Sidecar를 제거하고 노드 단위 프록시인 ztunnel을 통해 서비스 간 트래픽을 처리합니다.
이러한 구조를 통해 Pod 리소스 오버헤드를 줄이면서도 서비스 간 통신에 대해 mTLS 기반 암호화와 인증을 적용할 수 있습니다.

Kubernetes 환경에서는 일반적으로 Ingress Controller가 외부 트래픽을 받아 내부 서비스로 전달하게 되는데, Ambient Mesh 환경에서는 Ingress Controller와 백엔드 서비스 사이의 트래픽 역시 mTLS로 보호할 수 있습니다.

이번 포스트에서는 NGINX Plus Ingress Controller와 Istio Ambient Mesh를 연동하여 Ingress Controller와 Backend Pod 간 트래픽에 mTLS가 적용되는지 확인하는 과정을 살펴봅니다.

Istio Ambient Mesh의 구조와 설치 과정에 대한 자세한 내용은 아래 포스트를 참고할 수 있습니다. 해당 포스트는 이전 버전의 Istio Ambient Mesh 기준으로 작성되었지만 Istio Ambient Mesh의 기본 아키텍처와 동작 원리를 이해하는 데 도움이 됩니다.

목차

1. Istio Ambient Mesh 개요
2. 환경/버전 정보
3. 테스트 환경 구성
4. Istio Ambient Mesh 통합 및 mTLS 확인
5. 결론

1. Istio Ambient Mesh 개요

Istio는 Kubernetes 환경에서 서비스 간 통신을 제어하고 보안을 적용하기 위한 Service Mesh 플랫폼입니다. 기존 Istio는 각 Pod에 Envoy Sidecar Proxy를 배포하는 Sidecar 기반 아키텍처를 사용하여 서비스 간 트래픽을 제어합니다.

Sidecar 방식은 서비스 간 통신에 대해 mTLS, 트래픽 제어, 관측성 기능을 제공할 수 있다는 장점이 있지만, 모든 Pod에 Proxy가 추가되기 때문에 리소스 사용량 증가와 운영 복잡도가 발생할 수 있습니다.

이러한 문제를 개선하기 위해 등장한 구조가 Istio Ambient Mesh입니다.

Ambient Mesh에서는 노드 단위 프록시인 ztunnel이 Pod 간 트래픽을 처리하며, 서비스 간 통신은 HBONE(HTTP-Based Overlay Network Environment) 프로토콜을 통해 전달됩니다. HBONE은 mTLS 기반 터널링을 사용하기 때문에 서비스 간 트래픽은 네트워크 구간에 관계없이 암호화됩니다.

또한 동일한 노드에 배포된 Pod 간 통신이라 하더라도 트래픽은 직접 Pod 간 연결되는 것이 아니라 노드의 ztunnel을 경유하여 처리됩니다. 이 과정에서 HBONE 터널을 통해 mTLS가 적용되므로 노드 내부 통신 역시 암호화된 형태로 전달됩니다.

이러한 구조 덕분에 Ambient Mesh는 기존 Sidecar 방식과 동일한 보안 수준을 유지하면서도 Pod 단위 Proxy 배포 없이 서비스 간 통신을 보호할 수 있습니다.

Ambient Mesh의 주요 특징은 다음과 같습니다.

  • Pod에 Sidecar Proxy를 배포하지 않는 Sidecar-less 아키텍처
  • 노드 단위 프록시(ztunnel)를 통한 서비스 간 트래픽 처리
  • HBONE 기반 터널링을 통한 mTLS 통신
  • 기존 Service Mesh 기능을 유지하면서 리소스 오버헤드 감소
항목Sidecar MeshAmbient Mesh
Proxy 배포Pod 단위Node 단위
리소스 사용높음낮음
mTLS지원지원
데이터 플레인Envoy Sidecarztunnel

2. 환경/버전 정보

구성 요소버전
Kubernetesv1.32.2
Istio1.28.3 (ambient)
Gateway APIv1.3.0
NGINX Plus Ingress Controller5.3.4

3. 테스트 환경 구성

테스트 환경 구성을 위해 devopssong, ambient-apps 네임스페이스를 사용했으며, devopssong 네임스페이스에는 NGINX Plus Ingress Controller, ambient-apps는 백엔드 애플리케이션인 Bookinfo를 배포했습니다.

두 네임스페이스를 모두 Ambient Mesh에 포함시키기 위해 istio.io/dataplane-mode=ambient 레이블을 추가합니다.

$ kubectl label ns ambient-apps istio.io/dataplane-mode=ambient
namespace/ambient-apps labeled
$ kubectl label ns devopssong istio.io/dataplane-mode=ambient
namespace/devopssong labeled
$ kubectl get ns ambient-apps devopssong --show-labels
NAME STATUS AGE LABELS
ambient-apps Active 26d istio.io/dataplane-mode=ambient,kubernetes.io/metadata.name=ambient-apps
devopssong Active 343d istio.io/dataplane-mode=ambient,kubernetes.io/metadata.name=devopssong

테스트 애플리케이션인 Bookinfo를 ambient-apps 네임스페이스에 배포합니다.

bookinfo.yaml

$ kubectl apply -f bookinfo.yaml -n ambient-apps
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
$ kubectl get po -n ambient-apps
NAME READY STATUS RESTARTS AGE
details-v1-766844796b-8776f 1/1 Running 0 6h21m
productpage-v1-54bb874995-xl5lw 1/1 Running 0 6h21m
ratings-v1-5dc79b6bcd-m9wjs 1/1 Running 0 6h21m
reviews-v1-598b896c9d-k7wrp 1/1 Running 0 6h21m
reviews-v2-556d6457d-c9dhp 1/1 Running 0 6h21m
reviews-v3-564544b4d6-k6pbx 1/1 Running 0 6h21m
$ kubectl get svc -n ambient-apps
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.108.151.163 <none> 9080/TCP 35s
productpage ClusterIP 10.101.223.228 <none> 9080/TCP 33s
ratings ClusterIP 10.101.85.71 <none> 9080/TCP 34s
reviews ClusterIP 10.100.236.15 <none> 9080/TCP 34s

devopssong 네임스페이스에는 NGINX Plus Ingress Controller Pod를 배포했습니다. 외부 클라이언트가 NGINX Plus Ingress Controller로 전송하는 요청은 ztunnel을 경유하지 않도록 하기 위해 ambient.istio.io/bypass-inbound-capture: true annotation을 추가합니다.

$ kubectl get po -l app.kubernetes.io/name=nginx-ingress -n devopssong
NAME READY STATUS RESTARTS AGE
nic-ambient-nginx-ingress-controller-5b7454cd75-8mwpr 1/1 Running 0 151m
$ kubectl describe po nic-ambient-nginx-ingress-controller-5b7454cd75-8mwpr | grep Annotation
Annotations: ambient.istio.io/bypass-inbound-capture: true

외부 클라이언트의 요청은 LoadBalancer service를 통해 NGINX Plus Ingress Controller Pod로 전달됩니다.

$ kubectl get svc -n devopssong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nic-ambient-nginx-ingress-controller LoadBalancer 10.102.113.79 192.168.40.72 80:31513/TCP,443:30711/TCP 163m

NGINX Plus Ingress Controller가 샘플 애플리케이션 Pod로 라우팅 할 수 있도록 VirtualServer를 배포합니다.

bookinfo-vs.yaml
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: bookinfo
namespace: ambient-apps
spec:
host: bookinfo.devopssong.site
upstreams:
- name: productpage
service: productpage
port: 9080
routes:
- path: =/productpage
action:
pass: productpage
- path: /static
action:
pass: productpage
- path: =/login
action:
pass: productpage
- path: =/logout
action:
pass: productpage
- path: /api/v1/products
action:
pass: productpage
$ kubectl apply -f bookinfo-vs.yaml -n ambient-apps
virtualserver.k8s.nginx.org/bookinfo created
$ kubectl get virtualservers.k8s.nginx.org -n ambient-apps bookinfo
NAME STATE HOST IP PORTS AGE
bookinfo Valid bookinfo.devopssong.site 17s

브라우저를 통해 샘플 애플리케이션을 확인할 수 있습니다.

Istio Ambient Mesh 샘플 애플리케이션

4. Istio Ambient Mesh 통합 및 mTLS 확인

istioctl 명령어를 사용하면 각 Pod가 Ambient Mesh에 포함되어 HBONE 프로토콜을 통해 통신하는지 확인할 수 있습니다.

$ istioctl ztunnel-config workload | grep HBONE
NAMESPACE POD NAME ADDRESS NODE WAYPOINT PROTOCOL
ambient-apps details-v1-766844796b-8776f 10.0.14.183 workernode2 None HBONE
ambient-apps productpage-v1-54bb874995-xl5lw 10.0.14.147 workernode2 None HBONE
ambient-apps ratings-v1-5dc79b6bcd-m9wjs 10.0.14.84 workernode2 None HBONE
ambient-apps reviews-v1-598b896c9d-k7wrp 10.0.14.66 workernode2 None HBONE
ambient-apps reviews-v2-556d6457d-c9dhp 10.0.14.15 workernode2 None HBONE
ambient-apps reviews-v3-564544b4d6-k6pbx 10.0.14.48 workernode2 None HBONE
devopssong nic-ambient-nginx-ingress-controller-5b7454cd75-8mwpr 10.0.14.215 workernode2 None HBONE

위 결과를 통해 Backend Pod뿐만 아니라 NGINX Plus Ingress Controller Pod 역시 Ambient Mesh에 포함되어 HBONE 기반 통신을 사용하고 있는 것을 확인할 수 있습니다.

등록되지 않은 Pod는 아래와 같이 TCP 프로토콜로 표시됩니다.

$ istioctl ztunnel-config workload | grep -v HBONE
NAMESPACE POD NAME ADDRESS NODE WAYPOINT PROTOCOL
application coffee-7f79fbb77c-vdt9q 10.0.27.24 workernode3 None TCP

Ambient Mesh에 등록된 Pod들은 Service Account 기반으로 발급된 SPIFFE 인증서를 통해 mTLS 인증을 수행합니다.
SPIFFE는 서비스 간 인증을 위해 사용되는 워크로드 ID 표준으로, Kubernetes 환경에서는 Service Account를 기반으로 ID가 생성됩니다.

각 Pod에 대한 인증서는 해당 노드에 배포된 ztunnel을 통해 관리되며 다음 명령어를 통해 확인할 수 있습니다.

$ istioctl ztunnel-config certificate --node workernode2
CERTIFICATE NAME TYPE STATUS VALID CERT SERIAL NUMBER NOT AFTER NOT BEFORE
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-details Leaf Available true bf9f6f2074c7fa6ebb3288f913094c3d 2026-03-07T00:04:13Z 2026-03-06T00:02:13Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-details Root Available true 14ab754efcfc37c1c1677035d0015aa8 2035-12-07T08:41:38Z 2025-12-09T08:41:38Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-productpage Leaf Available true 4a008fc3f28c94944501112398759ada 2026-03-07T00:03:18Z 2026-03-06T00:01:18Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-productpage Root Available true 14ab754efcfc37c1c1677035d0015aa8 2035-12-07T08:41:38Z 2025-12-09T08:41:38Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-ratings Leaf Available true eb1da6139bbd210308406813f9f47a30 2026-03-07T00:03:49Z 2026-03-06T00:01:49Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-ratings Root Available true 14ab754efcfc37c1c1677035d0015aa8 2035-12-07T08:41:38Z 2025-12-09T08:41:38Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-reviews Leaf Available true e029e7272c64c49559691539121a0058 2026-03-07T00:02:40Z 2026-03-06T00:00:40Z
spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-reviews Root Available true 14ab754efcfc37c1c1677035d0015aa8 2035-12-07T08:41:38Z 2025-12-09T08:41:38Z
spiffe://cluster.local/ns/devopssong/sa/nic-ambient-nginx-ingress Leaf Available true 9cf437f88b5e62298ffa7d3afea37e06 2026-03-07T02:49:54Z 2026-03-06T02:47:54Z
spiffe://cluster.local/ns/devopssong/sa/nic-ambient-nginx-ingress Root Available true 14ab754efcfc37c1c1677035d0015aa8 2035-12-07T08:41:38Z 2025-12-09T08:41:38Z

이를 통해 Ambient Mesh에 포함된 각 서비스가 Service Account 기반 SPIFFE ID를 사용하여 인증서를 발급받고 있으며, 해당 인증서를 기반으로 서비스 간 mTLS 통신이 이루어지고 있음을 확인할 수 있습니다.

외부 클라이언트를 통해 트래픽을 NGINX Plus Ingress Controller를 거쳐서 백엔드 애플리케이션으로 전송하고, ztunnel의 로그를 확인하면 두 Pod 사이의 통신이 ztunnel을 통해 이루어지는 것을 확인할 수 있습니다.

$ kubectl get po -n istio-system ztunnel-5dwvs -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ztunnel-5dwvs 1/1 Running 0 27d 10.0.14.144 workernode2 <none> <none>
$ kubectl logs -n istio-system ztunnel-5dwvs | grep nic
......
2026-03-06T07:53:14.717192Z info access connection complete src.addr=10.0.14.215:54478 src.workload="nic-ambient-nginx-ingress-controller-5b7454cd75-8mwpr" src.namespace="devopssong" src.identity="spiffe://cluster.local/ns/devopssong/sa/nic-ambient-nginx-ingress" dst.addr=10.0.14.147:15008 dst.hbone_addr=10.0.14.147:9080 dst.workload="productpage-v1-54bb874995-xl5lw" dst.namespace="ambient-apps" dst.identity="spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-productpage" direction="outbound" bytes_sent=849 bytes_recv=220 duration="7ms"
2026-03-06T07:53:14.717742Z info access connection complete src.addr=10.0.14.215:44430 src.workload="nic-ambient-nginx-ingress-controller-5b7454cd75-8mwpr" src.namespace="devopssong" src.identity="spiffe://cluster.local/ns/devopssong/sa/nic-ambient-nginx-ingress" dst.addr=10.0.14.147:15008 dst.hbone_addr=10.0.14.147:9080 dst.service="productpage.ambient-apps.svc.cluster.local" dst.workload="productpage-v1-54bb874995-xl5lw" dst.namespace="ambient-apps" dst.identity="spiffe://cluster.local/ns/ambient-apps/sa/bookinfo-productpage" direction="inbound" bytes_sent=220 bytes_recv=849 duration="7ms"

src.workload를 통해 요청을 전송한 NGINX Plus Ingress Controller Pod, dst.workload를 통해 요청을 수신하는 백엔드 Pod 정보를 확인할 수 있으며, identity를 통해 SPIFFE 인증서를 확인할 수 있습니다.
현재는 두 Pod 모두 동일 노드에 배포되어, direction의 값이 outbound와 inbound인 로그를 모두 확인할 수 있습니다.

Kiali 대시보드를 통해 두 Pod 사이의 통신이 mTLS 인증을 통해 이루어짐을 확인할 수 있으며, SPIFFE 인증서 정보도 확인할 수 있습니다.

5. 결론

이번 포스트에서는 Kubernetes 환경에서 NGINX Plus Ingress Controller를 Istio Ambient Mesh와 연동하는 방법과, Ingress Controller와 Backend Pod 사이의 트래픽에 mTLS가 적용되는지 확인하는 과정을 살펴보았습니다.

기존 Istio의 Sidecar 기반 Service Mesh 구조에서는 각 Pod에 Envoy Proxy가 배포되기 때문에 리소스 사용량 증가와 운영 복잡도가 발생할 수 있습니다. 반면 Ambient Mesh는 노드 단위 프록시인 ztunnel을 통해 트래픽을 처리하는 Sidecar-less 아키텍처를 사용하여 이러한 오버헤드를 줄일 수 있습니다.

이번 테스트 환경에서는 NGINX Plus Ingress Controller와 Backend 애플리케이션을 Ambient Mesh에 포함시킨 뒤 다음과 같은 방법을 통해 서비스 간 보안 통신이 이루어지는 것을 확인했습니다.

  • istioctl 명령어를 통해 Pod 간 통신이 HBONE 프로토콜 기반으로 처리되는지 확인
  • ztunnel에서 관리되는 SPIFFE 기반 인증서 발급 상태 확인
  • ztunnel 로그를 통해 Ingress Controller와 Backend Pod 사이의 트래픽이 ztunnel을 경유하여 처리되는지 확인
  • Kiali 대시보드를 통한 추가 확인

이를 통해 NGINX Plus Ingress Controller에서 Backend 서비스로 전달되는 트래픽 역시 Ambient Mesh 내부에서 mTLS 기반으로 암호화되어 전달되는 것을 확인할 수 있었습니다.

Ambient Mesh는 기존 Service Mesh가 제공하던 서비스 간 인증, 암호화, 트래픽 제어 기능을 유지하면서도 Pod 단위 Proxy 배포 없이 서비스 간 통신을 보호할 수 있는 구조를 제공합니다. 이러한 특성 덕분에 대규모 Kubernetes 환경에서도 비교적 낮은 운영 부담으로 Service Mesh를 적용할 수 있습니다.

향후 Ambient Mesh 환경에서는 Waypoint Proxy를 활용하여 L7 정책 제어를 적용하거나, Gateway API와 연동하여 보다 다양한 트래픽 제어 및 보안 정책을 구현할 수 있습니다.

Istio Ambient Mesh와도 통합하여 사용이 가능한 NGINX Plus Ingress Controller를 체험해 보고 싶으시다면, NGINX STORE를 통해 문의하여 무료로 NGINX One trial을 통해 NGINX Plus Ingress Controller를 체험해 보세요.

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

* indicates required