Ssoon
[9์ฃผ์ฐจ] Ambient Mode : Ztunnel ํธ๋ํฝ ๋ฆฌ๋๋ ์ ๋ณธ๋ฌธ
[9์ฃผ์ฐจ] Ambient Mode : Ztunnel ํธ๋ํฝ ๋ฆฌ๋๋ ์
๊ตฌ๊ตฌ๋ฌ์ค 2025. 6. 3. 19:11๐ ztunnel Traffic Redirection ์ฝ๊ฒ ์ดํดํ๊ธฐ
- Istio์ ambient mesh์์ ztunnel์ ๋คํธ์ํฌ ํธ๋ํฝ์ ๊ด๋ฆฌํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
๐ ๏ธ Traffic Redirection์ด๋?
- Ambient mesh์์ traffic redirection์ pod๋ก ๋ค์ด์ค๊ฑฐ๋ ๋๊ฐ๋ ํธ๋ํฝ์ ztunnel proxy๋ก ๋ณด๋ด๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ztunnel์ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ ์ํธํํ๊ณ ์ ์ฑ ์ ์ ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณด์์ด ๊ฐํ๋๋ฉฐ, ztunnel์ ์ฐํํ๋ฉด ์ ์ฑ ๋ ์ฐํ๋ ์ ์์ผ๋ฏ๋ก ์ด ๊ณผ์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Traffic redirection์
pod ํธ๋ํฝ์ ztunnel๋ก ๋ณด๋ด ์ํธํ์ ์ ์ฑ ์ ์ฉ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐งฉ In-Pod Traffic Redirection ๋ชจ๋ธ
- Ambient mesh์์๋ pod ๋ด๋ถ์์ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ๋ ๋ฐฉ์์ผ๋ก redirection์ด ์ด๋ฃจ์ด์ง๋๋ค. ์ด ๊ณผ์ ์ istio-cni node agent์ ztunnel proxy๊ฐ ํ๋ ฅํ์ฌ ์ํ๋ฉ๋๋ค. ์ด ๋ชจ๋ธ์ ์ฅ์ ์ ๊ธฐ์กด Kubernetes CNI ํ๋ฌ๊ทธ์ธ๊ณผ ์ถฉ๋ ์์ด ๋์ํ๋ค๋ ์ ์ ๋๋ค.
๐ ๏ธ Pod๊ฐ Mesh์ ์ถ๊ฐ๋๋ ๊ณผ์
- istio-cni๊ฐ pod ์์ฑ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , pod๊ฐ ambient mesh์ ์ํ๋์ง ํ์ธํฉ๋๋ค.
- istio-cni๊ฐ pod์ ๋คํธ์ํฌ namespace์ ๋ค์ด๊ฐ ๋ฆฌ๋ค์ด๋ ์ ๊ท์น์ ์ค์ ํฉ๋๋ค.
- ztunnel์ด pod์ ๋คํธ์ํฌ namespace์์ ํฌํธ(15008, 15006, 15001)๋ฅผ ์ด๊ณ ํธ๋ํฝ์ ์ฒ๋ฆฌํฉ๋๋ค
- Istio Ambient Mesh์์ ์๋ก์ด Pod๊ฐ ์์ฑ๋์์ ๋, Istio CNI์ ztunnel์ด ์ด๋ป๊ฒ ๊ทธ Pod์ ํธ๋ํฝ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ค์ ํ๋์ง๋ฅผ ์ค๋ช
๐ Pod๊ฐ ์๋ก ์๊ธฐ๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊น์?
- istio-cni๊ฐ ์ Pod๋ฅผ ๊ฐ์งํด์
๐ “์ค! Ambient Mesh ๋ผ๋ฒจ์ด ๋ถ์ Pod๊ฐ ์๊ฒผ๋ค?” - ๋คํธ์ํฌ ์กฐ์ ์์
์์!
- istio-cni๊ฐ ํด๋น Pod์ ๋คํธ์ํฌ ๊ณต๊ฐ์ผ๋ก ๋ค์ด๊ฐ์:
๐ “iptables๋ก ํธ๋ํฝ์ ztunnel๋ก ๋ณด๋ด๊ฒ ์ค์ ํด์ค๊ฒ์!”
- istio-cni๊ฐ ํด๋น Pod์ ๋คํธ์ํฌ ๊ณต๊ฐ์ผ๋ก ๋ค์ด๊ฐ์:
- ztunnel์๊ฒ ์๋ฆผ
- istio-cni๊ฐ ztunnel์๊ฒ ์๋ ค์ค์:
๐ “์ด Pod์ ํธ๋ํฝ์ ์ฒ๋ฆฌํ ์ค๋น ํด์ค!”
- istio-cni๊ฐ ztunnel์๊ฒ ์๋ ค์ค์:
- ztunnel์ด ์ค๋น ์๋ฃ
- ztunnel์ ๊ทธ Pod ์์ ๋ค์ด๊ฐ์ “๋ฆฌ์ค๋ ์์ผ”์ ๋ง๋ค์ด์.
๐ “์ด์ ์ด Pod์ ๋ชจ๋ ํธ๋ํฝ์ ๋ด๊ฐ ๋ฐ์ ์ ์์ด!”
- ztunnel์ ๊ทธ Pod ์์ ๋ค์ด๊ฐ์ “๋ฆฌ์ค๋ ์์ผ”์ ๋ง๋ค์ด์.
istio-cni์ ztunnel์ด ํ๋ ฅํ์ฌ pod ํธ๋ํฝ์ ๋ฆฌ๋ค์ด๋ ์ ํฉ๋๋ค.
๐ ๏ธ ํธ๋ํฝ ํ๋ฆ
- Pod ๊ฐ ํธ๋ํฝ์ ztunnel์ ๊ฑฐ์ณ mTLS๋ก ์ํธํ๋ HBONE ํฐ๋์ ํตํด ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด pod๋ ๋ณด์ ์ ์ฑ ์ ์ ์ฉ๋ฐ์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฅผ ์ ํ ์ธ์งํ์ง ์์๋ ๋ฉ๋๋ค.
- Istio Ambient Mesh์์ ztunnel์ด ํธ๋ํฝ์ ์ด๋ป๊ฒ ๊ฐ๋ก์ฑ๊ณ ์ฒ๋ฆฌํ๋์ง ์ค๋ช
๐ฉ 1. ๋ค์ด์ค๋ ํธ๋ํฝ (Inbound) - ์: ๋๊ตฐ๊ฐ ๋ด ์ฑ์ ํธ์ถํ ๋
๋์: Destination Workload Pod
- ์ธ๋ถ์์ Pod๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ๋จผ์ 15008 ํฌํธ๋ฅผ ํ๊ณ ztunnel๋ก ๋์ฐฉํด์.
- iptables๊ฐ ์ด ํธ๋ํฝ์ ztunnel ๋ด๋ถ๋ก ๋ณด๋ด์ "๋์ฝ๋ฉ/์ ์ฑ ํ์ธ" ๋ฑ์ ํ๊ฒ ํด์.
- ztunnel์ ํธ๋ํฝ์ ์ง์ง ์ฑ์ด ์ฌ์ฉํ๋ ํฌํธ (์: 80๋ฒ ํฌํธ)๋ก ๋ณด๋ด์.
โก๏ธ ์์ฝ: ๋ค์ด์ค๋ ํธ๋ํฝ์ ๋จผ์ ztunnel์ ๊ฑฐ์ณ์ ์ฑ์ผ๋ก ์ ๋ฌ๋จ
๐ฆ 2. ๋๊ฐ๋ ํธ๋ํฝ (Outbound) - ์: ๋ด ์ฑ์ด ์ธ๋ถ๋ก ํธ์ถํ ๋
๋์: Source Workload Pod
- ์ฑ์์ ์ธ๋ถ๋ก ๋๊ฐ๋ ํธ๋ํฝ์ด ์๊ธฐ๋ฉด, iptables๊ฐ ๊ทธ๊ฑธ 15001 ztunnel ํฌํธ๋ก ๋ฆฌ๋ค์ด๋ ์ ํด์.
- ztunnel์ ๊ทธ ํธ๋ํฝ์ ์ํธํ(encap) ์ฒ๋ฆฌ ๋ฑ์ ํ๊ณ ,
- ์ธ๋ถ(์: 5151 ํฌํธ๋ก ํต์ ํ๋ ์๋น์ค)๋ก ์์ ํ๊ฒ ๋ณด๋ ๋๋ค.
โก๏ธ ์์ฝ: ๋๊ฐ๋ ํธ๋ํฝ๋ ztunnel์ ๊ฑฐ์ณ์ผ ์ธ๋ถ๋ก ๋๊ฐ ์ ์์
ํธ๋ํฝ์ ztunnel์ ํตํด mTLS๋ก ์ํธํ๋์ด ์์ ํ๊ฒ ์ ๋ฌ๋ฉ๋๋ค.
๐ต๏ธโ๏ธ Traffic Redirection ๋๋ฒ๊น ๋ฐฉ๋ฒ
- Traffic redirection์ด ์ ๋๋ก ์๋ํ์ง ์์ ๊ฒฝ์ฐ, ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ztunnel ๋ก๊ทธ ํ์ธ
- ztunnel ๋ก๊ทธ๋ฅผ ํ์ธํ๋ฉด pod๊ฐ mesh์ ์ถ๊ฐ๋์๋์ง, ๋ฆฌ๋ค์ด๋ ์ ์ด ํ์ฑํ๋์๋์ง ์ ์ ์์ต๋๋ค.
kubectl logs ds/ztunnel -n istio-system | grep inpod
Found 3 pods, using pod/ztunnel-hl94n
inpod_enabled: true
inpod_uds: /var/run/ztunnel/ztunnel.sock
inpod_port_reuse: true
inpod_mark: 1337
2024-02-21T22:01:49.916037Z INFO ztunnel::inpod::workloadmanager: handling new stream
2024-02-21T22:01:49.919944Z INFO ztunnel::inpod::statemanager: pod WorkloadUid("1e054806-e667-4109-a5af-08b3e6ba0c42") received netns, starting proxy
2024-02-21T22:01:49.925997Z INFO ztunnel::inpod::statemanager: pod received snapshot sent
2024-02-21T22:03:49.074281Z INFO ztunnel::inpod::statemanager: pod delete request, draining proxy
2024-02-21T22:04:58.446444Z INFO ztunnel::inpod::statemanager: pod WorkloadUid("1e054806-e667-4109-a5af-08b3e6ba0c42") received netns, starting proxy
- ๋ก๊ทธ์์ inpod_enabled: true์ ๊ฐ์ ๋ฉ์์ง๊ฐ ๋ณด์ด๋ฉด ๋ฆฌ๋ค์ด๋ ์ ์ด ํ์ฑํ๋ ๊ฒ์ ๋๋ค.
ztunnel ๋ก๊ทธ๋ก ๋ฆฌ๋ค์ด๋ ์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์์ผ ์ํ ํ์ธ
- ํฌํธ 15001, 15006, 15008์ด ์ด๋ ค ์๋์ง ํ์ธํฉ๋๋ค.
kubectl debug $(kubectl get pod -l app=curl -n ambient-demo -o jsonpath='{.items[0].metadata.name}') -it -n ambient-demo --image nicolaka/netshoot -- ss -ntlp
Defaulting debug container name to debugger-nhd4d.
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 127.0.0.1:15080 0.0.0.0:*
LISTEN 0 128 *:15006 *:*
LISTEN 0 128 *:15001 *:*
LISTEN 0 128 *:15008 *:*
- ์ถ๋ ฅ์์ ํด๋น ํฌํธ๊ฐ LISTEN ์ํ์ธ์ง ํ์ธํ์ธ์.
์์ผ ์ํ๋ฅผ ํ์ธํด ztunnel ํฌํธ๊ฐ ์ด๋ ค ์๋์ง ์ ๊ฒํฉ๋๋ค.
iptables ๊ท์น ํ์ธ
- Pod ๋ด๋ถ์ iptables ๊ท์น์ ํ์ธํด ํธ๋ํฝ ๋ฆฌ๋ค์ด๋ ์ ์ค์ ์ ์ ๊ฒํฉ๋๋ค.
$ kubectl debug $(kubectl get pod -l app=curl -n ambient-demo -o jsonpath='{.items[0].metadata.name}') -it --image gcr.io/istio-release/base --profile=netadmin -n ambient-demo -- iptables-save
Defaulting debug container name to debugger-m44qc.
# Generated by iptables-save
*mangle
:PREROUTING ACCEPT [320:53261]
:INPUT ACCEPT [23753:267657744]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [23352:134432712]
:POSTROUTING ACCEPT [23352:134432712]
:ISTIO_OUTPUT - [0:0]
:ISTIO_PRERT - [0:0]
-A PREROUTING -j ISTIO_PRERT
-A OUTPUT -j ISTIO_OUTPUT
-A ISTIO_OUTPUT -m connmark --mark 0x111/0xfff -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A ISTIO_PRERT -m mark --mark 0x539/0xfff -j CONNMARK --set-xmark 0x111/0xfff
-A ISTIO_PRERT -s 169.254.7.127/32 -p tcp -m tcp -j ACCEPT
-A ISTIO_PRERT ! -d 127.0.0.1/32 -i lo -p tcp -j ACCEPT
-A ISTIO_PRERT -p tcp -m tcp --dport 15008 -m mark ! --mark 0x539/0xfff -j TPROXY --on-port 15008 --on-ip 0.0.0.0 --tproxy-mark 0x111/0xfff
-A ISTIO_PRERT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ISTIO_PRERT ! -d 127.0.0.1/32 -p tcp -m mark ! --mark 0x539/0xfff -j TPROXY --on-port 15006 --on-ip 0.0.0.0 --tproxy-mark 0x111/0xfff
COMMIT
# Completed
# Generated by iptables-save
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [175:13694]
:POSTROUTING ACCEPT [205:15494]
:ISTIO_OUTPUT - [0:0]
-A OUTPUT -j ISTIO_OUTPUT
-A ISTIO_OUTPUT -d 169.254.7.127/32 -p tcp -m tcp -j ACCEPT
-A ISTIO_OUTPUT -p tcp -m mark --mark 0x111/0xfff -j ACCEPT
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -j ACCEPT
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -p tcp -m mark ! --mark 0x539/0xfff -j REDIRECT --to-ports 15001
COMMIT
- ์ถ๋ ฅ์์ ํธ๋ํฝ์ด ํฌํธ 15008(HBONE), 15006(plaintext), 15001(egress)๋ก ๋ฆฌ๋ค์ด๋ ์ ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
iptables ๊ท์น์ผ๋ก ํธ๋ํฝ ๋ฆฌ๋ค์ด๋ ์ ์ค์ ์ ํ์ธํฉ๋๋ค.
๐ ํต์ฌ ์์ฝ
- Traffic redirection์ pod ํธ๋ํฝ์ ztunnel๋ก ๋ณด๋ด ์ํธํ์ ์ ์ฑ ์ ์ ์ฉํฉ๋๋ค.
- istio-cni์ ztunnel์ด ํ๋ ฅํ์ฌ pod์ ๋คํธ์ํฌ namespace์์ ๋ฆฌ๋ค์ด๋ ์ ์ ์ค์ ํฉ๋๋ค.
- ํธ๋ํฝ์ ztunnel์ ๊ฑฐ์ณ mTLS๋ก ์ํธํ๋ HBONE ํฐ๋๋ก ์ ๋ฌ๋ฉ๋๋ค.
- ๋๋ฒ๊น ์ ztunnel ๋ก๊ทธ, ์์ผ ์ํ, iptables ๊ท์น ํ์ธ์ผ๋ก ์งํํฉ๋๋ค.