KR_K8s_Network - somaz94/DevOps-Engineer GitHub Wiki

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ ์‹ฌํ™” (Q11-Q21)

๋„คํŠธ์›Œํฌ ์‹ฌํ™” (11~20๋ฒˆ)


Q11. ๊ฐ™์€ ๋…ธ๋“œ ๋‚ด Pod ํ†ต์‹ ์—์„œ ARP Proxy์˜ ๋™์ž‘ ์›๋ฆฌ๋Š”?

  • Pod์˜ veth pair๋Š” ํ˜ธ์ŠคํŠธ์˜ caliXXX ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ, caliXXX๋Š” IP ์—†์ด MAC ์ฃผ์†Œ๋งŒ ๊ฐ€์ง„๋‹ค.
  • Pod๊ฐ€ ๋ชฉ์ ์ง€ Pod์˜ MAC ์ฃผ์†Œ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ARP ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ํ˜ธ์ŠคํŠธ ์ปค๋„์˜ ARP Proxy๊ฐ€ ์ž์‹ ์˜ MAC ์ฃผ์†Œ๋กœ ์‘๋‹ตํ•œ๋‹ค.
  • Pod๋Š” ํ˜ธ์ŠคํŠธ MAC์œผ๋กœ ํŒจํ‚ท์„ ๋ณด๋‚ด๊ณ , ํ˜ธ์ŠคํŠธ์˜ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์ด ๋ชฉ์ ์ง€ Pod์˜ veth ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํŒจํ‚ท์„ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด L2 ๋ธŒ๋ฆฌ์ง€ ์—†์ด๋„ ํšจ์œจ์ ์ธ Pod ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Q12. Overlay Network์˜ VXLAN ์บก์Аํ™” ๊ณผ์ •๊ณผ ์„ฑ๋Šฅ ์˜ํ–ฅ์€?

VXLAN์€ L2 over L3 ํ„ฐ๋„๋ง์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • โ‘  Pod์˜ ์›๋ณธ ํŒจํ‚ท(Inner Ethernet + IP) โ†’
  • โ‘ก VXLAN ํ—ค๋” ์ถ”๊ฐ€(VNID ํฌํ•จ) โ†’
  • โ‘ข ์™ธ๋ถ€ UDP ํ—ค๋”(ํฌํŠธ 4789) ์ถ”๊ฐ€ โ†’
  • โ‘ฃ ์™ธ๋ถ€ IP ํ—ค๋”(๋…ธ๋“œ IP) ์ถ”๊ฐ€ โ†’
  • โ‘ค ์™ธ๋ถ€ Ethernet ํ—ค๋”.

MTU๋Š” 1500์—์„œ 50๋ฐ”์ดํŠธ ๊ฐ์†Œํ•˜์—ฌ 1450์ด ๋˜๋ฉฐ, CPU ์˜ค๋ฒ„ํ—ค๋“œ(์บก์Аํ™”/์—ญ์บก์Аํ™”)์™€ ๋Œ€์—ญํญ ์˜ค๋ฒ„ํ—ค๋“œ(์•ฝ 3%)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. AWS VPC CNI๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Pod๊ฐ€ VPC IP๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•œ๋‹ค.


Q13. iptables vs IPVS ๋ชจ๋“œ์˜ ์„ฑ๋Šฅ ์ฐจ์ด์™€ ์„ ํƒ ๊ธฐ์ค€์€?

  • iptables๋Š” ์ˆœ์ฐจ ๊ฒ€์ƒ‰์œผ๋กœ O(n) ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, 1000๊ฐœ ์ด์ƒ Service์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Rule ์—…๋ฐ์ดํŠธ ์‹œ ์ „์ฒด ์žฌ์ž‘์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.
  • IPVS๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ O(1) ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ํ•ฉํ•˜๋‹ค. rr(๋ผ์šด๋“œ ๋กœ๋นˆ), lc(์ตœ์†Œ ์—ฐ๊ฒฐ), sh(์†Œ์Šค ํ•ด์‹ฑ) ๋“ฑ ๋‹ค์–‘ํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•œ๋‹ค.
  • 100๊ฐœ ์ดํ•˜ Service๋Š” iptables, ๊ทธ ์ด์ƒ์€ IPVS๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. IPVS๋Š” ipvsadm์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Q14. kube-proxy์˜ iptables ์ฒด์ธ ๊ตฌ์กฐ์™€ DNAT/SNAT ๊ณผ์ •์€?

Service ์ƒ์„ฑ ์‹œ kube-proxy๊ฐ€ iptables ๊ทœ์น™์„ ์ƒ์„ฑํ•œ๋‹ค.

  • PREROUTING โ†’ KUBE-SERVICES โ†’ KUBE-SVC-XXX โ†’ KUBE-SEP-XXX (๊ฐ Pod Endpoint). ClusterIP ํŠธ๋ž˜ํ”ฝ: DNAT๋กœ Pod IP๋กœ ๋ณ€ํ™˜.
  • NodePort ํŠธ๋ž˜ํ”ฝ: KUBE-MARK-MASQ๋กœ ๋งˆํ‚น ํ›„ SNAT๋กœ ๋…ธ๋“œ IP๋กœ ๋ณ€ํ™˜(externalTrafficPolicy: Cluster), Local ์„ค์ • ์‹œ SNAT ์ƒ๋žต.
  • conntrack์œผ๋กœ ์—ฐ๊ฒฐ ์ถ”์ ํ•˜์—ฌ ์‘๋‹ต ํŒจํ‚ท๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ผ์šฐํŒ…ํ•œ๋‹ค. iptables-save๋กœ ์ „์ฒด ๊ทœ์น™์„ ํ™•์ธํ•˜๊ณ , KUBE-SERVICES ์ฒด์ธ๋ถ€ํ„ฐ ์ถ”์ ํ•œ๋‹ค.

Q15. CoreDNS์˜ ์บ์‹ฑ ์ „๋žต๊ณผ ndots ์„ค์ •์˜ ์˜ํ–ฅ์€?

  • CoreDNS๋Š” /etc/resolv.conf ์˜ ndots(๊ธฐ๋ณธ๊ฐ’ 5) ์„ค์ •์— ๋”ฐ๋ผ DNS ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • FQDN์ด ์•„๋‹Œ ๊ฒฝ์šฐ search ๋„๋ฉ”์ธ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ถ™์—ฌ ์กฐํšŒํ•˜๋ฏ€๋กœ, my-service ์กฐํšŒ ์‹œ ์ตœ๋Œ€ 6๋ฒˆ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ndots๋ฅผ ๋‚ฎ์ถ”๊ฑฐ๋‚˜ FQDN(my-service.namespace.svc.cluster.local)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.
  • CoreDNS๋Š” cache plugin์œผ๋กœ TTL ๊ธฐ๋ฐ˜ ์บ์‹ฑ์„ ํ•˜๋ฉฐ, ์‘๋‹ต ์‹œ๊ฐ„์„ ms ๋‹จ์œ„๋กœ ๋‹จ์ถ•ํ•œ๋‹ค. autopath plugin์€ search ์ˆœ์„œ๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค.

Q16. Calico์˜ BGP ๋ผ์šฐํŒ…๊ณผ Route Reflector์˜ ์—ญํ• ์€?

  • Calico๋Š” BGP๋กœ Pod CIDR ์ •๋ณด๋ฅผ ๋…ธ๋“œ ๊ฐ„ ๊ด‘๊ณ ํ•œ๋‹ค.
  • Full-mesh ๋ชจ๋“œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ํ”ผ์–ด๋งํ•˜์—ฌ N(N-1)/2 ๊ฐœ์˜ ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ, 100๊ฐœ ์ด์ƒ ๋…ธ๋“œ์—์„œ๋Š” ํ™•์žฅ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • Route Reflector ๋ชจ๋“œ๋Š” ์ค‘์•™ RR ๋…ธ๋“œ๊ฐ€ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ์ง‘์ค‘ ๊ด€๋ฆฌํ•˜์—ฌ N๊ฐœ์˜ ์—ฐ๊ฒฐ๋งŒ ํ•„์š”ํ•˜๋‹ค.
  • RR์€ SPOF ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๋‹ค์ค‘ํ™”ํ•˜๋ฉฐ, Kubernetes Node๋ฅผ RR๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ „์šฉ RR์„ ๊ตฌ์„ฑํ•œ๋‹ค. calicoctl node status๋กœ BGP ํ”ผ์–ด ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.

Q17. Service Mesh ์—†์ด Pod ๊ฐ„ mTLS ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€?

  • โ‘  Cert-Manager๋กœ CA ์ธ์ฆ์„œ ์ƒ์„ฑ โ†’
  • โ‘ก ๊ฐ Pod์— TLS Secret ๋งˆ์šดํŠธ โ†’
  • โ‘ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ TLS ํ•ธ๋“œ์…ฐ์ดํฌ ๊ตฌํ˜„.

NetworkPolicy๋กœ ํŠน์ • Label Pod๋งŒ ํ†ต์‹  ํ—ˆ์šฉํ•˜๊ณ , PSP(Pod Security Policy) ๋˜๋Š” PSA(Pod Security Admission)๋กœ ๊ถŒํ•œ ์ œํ•œํ•œ๋‹ค.

Linkerd/Istio ๊ฐ™์€ Service Mesh๋Š” ์ด๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด mTLS๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํŠธ๋ž˜ํ”ฝ ์•”ํ˜ธํ™”, ์ธ์ฆ, ์ธ๊ฐ€, Observability๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•œ๋‹ค.


Q18. Ingress Controller์˜ ๋™์ž‘ ์›๋ฆฌ์™€ NGINX vs Traefik vs Istio Gateway ๋น„๊ต๋Š”?

  • Ingress Controller๋Š” Ingress ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ์‹œํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •์„ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค. NGINX Ingress: ๊ฐ€์žฅ ์„ฑ์ˆ™ํ•˜๊ณ  ์•ˆ์ •์ , annotation ๊ธฐ๋ฐ˜ ์„ค์ •, ConfigMap์œผ๋กœ ๊ธ€๋กœ๋ฒŒ ์„ค์ •.
  • Traefik: ๋™์  ์„ค์ •, ์ž๋™ SSL(Let's Encrypt), ๋ฏธ๋“ค์›จ์–ด ์ฒด์ธ, Kubernetes CRD ์ง€์›.
  • Istio Gateway: Service Mesh ํ†ตํ•ฉ, L7 ๋ผ์šฐํŒ…, ํŠธ๋ž˜ํ”ฝ ๋ถ„ํ• (Canary), mTLS, Observability ๋‚ด์žฅ.
  • ๋‹จ์ˆœํ•œ L7 ๋ผ์šฐํŒ…์€ NGINX, ๋™์  ํ™˜๊ฒฝ์€ Traefik, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์€ Istio๋ฅผ ์„ ํƒํ•œ๋‹ค.

Q19. AWS LoadBalancer Controller vs Legacy Cloud Provider์˜ ์ฐจ์ด๋Š”?

Legacy(in-tree)๋Š” K8s ์ฝ”์–ด์— ํฌํ•จ๋˜์–ด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋А๋ฆฌ๊ณ , Classic LB๋งŒ ์ง€์›ํ•œ๋‹ค.

AWS LoadBalancer Controller(out-of-tree)๋Š” ALB/NLB๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›ํ•˜๊ณ , IP ๋ชจ๋“œ, TargetGroupBinding, WAF ํ†ตํ•ฉ, Subnet Discovery(ํƒœ๊ทธ ๊ธฐ๋ฐ˜), NLB์˜ Client IP ๋ณด์กด์„ ์ œ๊ณตํ•œ๋‹ค.

Ingress๋กœ ALB ์ƒ์„ฑ ์‹œ annotation์œผ๋กœ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, Service๋กœ NLB ์ƒ์„ฑ ์‹œ Instance/IP ํƒ€์ž…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. IP ํƒ€์ž…์€ Pod IP๋ฅผ ์ง์ ‘ ๋“ฑ๋กํ•˜์—ฌ ๋…ธ๋“œ ํ™‰์„ ์ œ๊ฑฐํ•œ๋‹ค.


Q20. ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ Source IP ํ™•์ธ ๋ฐฉ๋ฒ•๊ณผ X-Forwarded-For vs Proxy Protocol ์ฐจ์ด๋Š”?

  • AWS: externalTrafficPolicy: Local + NLB(Proxy Protocol v2)๋กœ ํด๋ผ์ด์–ธํŠธ IP ์œ ์ง€. ALB๋Š” X-Forwarded-For ํ—ค๋” ์‚ฌ์šฉ.
  • On-Premise: externalTrafficPolicy: Local + MetalLB(Layer2/BGP ๋ชจ๋“œ).
  • X-Forwarded-For: HTTP ํ—ค๋”, L7์—์„œ๋งŒ ๋™์ž‘, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์‹ฑ ํ•„์š”, ์—ฌ๋Ÿฌ ํ”„๋ก์‹œ ๊ฑฐ์น  ๋•Œ ์ฒด์ธ ํ˜•์„ฑ.
  • Proxy Protocol: TCP ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ—ค๋” ์ „์†ก, L4์—์„œ ๋™์ž‘, NGINX/HAProxy ์ง€์›, ์„ฑ๋Šฅ ์šฐ์ˆ˜. externalTrafficPolicy: Local ์€ ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ Pod๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋˜๋„๋ก Anti-Affinity ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

๐Ÿ’ก ์šฉ์–ด ์„ค๋ช…:

  • ๋„คํŠธ์›Œํฌ ์‹ฌํ™” ์งˆ๋ฌธ๋“ค(Q11-Q20)์—์„œ ์‚ฌ์šฉ๋œ ์šฉ์–ด๋“ค(ARP Proxy, Overlay Network, VXLAN, IPIP, iptables, IPVS, CNI, Calico, BGP, CoreDNS, Ingress Controller, X-Forwarded-For, Proxy Protocol ๋“ฑ)์— ๋Œ€ํ•œ
  • ์ƒ์„ธํ•œ ์„ค๋ช…์€ ๋ฌธ์„œ ์ƒ๋‹จ์˜ ์ฃผ์š” ์šฉ์–ด ํ†ตํ•ฉ ์ •๋ฆฌ > ๋„คํŠธ์›Œํ‚น ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Q21. ์™ธ๋ถ€์—์„œ Pod๊นŒ์ง€ ์ „์ฒด ํŒจํ‚ท ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜์„ธ์š”.

  • โ‘  External Traffic โ†’ Ingress Controller/LoadBalancer(AWS ELB, NLB, ALB) ์ง„์ž… โ†’
  • โ‘ก Service ClusterIP(Virtual IP, Endpoints ๊ด€๋ฆฌ) โ†’
  • โ‘ข kube-proxy(iptables KUBE-SERVICES ์ฒด์ธ, DNAT๋กœ Pod IP ๋ณ€ํ™˜, IPVS ๋ชจ๋“œ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ) โ†’
  • โ‘ฃ CNI Network(Calico/Flannel์ด ๋ผ์šฐํŒ…, ๊ฐ™์€ ๋…ธ๋“œ๋Š” veth pair + ARP Proxy) โ†’
  • โ‘ค Overlay Network(๋‹ค๋ฅธ ๋…ธ๋“œ๋Š” VXLAN/IPIP ์บก์Аํ™”, ํ„ฐ๋„๋ง ์ธํ„ฐํŽ˜์ด์Šค) โ†’
  • โ‘ฅ Pod Container Port ๋„์ฐฉ. ๋””๋ฒ„๊น…: kubectl logs, tcpdump, iptables-save, Endpoints ํ™•์ธ, NetworkPolicy ๊ฒ€์ฆ.

๐Ÿ’ก ์šฉ์–ด ์„ค๋ช…:

  • ์œ„ ๋‹ต๋ณ€์— ์‚ฌ์šฉ๋œ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ์šฉ์–ด๋“ค(ClusterIP, Endpoints, DNAT, IPVS, CNI, veth pair, ARP Proxy, Overlay Network, VXLAN, IPIP, ์บก์Аํ™”, NetworkPolicy ๋“ฑ)์— ๋Œ€ํ•œ
  • ์ƒ์„ธํ•œ ์„ค๋ช…์€ ๋ฌธ์„œ ์ƒ๋‹จ์˜ ์ฃผ์š” ์šฉ์–ด ํ†ตํ•ฉ ์ •๋ฆฌ > ๋„คํŠธ์›Œํ‚น ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Q21-1. CNI Plugin์ด Pod ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ „์ฒด ๊ณผ์ •๊ณผ IPAM์˜ ์—ญํ• ์€?

CNI(Container Network Interface)๋Š” kubelet๊ณผ ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ„์˜ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

Pod ๋„คํŠธ์›Œํฌ ์„ค์ • ํ๋ฆ„:

  • โ‘  kubelet์ด CRI(Container Runtime Interface)๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์š”์ฒญ โ†’
  • โ‘ก CRI๊ฐ€ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ โ†’
  • โ‘ข kubelet์ด CNI Plugin ํ˜ธ์ถœ(ADD ์ปค๋งจ๋“œ) โ†’
  • โ‘ฃ IPAM(IP Address Management) Plugin์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ IP ์ฃผ์†Œ ํ• ๋‹น โ†’
  • โ‘ค CNI Plugin์ด veth pair ์ƒ์„ฑ(ํ•œ์ชฝ์€ Pod ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋‹ค๋ฅธ์ชฝ์€ ํ˜ธ์ŠคํŠธ) โ†’
  • โ‘ฅ Pod์ชฝ ์ธํ„ฐํŽ˜์ด์Šค์— IP ์„ค์ • ๋ฐ ๊ธฐ๋ณธ ๋ผ์šฐํŠธ ์ถ”๊ฐ€ โ†’
  • โ‘ฆ ํ˜ธ์ŠคํŠธ์ชฝ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ธŒ๋ฆฌ์ง€ ๋˜๋Š” ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ์—ฐ๊ฒฐ โ†’
  • โ‘ง CNI๊ฐ€ ๊ฒฐ๊ณผ(IP, Gateway, DNS)๋ฅผ kubelet์— ๋ฐ˜ํ™˜.

IPAM ์—ญํ• :

  • host-local: ๋กœ์ปฌ ํŒŒ์ผ์— IP ํ• ๋‹น ์ •๋ณด ์ €์žฅ, ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋…ธ๋“œ ๊ฐ„ ๋™๊ธฐํ™” ์—†์Œ.
  • Calico IPAM: etcd ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ IP ๊ด€๋ฆฌ, IP Pool ๊ฐœ๋…์œผ๋กœ ํšจ์œจ์  ํ• ๋‹น.
  • Whereabouts: etcd/Kubernetes API๋กœ ๋ฉ€ํ‹ฐ ๋„คํŠธ์›Œํฌ IP ๊ด€๋ฆฌ.

๋””๋ฒ„๊น…:

  • CNI ๋กœ๊ทธ: /var/log/pods/ ๋˜๋Š” /opt/cni/bin/ ์‹คํ–‰ ๋กœ๊ทธ
  • IP ํ• ๋‹น ์ƒํƒœ: Calico์˜ ๊ฒฝ์šฐ calicoctl ipam show
  • ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค: ip netns list, nsenter ๋ช…๋ น์œผ๋กœ ์ ‘๊ทผ

Q21-2. Service Mesh์—์„œ Sidecar Proxy๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„๋Š” iptables ๊ทœ์น™ ์›๋ฆฌ๋Š”?

Istio/Linkerd ๊ฐ™์€ Service Mesh๋Š” Envoy/Linkerd-proxy๋ฅผ sidecar๋กœ ์ฃผ์ž…ํ•˜์—ฌ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑˆ๋‹ค.

Sidecar Injection ๊ณผ์ •:

  • โ‘  Mutating Admission Webhook์ด Pod Spec ์ˆ˜์ • โ†’
  • โ‘ก Init Container(istio-init)๊ฐ€ iptables ๊ทœ์น™ ์„ค์ • โ†’
  • โ‘ข Sidecar Proxy ์ปจํ…Œ์ด๋„ˆ ์ถ”๊ฐ€ โ†’
  • โ‘ฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์™€ ํ•จ๊ป˜ ์‹คํ–‰.

iptables ๊ทœ์น™ ๊ตฌ์กฐ:

# Outbound ํŠธ๋ž˜ํ”ฝ ๊ฐ€๋กœ์ฑ„๊ธฐ
-A OUTPUT -p tcp -j ISTIO_OUTPUT
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -j ISTIO_REDIRECT
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001

# Inbound ํŠธ๋ž˜ํ”ฝ ๊ฐ€๋กœ์ฑ„๊ธฐ
-A PREROUTING -p tcp -j ISTIO_INBOUND
-A ISTIO_INBOUND -p tcp --dport 80 -j REDIRECT --to-ports 15006

๋™์ž‘ ์›๋ฆฌ:

  • Outbound: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€๋กœ ๋ณด๋‚ด๋Š” ํŠธ๋ž˜ํ”ฝ์„ Envoy์˜ 15001 ํฌํŠธ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • Inbound: Pod๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ Envoy์˜ 15006 ํฌํŠธ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • Envoy๊ฐ€ mTLS, ๋ผ์šฐํŒ…, ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, Retry, Circuit Breaker ์ ์šฉ ํ›„ ์‹ค์ œ ๋ชฉ์ ์ง€๋กœ ์ „๋‹ฌ

์˜ˆ์™ธ ์ฒ˜๋ฆฌ:

  • Envoy ์ž์‹ ์˜ ํŠธ๋ž˜ํ”ฝ์€ ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ œ์™ธ
  • Prometheus ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ํฌํŠธ(15090) ์ œ์™ธ
  • traffic.sidecar.istio.io/excludeOutboundPorts annotation์œผ๋กœ ํŠน์ • ํฌํŠธ ์ œ์™ธ

Q21-3. Kubernetes์—์„œ MTU ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ํŒจํ‚ท ๋‹จํŽธํ™” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€?

MTU(Maximum Transmission Unit)๋Š” ํ•œ ๋ฒˆ์— ์ „์†ก ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํŒจํ‚ท ํฌ๊ธฐ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ:

  • ์ผ๋ฐ˜ Ethernet MTU: 1500 bytes
  • VXLAN Overlay ์˜ค๋ฒ„ํ—ค๋“œ: 50 bytes (VXLAN header 8 + Outer IP 20 + Outer UDP 8 + Outer Ethernet 14)
  • Pod์˜ ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ MTU: 1450 bytes
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด 1500 byte ํŒจํ‚ท ์ „์†ก ์‹œ ๋‹จํŽธํ™”(fragmentation) ๋ฐœ์ƒ

์ฆ์ƒ:

  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜
  • TCP ์—ฐ๊ฒฐ์ด ์ค‘๊ฐ„์— ๋Š๊น€
  • PMTUD (Path MTU Discovery) ์‹คํŒจ ์‹œ ํ†ต์‹  ๋ถˆ๊ฐ€

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

1. Pod MTU ์ž๋™ ์„ค์ •:

# Calico CNI ์„ค์ •
apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
  name: default
spec:
  mtuIfacePattern: "^((en|wl|ww|sl|ib)[opsx].*|(eth|wlan|wwan).*)"
  vxlanMTU: 1450  # VXLAN ์‚ฌ์šฉ ์‹œ

2. CNI์—์„œ ์ž๋™ ๊ฐ์ง€:

  • Calico: FELIX_IPINIPMTU, FELIX_VXLANMTU ํ™˜๊ฒฝ๋ณ€์ˆ˜
  • Cilium: tunnel-protocol ์„ค์ •์— ๋”ฐ๋ผ ์ž๋™ ๊ณ„์‚ฐ
  • AWS VPC CNI: ENI MTU ๊ธฐ๋ฐ˜ ์ž๋™ ์„ค์ • (Jumbo Frame ์ง€์› ์‹œ 9001)

3. TCP MSS Clamping:

# iptables๋กœ MSS ์กฐ์ •
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

4. ๋ฌผ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค Jumbo Frame ํ™œ์„ฑํ™”:

# ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ์—์„œ MTU ์ฆ๊ฐ€
ip link set dev eth0 mtu 9000

ํ™•์ธ ๋ฐฉ๋ฒ•:

# Pod ๋‚ด๋ถ€ MTU ํ™•์ธ
kubectl exec -it <pod> -- ip link show eth0

# PMTUD ํ…Œ์ŠคํŠธ (Don't Fragment ํ”Œ๋ž˜๊ทธ๋กœ ping)
ping -M do -s 1472 <destination>  # ์„ฑ๊ณตํ•˜๋ฉด MTU 1500 OK
ping -M do -s 1422 <destination>  # VXLAN ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ

Q21-4. NodePort Service์˜ SNAT ๋™์ž‘๊ณผ Session Affinity ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”.

NodePort Service๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ํŠน์ • ํฌํŠธ๋กœ ์™ธ๋ถ€ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘ (externalTrafficPolicy: Cluster):

  • โ‘  ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Node1:30080์œผ๋กœ ์š”์ฒญ โ†’
  • โ‘ก Node1์˜ kube-proxy๊ฐ€ ๋žœ๋คํ•˜๊ฒŒ Node2์˜ Pod B ์„ ํƒ โ†’
  • โ‘ข SNAT(Source NAT) ๋ฐœ์ƒ: ํด๋ผ์ด์–ธํŠธ IP โ†’ Node1 IP๋กœ ๋ณ€๊ฒฝ โ†’
  • โ‘ฃ Pod B๋Š” Node1์„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ธ์‹ (์›๋ณธ IP ์†์‹ค) โ†’
  • โ‘ค ์‘๋‹ต ํŒจํ‚ท๋„ Node1์„ ๊ฑฐ์ณ ๋Œ์•„๊ฐ (์ถ”๊ฐ€ ํ™‰)

SNAT ๋ฐœ์ƒ ์ด์œ :

  • Node2์˜ Pod B๊ฐ€ ํด๋ผ์ด์–ธํŠธ IP๋กœ ์ง์ ‘ ์‘๋‹ตํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” Node1์œผ๋กœ ์š”์ฒญํ–ˆ๋Š”๋ฐ Node2์—์„œ ์‘๋‹ต์ด ์™€์„œ ์—ฐ๊ฒฐ์ด ๋Š๊น€ (๋น„๋Œ€์นญ ๋ผ์šฐํŒ…)
  • SNAT๋กœ Node1 IP๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์‘๋‹ต ๊ฒฝ๋กœ ๋ณด์žฅ

Session Affinity ๋ฌธ์ œ:

apiVersion: v1
kind: Service
spec:
  sessionAffinity: ClientIP  # ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ IP๋Š” ๊ฐ™์€ Pod๋กœ
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800  # 3์‹œ๊ฐ„

๋ฌธ์ œ์ :

  • SNAT๋กœ ์ธํ•ด ๋ชจ๋“  ์š”์ฒญ์ด Node IP์—์„œ ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž„
  • ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ™์€ Node๋ฅผ ํ†ตํ•˜๋ฉด ๋ชจ๋‘ ๊ฐ™์€ Pod๋กœ ๋ผ์šฐํŒ… (๋ถˆ๊ท ํ˜•)

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

1. externalTrafficPolicy: Local ์‚ฌ์šฉ:

spec:
  type: NodePort
  externalTrafficPolicy: Local  # SNAT ์ œ๊ฑฐ, ์›๋ณธ IP ์œ ์ง€
  • ์žฅ์ : ํด๋ผ์ด์–ธํŠธ IP ์œ ์ง€, Session Affinity ์ •์ƒ ๋™์ž‘, ํ™‰ ๊ฐ์†Œ
  • ๋‹จ์ : Pod ์—†๋Š” ๋…ธ๋“œ๋กœ ์š”์ฒญ ์‹œ ์‹คํŒจ, ๋ถˆ๊ท ํ˜• ๊ฐ€๋Šฅ์„ฑ

2. LoadBalancer + Proxy Protocol:

service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"

3. Ingress Controller ์‚ฌ์šฉ:

  • L7์—์„œ X-Forwarded-For ํ—ค๋”๋กœ ์›๋ณธ IP ์ „๋‹ฌ
  • Ingress๊ฐ€ Session Affinity ๊ด€๋ฆฌ (Cookie ๊ธฐ๋ฐ˜)

๋””๋ฒ„๊น…:

# conntrack ํ…Œ์ด๋ธ” ํ™•์ธ
conntrack -L | grep <service-ip>

# iptables SNAT ๊ทœ์น™ ํ™•์ธ
iptables -t nat -L KUBE-POSTROUTING -n -v

# Session Affinity ๋™์ž‘ ํ™•์ธ
kubectl get endpoints <service> --watch

Q21-5. Dual-Stack (IPv4/IPv6) Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ๊ณผ ๊ณ ๋ ค์‚ฌํ•ญ์€?

Dual-Stack์€ IPv4์™€ IPv6๋ฅผ ๋™์‹œ์— ์ง€์›ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์ด๋‹ค (K8s 1.23+ GA).

ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ •:

# kube-apiserver ํ”Œ๋ž˜๊ทธ
--service-cluster-ip-range=10.96.0.0/12,fd00:1234::/112
--feature-gates=IPv6DualStack=true

# kube-controller-manager ํ”Œ๋ž˜๊ทธ
--cluster-cidr=10.244.0.0/16,fd00:5678::/104
--service-cluster-ip-range=10.96.0.0/12,fd00:1234::/112
--node-cidr-mask-size-ipv4=24
--node-cidr-mask-size-ipv6=120

Pod ๋„คํŠธ์›Œํฌ:

apiVersion: v1
kind: Pod
metadata:
  name: dual-stack-pod
spec:
  containers:
  - name: app
    image: nginx
status:
  podIPs:
  - ip: 10.244.1.5      # IPv4
  - ip: fd00:5678::5    # IPv6

Service ๊ตฌ์„ฑ:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ipFamilyPolicy: PreferDualStack  # SingleStack | PreferDualStack | RequireDualStack
  ipFamilies:
  - IPv4
  - IPv6
  clusterIPs:
  - 10.96.100.200      # Primary (IPv4)
  - fd00:1234::200     # Secondary (IPv6)

CNI ์ง€์›:

  • Calico: Dual-Stack ์™„์ „ ์ง€์›, IPv6 BGP ํ”ผ์–ด๋ง
  • Cilium: Native IPv6 ์ง€์›, eBPF ๊ธฐ๋ฐ˜ ๊ณ ์„ฑ๋Šฅ
  • Flannel: ์ œํ•œ์  ์ง€์› (VXLAN ๋ชจ๋“œ๋งŒ)

๊ณ ๋ ค์‚ฌํ•ญ:

1. DNS ํ•ด์„:

# CoreDNS๊ฐ€ AAAA ๋ ˆ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ
my-service.default.svc.cluster.local.  # A + AAAA ๋ฐ˜ํ™˜

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธํ™˜์„ฑ:

  • 0.0.0.0:8080 โ†’ ::/0:8080 ๋˜๋Š” [::]:8080 (IPv6 ๋ฐ”์ธ๋”ฉ)
  • Go: net.Listen("tcp", ":8080") ์ž๋™ Dual-Stack
  • Python: socket.AF_INET6 + IPV6_V6ONLY=0

3. NetworkPolicy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
spec:
  ingress:
  - from:
    - ipBlock:
        cidr: 10.0.0.0/8      # IPv4
    - ipBlock:
        cidr: fd00::/8        # IPv6

4. Cloud Provider ์ œ์•ฝ:

  • AWS: VPC IPv6 CIDR ํ•„์š”, ELB๋Š” Dual-Stack NLB๋งŒ ์ง€์›
  • GCP: Dual-Stack GKE ๋ฒ ํƒ€, ์ถ”๊ฐ€ ์„ค์ • ํ•„์š”
  • Azure: AKS Dual-Stack ํ”„๋ฆฌ๋ทฐ

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต:

  • โ‘  IPv4 Single-Stack ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ
  • โ‘ก ipFamilyPolicy: PreferDualStack์œผ๋กœ ์ ์ง„์  IPv6 ์ถ”๊ฐ€
  • โ‘ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ IPv6 ํ˜ธํ™˜์„ฑ ๊ฒ€์ฆ
  • โ‘ฃ ipFamilyPolicy: RequireDualStack์œผ๋กœ ๊ฐ•์ œ
  • โ‘ค Primary IP Family๋ฅผ IPv6๋กœ ์ „ํ™˜ (ipFamilies ์ˆœ์„œ ๋ณ€๊ฒฝ)

๋””๋ฒ„๊น…:

# Pod IPv6 ์ฃผ์†Œ ํ™•์ธ
kubectl get pod <pod> -o jsonpath='{.status.podIPs}'

# IPv6 ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
kubectl exec -it <pod> -- curl -6 http://[fd00:1234::200]:80

# CNI IPv6 ๋ผ์šฐํŒ… ํ™•์ธ
ip -6 route show

โš ๏ธ **GitHub.com Fallback** โš ๏ธ