KR_K8s_Network - somaz94/DevOps-Engineer GitHub Wiki
- Pod์ veth pair๋ ํธ์คํธ์ caliXXX ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ๋๋๋ฐ, caliXXX๋ IP ์์ด MAC ์ฃผ์๋ง ๊ฐ์ง๋ค.
- Pod๊ฐ ๋ชฉ์ ์ง Pod์ MAC ์ฃผ์๋ฅผ ์๊ธฐ ์ํด ARP ์์ฒญ์ ๋ณด๋ด๋ฉด, ํธ์คํธ ์ปค๋์ ARP Proxy๊ฐ ์์ ์ MAC ์ฃผ์๋ก ์๋ตํ๋ค.
- Pod๋ ํธ์คํธ MAC์ผ๋ก ํจํท์ ๋ณด๋ด๊ณ , ํธ์คํธ์ ๋ผ์ฐํ ํ ์ด๋ธ์ด ๋ชฉ์ ์ง Pod์ veth ์ธํฐํ์ด์ค๋ก ํจํท์ ์ ๋ฌํ๋ค. ์ด๋ฅผ ํตํด L2 ๋ธ๋ฆฌ์ง ์์ด๋ ํจ์จ์ ์ธ Pod ๊ฐ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
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๋ฅผ ์ง์ ์ฌ์ฉํ๋ค.
- iptables๋ ์์ฐจ ๊ฒ์์ผ๋ก O(n) ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, 1000๊ฐ ์ด์ Service์์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค. Rule ์ ๋ฐ์ดํธ ์ ์ ์ฒด ์ฌ์์ฑ์ด ํ์ํ๋ค.
- IPVS๋ ํด์ ํ ์ด๋ธ๋ก O(1) ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ๋๊ท๋ชจ ํด๋ฌ์คํฐ์ ์ ํฉํ๋ค. rr(๋ผ์ด๋ ๋ก๋น), lc(์ต์ ์ฐ๊ฒฐ), sh(์์ค ํด์ฑ) ๋ฑ ๋ค์ํ ๋ก๋๋ฐธ๋ฐ์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๋ค.
- 100๊ฐ ์ดํ Service๋ iptables, ๊ทธ ์ด์์ IPVS๋ฅผ ๊ถ์ฅํ๋ค. IPVS๋ ipvsadm์ผ๋ก ์ค์๊ฐ ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
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 ์ฒด์ธ๋ถํฐ ์ถ์ ํ๋ค.
- 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 ์์๋ฅผ ์ต์ ํํ๋ค.
- 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 ํผ์ด ์ํ๋ฅผ ํ์ธํ๋ค.
- โ Cert-Manager๋ก CA ์ธ์ฆ์ ์์ฑ โ
- โก ๊ฐ Pod์ TLS Secret ๋ง์ดํธ โ
- โข ์ ํ๋ฆฌ์ผ์ด์ ์์ TLS ํธ๋์ ฐ์ดํฌ ๊ตฌํ.
NetworkPolicy๋ก ํน์ Label Pod๋ง ํต์ ํ์ฉํ๊ณ , PSP(Pod Security Policy) ๋๋ PSA(Pod Security Admission)๋ก ๊ถํ ์ ํํ๋ค.
Linkerd/Istio ๊ฐ์ Service Mesh๋ ์ด๋ฅผ ์๋ํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์์ ์์ด mTLS๋ฅผ ์ ๊ณตํ๋ฉฐ, ํธ๋ํฝ ์ํธํ, ์ธ์ฆ, ์ธ๊ฐ, Observability๋ฅผ ํตํฉ ๊ด๋ฆฌํ๋ค.
- 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๋ฅผ ์ ํํ๋ค.
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๋ฅผ ์ง์ ๋ฑ๋กํ์ฌ ๋ ธ๋ ํ์ ์ ๊ฑฐํ๋ค.
-
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 ๋ฑ)์ ๋ํ
- ์์ธํ ์ค๋ช ์ ๋ฌธ์ ์๋จ์ ์ฃผ์ ์ฉ์ด ํตํฉ ์ ๋ฆฌ > ๋คํธ์ํน ์น์ ์ ์ฐธ๊ณ ํ์ธ์.
- โ 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 ๋ฑ)์ ๋ํ
- ์์ธํ ์ค๋ช ์ ๋ฌธ์ ์๋จ์ ์ฃผ์ ์ฉ์ด ํตํฉ ์ ๋ฆฌ > ๋คํธ์ํน ์น์ ์ ์ฐธ๊ณ ํ์ธ์.
CNI(Container Network Interface)๋ kubelet๊ณผ ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ ๊ฐ์ ํ์ค ์ธํฐํ์ด์ค๋ค.
- โ 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์ ๋ฐํ.
- 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๋ช ๋ น์ผ๋ก ์ ๊ทผ
Istio/Linkerd ๊ฐ์ Service Mesh๋ Envoy/Linkerd-proxy๋ฅผ sidecar๋ก ์ฃผ์ ํ์ฌ ๋ชจ๋ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ๋ค.
- โ Mutating Admission Webhook์ด Pod Spec ์์ โ
- โก Init Container(
istio-init)๊ฐ iptables ๊ท์น ์ค์ โ - โข Sidecar Proxy ์ปจํ ์ด๋ ์ถ๊ฐ โ
- โฃ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์ ํจ๊ป ์คํ.
# 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/excludeOutboundPortsannotation์ผ๋ก ํน์ ํฌํธ ์ ์ธ
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-pmtu4. ๋ฌผ๋ฆฌ ์ธํฐํ์ด์ค 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 ํ๊ฒฝ์์ ํ
์คํธNodePort Service๋ ๋ชจ๋ ๋ ธ๋์ ํน์ ํฌํธ๋ก ์ธ๋ถ ์ ๊ทผ์ ํ์ฉํ๋ค.
- โ ์ธ๋ถ ํด๋ผ์ด์ธํธ๊ฐ Node1:30080์ผ๋ก ์์ฒญ โ
- โก Node1์ kube-proxy๊ฐ ๋๋คํ๊ฒ Node2์ Pod B ์ ํ โ
- โข SNAT(Source NAT) ๋ฐ์: ํด๋ผ์ด์ธํธ IP โ Node1 IP๋ก ๋ณ๊ฒฝ โ
- โฃ Pod B๋ Node1์ ํด๋ผ์ด์ธํธ๋ก ์ธ์ (์๋ณธ IP ์์ค) โ
- โค ์๋ต ํจํท๋ Node1์ ๊ฑฐ์ณ ๋์๊ฐ (์ถ๊ฐ ํ)
- Node2์ Pod B๊ฐ ํด๋ผ์ด์ธํธ IP๋ก ์ง์ ์๋ตํ๋ฉด, ํด๋ผ์ด์ธํธ๋ Node1์ผ๋ก ์์ฒญํ๋๋ฐ Node2์์ ์๋ต์ด ์์ ์ฐ๊ฒฐ์ด ๋๊น (๋น๋์นญ ๋ผ์ฐํ )
- SNAT๋ก Node1 IP๋ฅผ ์ ์งํ์ฌ ์๋ต ๊ฒฝ๋ก ๋ณด์ฅ
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> --watchDual-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=120apiVersion: 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 # IPv6apiVersion: 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)- 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 # IPv64. 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