Istio Ambient Mode on K3d
해당 포스팅은 현재 재직중인 회사에 관련이 없고, 개인 역량 개발을 위한 스터디 자료로 활용할 예정입니다.
이번 포스팅의 목적은 K3d 클러스터에 Istio Ambient 모드를 구성하고 기 본 개념을 이해하는 것이다.
Istio Ambient Mesh

위 그림처럼 Istio의 기본 구성으로 동작하는 사이드카(sidecar) 방식는 애플리케이션을 직접 리팩토링에 하는 것에 비해 상당한 이점이 있지만, 애플리케이션과 Istio 데이터 플레인을 완벽하게 분리하지는 못한다. 사이드카를 애플리케이션에 inject하려면 해당 Kubernetes 파드 스펙을 수정하고 파드 내에서 트래픽을 리디렉션(Redirect)해야 한다. 따라서 사이드카를 설치하거나 업그레이드하려면 애플리케이션 파드를 다시 시작해야 하므로 워크로드에 지장을 줄 수 있다. 그리고, 사이드카 프록시는 관련 워크로드 전용이므로 각 개별 파드의 사용량에 대비하여 CPU 및 메모리 리소스를 프로비저닝해야 한다. 이로 인해 대규모 리소스 예약(reservation)이 추가되어 클러스터 전체에서 리소스 활용도가 낮아질 수 있다. 일반적으로 Istio의 사이드카가 수행하는 트래픽 캡처 및 HTTP 처리는 계산 비용이 많이 발생하기도 하며 표준 형태가 아닌 HTTP 구현을 사용하는 일부 애플리케이션을 중단시킬 수 있다.
Istio는 기존에 사이드카를 사용하여 모든 데이터 플레인 기능을 구현했지만, 이는 모든 기능을 사용해야 하는 부담이 있었다. Istio는 각 파드에 사이드카를 배포하지 않도록 허용하는 Ambient 기능을 22 년에 소개했다. Ambient 모드에서 Istio는 CNI 역할을 하며 파드에서 들어오고 나가는 네트워크 트래픽을 가로채 여러가지 규칙을 적용하게 된다. Istio의 기능을 두 개의 계층으로 분리하여 필요에 따라 기능을 선택적으로 사용할 수 있도록 한다. 이를 통해 사용자는 Istio를 점진적으로 도입하고, 필요에 따라 보안 오버레이(overlay) 네트워크에서 L7 처리 방식으로 전환할 수 있다. 보안 오버레이라는 용어는 ztunnel 프록시를 통해 Ambient 메시에서 구현되는 일련의 L4 네트워킹 기능을 총칭하여 설명하는 데 사용된다. 사이드카의 수를 줄여 각 요청에 대한 L7 처리 단계 수를 줄임으로써 리소스 소비(CPU, 메모리)를 줄이고 Istio의 성능을 향상시키는 것이 주요 목적이다.

Ztunnel
Ambient 메시는 쿠버네티스 클러스터의 각 노드에 배포되어 실행되는 데몬셋 기반의 공유 에이전트인 Ztunnel을 사용한다. Ztunnel은 Ambient 메시에서 노드 프록시를 구현하기 위한 목적으로 기능 세트를 최소로하여 Ambient에 필요한 최소한의 요구 사항만 구현하는 것이다. ztunnel 프록시는 Rust로 작성되었으며 mTLS, 인증, L4 권한 부여, 원격 측정과 같은 L3 및 L4 기능을 처리하도록 의도적으로 범위가 설정되어 있다. ztunnel은 L3 및 L4 트래픽이 워크로드, 다른 ztunnel 프록시 또는 웨이포인트 프록시로 직접 효율적이고 안전하게 전 송되도록 보장한다.
ztunnel의 범위를 명시적으로 벗어난 기능은 다음과 같다.
- 사용자 HTTP 트래픽 종료
- 반복할 가치가 있는 사용자 HTTP 트래픽 종료
ext_authz, WASM, 연동 확장(linked-in extensions), Lua 등과 같은 일반적인 확장성
일반적으로 ztunnel은 일반적인 확장성 프록시를 목표로 하지 않으며, 이러한 작업에는 Envoy가 더 적합하다.
전송 계층에서는 HBONE이라는 HTTP CONNECT 기반 트래픽 터널링 프로토콜을 통해 구현된다.
Waypoint Proxy

위에서 이야기했듯이 L7 처리는 ztunnel에서 구현되지 않고 별도의 Waypoint Proxy 파드를 통해 진행된다. Waypoint Proxy는 사이드카 데이터 플레인 모드에 사용하는 것과 동일한 엔진인 Envoy 프록시를 사용한다. Waypoint Proxy는 애플리케이션 파드 외부에서 독립적으로 설치, 실행, 업그레이드 된다. 앰비언트 모드에서 Istio의 일부 사용 사례는 L4 보안 오버레이 기능만으로 해결될 수 있으며, L7 기능이 필요하지 않으므로 Waypoint Proxy를 배포할 필요가 없다. 고급 트래픽 관리 및 L7 네트워킹 기능이 필요한 경우는 Waypoint Proxy 배포가 필요하다.
Install Istio Ambient
간단하게 Istio Ambient 테스트를 진행하기 위해서 K3d 클러스터에서 ArgoCD를 사용하여 샘플 애플리케이션 배포를 진행한다. 최종적으로 구성하고자 하는 그림은 다음과 같이 4개의 노드에 각 컴포넌트를 배치하는 것이다. (그림 출처: https://istio.io/latest/blog/2023/traffic-for-ambient-and-sidecar/)

Prerequisites
- K3d Cluster 4 nodes(agents)
- kubectl
- ArgoCD Non-HA
- Docker 또는 Rancher Desktop
K3d 기반 Istion Ambient 설치
k3d는 기본적으로 Treaefik 프록시를 설치하게 되어 있지만 Istio는 자체적으로 Ingress Gateway와 같은 프록시 기능을 제공하기 때문에 충돌을 방지하기 위해 설치시 --k3s-arg "--disable=traefik@server:*" 옵션을 사용하여 Traefik을 비활성화할 수 있다.
$ k3d cluster create --api-port 6550 -p '9080:80@loadbalancer' -p '9443:443@loadbalancer' --agents 4 --k3s-arg '--disable=traefik@server:*'
INFO[0000] portmapping '9080:80' targets the loadbalancer: defaulting to [servers:*:proxy agents:*:proxy]
INFO[0000] portmapping '9443:443' targets the loadbalancer: defaulting to [servers:*:proxy agents:*:proxy]
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-k3s-default'
INFO[0000] Created image volume k3d-k3s-default-images
INFO[0000] Starting new tools node...
INFO[0000] Starting node 'k3d-k3s-default-tools'
INFO[0001] Creating node 'k3d-k3s-default-server-0'
INFO[0001] Creating node 'k3d-k3s-default-agent-0'
INFO[0001] Creating node 'k3d-k3s-default-agent-1'
INFO[0001] Creating node 'k3d-k3s-default-agent-2'
INFO[0001] Creating node 'k3d-k3s-default-agent-3'
INFO[0001] Creating LoadBalancer 'k3d-k3s-default-serverlb'
INFO[0001] Using the k3d-tools node to gather environment information
INFO[0001] HostIP: using network gateway 172.22.0.1 address
INFO[0001] Starting cluster 'k3s-default'
INFO[0001] Starting servers...
INFO[0001] Starting node 'k3d-k3s-default-server-0'
INFO[0004] Starting agents...
INFO[0004] Starting node 'k3d-k3s-default-agent-2'
INFO[0004] Starting node 'k3d-k3s-default-agent-0'
INFO[0004] Starting node 'k3d-k3s-default-agent-1'
INFO[0004] Starting node 'k3d-k3s-default-agent-3'
INFO[0013] Starting helpers...
INFO[0013] Starting node 'k3d-k3s-default-serverlb'
INFO[0020] Injecting records for hostAliases (incl. host.k3d.internal) and for 6 network members into CoreDNS configmap...
INFO[0022] Cluster 'k3s-default' created successfully!
INFO[0022] You can now use it like this:
kubectl cluster-info
Istio를 설치할 때 기본 Flannel CNI와 함께 k3d를 사용하는 경우에는, CNI 구성 및 바이너리에 표준이 아닌 위치를 사용하기 때문에 설치 명령에 몇 가지 값을 추가해야 한다.
$ istioctl install --set profile=ambient --set values.cni.cniConfDir=/var/lib/rancher/k3s/agent/etc/cni/net.d --set values.cni.cniBinDir=/bin
|\
| \
| \
| \
/|| \
/ || \
/ || \
/ || \
/ || \
/ || \
/______||__________\
____________________
\__ _____/
\_____/
This will install the Istio 1.23.2 "ambient" profile (with components: Istio core, Istiod, CNI, and Ztunnel) into the cluster. Proceed? (y/N) y
✔ Istio core installed ⛵️
✔ Istiod installed 🧠
✔ CNI installed 🪢
✔ Ztunnel installed 🔒
✔ Installation complete
Made this installation the default for cluster-wide operations.
The ambient profile has been installed successfully, enjoy Istio without sidecars!
설치가 완료된 이후의 클러스터의 istio 컴포넌트 점검 istioctl verify-install 명령을 통해 확인할 수 있다. 기본으로 배포가 되었기 때문에 특별한 옵션없이 점검을 수행하면 default 리비전만 점검을 수행한다.
$ istioctl verify-install
1 Istio control planes detected, checking --revision "default" only
✔ Deployment: istiod.istio-system checked successfully
... ## 중략
✔ CustomResourceDefinition: workloadgroups.networking.istio.io.istio-system checked successfully
Checked 14 custom resource definitions
Checked 1 Istio Deployments
Checked 2 Istio Daemonsets
✔ Istio is installed and verified successfully
ArgoCD 배포를 진행한다. Non-HA YAML 매니페스트를 사용하여 ArgoCD 최신버전(설치당시 2.12.6 버전)으로 배포를 진행한다.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.12.6/manifests/install.yaml
설치가 완료되고 ArgoCD 컴포넌트를 확인해보면 다음과 비슷하게 보일 것이다.
$ kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 12m
argocd-applicationset-controller-75d8c9495-fpd69 1/1 Running 0 12m
argocd-dex-server-7c9b44b9f9-wcmth 1/1 Running 1 (10m ago) 12m
argocd-notifications-controller-77f49c7745-jdq4p 1/1 Running 0 12m
argocd-redis-575c96bc4f-xvwrk 1/1 Running 0 12m
argocd-repo-server-7f44b474d7-r8n5m 1/1 Running 0 12m
argocd-server-5f4dd5d648-brghh 1/1 Running 0 12m
ArgoCD 패스워드를 변경하기 위해 bcrypt로 KANS로 암호화하고 argocd-secret 리소스를 patch한다. 참고로 encrypt는 https://bcrypt-generator.com/