[k8s] Service Proxy
๊ด๋ จ ํฌ์คํธ
https://blog.naver.com/sssang97/223084158042
์ฟ ๋ฒ์์ CNI๊ฐ Pod ๊ฐ์ ํต์ ์ ๋งค๊ฐํ๋ ์ญํ ์ ํ๋ค๋ฉด, Service Proxy๋ ๋ฆฌ์์ค๋ฅผ ๋ด๋ถ๋ ์ธ๋ถ ์ธํฐ๋ท์ผ๋ก ๊ฐ๋ฐฉํ๋ ์ญํ ์ ํ๋ค. ๋ ์ ํํ ๋งํ๋ฉด L4์์ Service์ IP ๋ ธ์ถ์ ๋ด๋นํ๋ค.
k8s์ ์ธ๋ถ ์คํ๋ค์ด ์ผ๋ ๊ทธ๋ ๋ฏ์ด, ์ด๊ฒ๋ ๋จ์ผ ๊ตฌํ์ฒด๊ฐ ์๋๋ผ ์ฌ๋ฌ๊ฐ์ง ์ ํ์ง๊ฐ ์๋ค.
์ด๋ค ๊ตฌํ์ฒด๋ค์ด ์๊ณ , ์ด๋ค ์์ผ๋ก ๊ฐ์ ๋์ํ๋์ง๋ฅผ ์ ๋ฆฌํด๋ณธ๋ค.
๊ธฐ๋ณธ ๋ ผ๋ฆฌ
Service์ ๊ธฐ๋ณธ์ ์ธ ๋ ผ๋ฆฌ๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
Service๋ก ๋ค์ด์จ ์์ฒญ์ Pod๋ก ๋ณํํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด ๊ณผ์ ์ L4, TCP/UDP ์์ค์์ ์ด๋ฃจ์ด์ง๋ค.
์๋ฅผ ๋ค์ด ์ ๊ทธ๋ฆผ์ฒ๋ผ A ์๋น์ค๊ฐ 192.168.0.100๋ก ๊ฐ๋ฐฉ๋์ด์๊ณ , A Service์๋ B๋ผ๋ Pod๊ฐ 10.0.0.2 IP๋ก ๋ถ์ด์๋ ์ํ์์ 192.168.0.100๋ก ์์ฒญ์ด ๋ค์ด์จ๋ค๋ฉด, kube-proxy๋ ๊ทธ๊ฑธ ๊ฐ๋ก์ฑ์ 10.0.0.2 pod๋ก ๋๊ธด๋ค.
์ด๊ฑธ ์ด๋ค ์ปค๋ ๊ธฐ๋ฅ์ ์จ์ ๋คํธ์ํฌ ํธ๋ํฝ์ ๋งค๊ฐํ ์ง๋ ๊ตฌํ์ฒด๋ง๋ค ๋ค๋ฅด๋ค.
kube-proxy
kube-proxy๋ ๋งค์ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ, ๋ง์ ์ฟ ๋ฒ ๋ฐฐํฌํ์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ Service Proxy๋ค.
์ด๊ฑด ๋์ ๋ฐฉ์์ด ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค. iptables๊ณผ IPVS, nftables ๋ฑ์ด๋ค.
๋จ์ํ๊ณ ์์ ์ฌ์ฉ์ฌ๋ก์์๋ iptables๋ก ์ถฉ๋ถํ์ง๋ง, ๋ณต์กํ ์ฌ์ฉ์ฌ๋ก๊ฐ ํ์ํ๋ค๋ฉด ๋ค๋ฅธ ๋ชจ๋๋ calico ๊ฐ์ ๋ค๋ฅธ proxy์ ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ค.
kube-proxy: iptables mode
์ด๊ฑด ์ค์๊ท๋ชจ์ ์ฌ์ฉ์ฌ๋ก์ ์ ํฉํ ํ๋ก์ ๋ชจ๋๊ณ , ์๋น์์ ๋ฐฐํฌํ์์ ๊ธฐ๋ณธ๊ฐ์ด๋ค. ๋ฆฌ๋ ์ค ์ปค๋์ iptables์ ์์กดํ๋ ์ง๊ด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค.
Service๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ณ๊ฒฝํ๋ฉด, kube-proxy๋ ๊ทธ๊ฑธ ๊ฐ์ํ๋ค๊ฐ ๊ฑฐ๊ธฐ์ ๋ง๋ iptable NAT rule์ ์์ฑํ๋ค. ๊ทธ๋ฌ๋ฉด ์ปค๋์ netfilter๊ฐ ์์์ ํจํท์ ๋งค์นญ์์ผ ํต๊ณผ์ํค๋ ๊ฒ์ด๋ค.
์ด ๋ฐฉ์์ ์ฅ์ ์, ์ปค๋ ๊ธฐ๋ฅ์ ์์กดํ๋ ๊ฒ์ด๋ผ ๋งค์ฐ ์์ ์ ์ด๊ณ ์์ ๊ท๋ชจ์์๋ ์ฑ๋ฅ๋ ๋์์ง ์๋ค๋ ๊ฒ์ด๋ค.
iptable ๋ช
๋ น๋ค์ ์ฌ์ฉํ๋ฉด ๋๋ฒ๊น
์ด๋ ๋ฌธ์ ํด๊ฒฐ๋ ๊ฐํธํ๊ฒ ํ ์ ์๋ค.
๋จ์ ์ ํ์ฅ์ ๋งค์ฐ ๋ถ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค. rule ์ถ๊ฐ/์ญ์ ์ ํจํท ์ ์ก ์์ชฝ์ ๋ณ๋ชฉ์ด ์๊ธด๋ค.
Service๋ Pod๊ฐ ๋ง์์ง๋ค๋ฉด ๊ทธ๋งํผ iptable rule์ด ๋์ด๋๋๊ฑด๋ฐ, ๊ฐ์์ ๋น๋กํด์ rule ์ถ๊ฐ ์ฑ๋ฅ์ด๋ ํจํท ์ ์ก ์๊ฐ์ด ๋๋ ค์ง๋ค. ํจํท์ ์ฒ๋ฆฌํ ๋๋ง๋ค ์ปค๋์ netfilter๊ฐ rule ๊ฐ์๋งํผ O(N) ๋ฃจํ๋ฅผ ๋๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒ๋ค๊ฐ rule์ ์ถ๊ฐํ๊ณ ์ญ์ ํ๋ ๊ฒ๋ ์์ง ์์ ๋ถํ๋ค.
rule์ 1๊ฐ ์ถ๊ฐํ๋ค๊ณ ํด์, ์ง์ง ๋จ์ํ๊ฒ 1๊ฐ๋ง ์ถ๊ฐํ๊ณ ๋์ด ์๋๋ค.
Global Lock์ ๊ฑด ๋ค์์ ๊ธฐ์กด ruleset์ ๋ค์ด๋ก๋ํ๊ณ , ์ธ๋ฉ๋ชจ๋ฆฌ์์ ์์ ํ ๋ค์ ๊ทธ๊ฑธ ์ปค๋์ ์ ์ฒด ์
๋ก๋ํ๋ ๋ฐฉ์์ด๋ค. ์
๋ก๋๊ฐ ๋๋๋ฉด ๊ทธ์ ์์ผ Global Lock์ ํผ๋ค. Lock์ผ๋ก ์ธํ ๋ธ๋กํน์ด ์ฌํ๋ค.
๊ทธ๋์ Service๊ฐ ์๋ฐฑ/์์ฒ ๋จ์๋ฅผ ๋์ด์๋ ๋๊ท๋ชจ ์ฌ์ฉ์ฌ๋ก์ ๊ฒฝ์ฐ์๋ ์ ํฉํ์ง ์๋ค.
kube-proxy: IPVS mode (deprecated)
IPVS (IP Virtual Server) ๋ชจ๋๋ iptables ๋ชจ๋์ ํ์ฅ์ฑ ํ๊ณ๋ฅผ ๊ฐ์ ํ๊ณ ์ ๋์จ ๋ฐฉ์์ด๋ค.
์ด IPVS๋ ์ฌ์ค ๋ฆฌ๋
์ค ์ปค๋์ ๋ด์ฅ๋ ๋ก๋๋ฐธ๋ฐ์ฑ์ฉ ์ปค๋ ๊ธฐ๋ฅ์ด๋ค. ์์ฒด ๊ตฌํ์ ์๋๋ค.
์ด ๋ฐฉ์์ด ํด๊ฒฐํ๊ณ ์ ํ๋ ๊ฒ์ iptables์ ๋ผ์ฐํ
๋ฐฉ์์ด ๋ฐฐ์ด ๊ธฐ๋ฐ์ O(N) ๋ณต์ก๋๋ผ๋ ๊ฒ์ด์๋ค.
ํ์ง๋ง IPVS๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ํฝ์ ๋ก๋๋ฐธ๋ฐ์ฑ์ ํด์ํ
์ด๋ธ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ค. ๊ทธ๋์ ์ด๋ก ์ ์ผ๋ก๋ O(1)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๊ทผ๋ฐ ๊ทธ๋ ๋ค๊ณ ํด์ iptables์ ์์ ํ ๋ฒ๋ฆฐ ๊ฒ์ ์๋์๋ค. ํจํท ํํฐ๋ง๊ณผ SNAT ๊ฐ์ ๋ณด์กฐ์ ์ธ ๋ถ๋ถ์๋ ์ฌ์ ํ iptables์ ์์ด์ผ๋ค.
ํ์ง๋ง IPVS + iptables + ipset์ ๋ณต์กํ ์ํคํ
์ฒ๋ก ์ธํด ์ ์ง๋ณด์ ๋ถ๋ด์ด ์ปธ๊ณ , ์๋ก์ด ๋คํธ์ํน ๊ธฐ๋ฅ๊ณผ์ ํตํฉ์ด ์ด๋ ค์์ ธ์, k8s v1.35(2025.12)๋ถํฐ deprecated ๋์๋ค.
์ดํ์๋ nftables๋ฅผ ๋น๋กฏํ eBPF ๊ธฐ๋ฐ ์๋ฃจ์
์ผ๋ก์ ์ ํ์ด ๊ถ์ฅ๋๋ค.
kube-proxy: nftables mode
nftables๋ kube-proxy์์ ์ฐจ์ธ๋๋ก ๋ฐ์ด์ฃผ๊ณ ์๋ ํ๋ก์ ๋ชจ๋๋ค.
๋์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ, ๊ธฐ์ ํตํฉ์ ์ฅ์ ์ผ๋ก ๋ด์ธ์ด๋ค.
์ด๊ฒ๋ ์์ง ๊ตฌํ์ ์๋๊ณ , nftable์ด๋ผ๋ ๋ฆฌ๋ ์ค ์ปค๋ ๊ธฐ๋ฅ์ ์์กดํ๋ค.
iptable์์ ๊ฐ์ฅ ์ฌ๊ฐํ๋ ๋ฌธ์ ๋, ๋ผ์ฐํ
rule์ ์ถ๊ฐํ ๋๋ง๋ค Lock์ ๊ฑด ์ฑ๋ก ์ ์ฒด rule์ ๋ค์ด๋ฐ๊ณ ์์ ํ ์ ์ฒด ruleset์ ์
๋ก๋ํ๋ ๋ฐฉ์์ด์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ nftables์์๋ incremantalํ rule update๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ์ด๋ฐ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์๋ค. ์๋ฌด๋ฆฌ ๋ง์๋ rule์ ์ถ๊ฐ๋ ์ญ์ ๋ O(1)๋ก ํฐ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
ํจํท ์ ์ก์์ rule lookup๋ ํด์ํ ์ด๋ธ ์กฐํ๋ผ์, O(1)์ผ๋ก ๋น ๋ฅด๋ค. IPVS์ ๊ฑฐ์ ๋น์ทํ๋ค.
Calico eBPF
calico๋ฅผ eBPF ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑํ ๊ฒฝ์ฐ, kube-proxy์ ์ญํ ์ ๋์ฒดํ ์ ์๋ค.
์ฌ์ฉ ๊ท๋ชจ๊ฐ ํฌ๊ฑฐ๋ ๊ธฐ์กด์ Calico๋ฅผ ๋ฉ์ธ์ ์ธ ๊ฒฝ์ฐ์ ๊ถ์ฅํ ๋งํ ์ต์
์ด ๋๋ค.
์ด๊ฑด BPF์ ๋ผ์ฐํ
rule๋ค์ ์ ์ฅํด๋๊ณ , eBPF ํ๋ก๊ทธ๋จ์ ํตํด ํจํท ์ ๋ฌ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ทจํ๋ค.
rule์ ์ถ๊ฐ/์ญ์ ์ ์กฐํ ๋ชจ๋ O(1) ๋ณต์ก๋์ ์ฑ๋ฅ์ ๋ฐํํ๋๋ฐ๋ค, ์ปค๋ ๊ณต๊ฐ์์ ์ง์ ํจํท ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ฏ๋ก ์ ์ -์ปค๋ ๊ฐ ์ปจํ
์คํธ ์ค์์นญ ์์ด ์ค๋ฒํค๋๋ฅผ ์ต์ํํ ์ ์๋ค.
Ingress Controller?
envoy, traefik, nginx ๊ฐ์ ๋ก๋๋ฐธ๋ฐ์ ๊ธฐ๋ฐ์ Ingress Controller๋ค๋ Service๋ฅผ ์ด์ด์ฃผ๋ ์ญํ ์ ํ๊ธด ํ์ง๋ง, ์ด๊ฑด ์๋ฐํ ๋งํ๋ฉด Service Proxy๊ฐ ์๋๋ค.
L7 ๊ธฐ๋ฐ์ ํ๋ก์ ์์คํ ์ด๊ณ , ์ค์ ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ด๋ถ์ ์ผ๋ก๋ kube-proxy ๊ฐ์ L4 ์๋น์ค ํ๋ก์๋ฅผ ํ๋ฒ ๋ ๊ฑฐ์ณ์ ๋์ํ๋ค. ํธ๋ํฝ ์ ์ก์ ์์ฒด์ ์ผ๋ก ์ฑ ์์ง๋ ๊ฒ์ ์๋๋ ๊ฒ์ด๋ค.
์ฐธ์กฐ
https://kubernetes.io/ko/docs/reference/command-line-tools-reference/kube-proxy/
https://kubernetes.io/ko/docs/concepts/services-networking/service/
https://medium.com/@adityap23/why-kubernetes-deprecated-ipvs-the-shift-to-nftables-explained-d03450efb8ce
https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/securing_networks/getting-started-with-nftables_securing-networks