[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