ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿค– AI Assisted Content
์ด ๊ธ€์€ AI(Claude, Anthropic)์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ž‘์„ฑ์ž๊ฐ€ ๋‚ด์šฉ์„ ๊ฒ€ํ† ํ•˜๊ณ  ํŽธ์ง‘ํ–ˆ์œผ๋‚˜, AI๊ฐ€ ์ดˆ์•ˆ ์ž‘์„ฑ ๋ฐ ๊ตฌ์„ฑ์— ์ฐธ์—ฌํ–ˆ์Œ์„ ๋ฐํž™๋‹ˆ๋‹ค.

์™œ ํŒŒ๋“œ๋ผ๋ฆฌ ์ง์ ‘ ํ†ต์‹ ํ•˜๋ฉด ์•ˆ ๋ ๊นŒ

Kubernetes๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. "ํŒŒ๋“œ๋งˆ๋‹ค IP๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ, ๊ทธ๋ƒฅ IP๋กœ ํ†ต์‹ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?"

์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฒซ์งธ, ํŒŒ๋“œ๋Š” ์–ธ์ œ๋“  ๊ต์ฒด๋  ์ˆ˜ ์žˆ๊ณ , ๊ต์ฒด๋˜๋ฉด IP๊ฐ€ ๋ฐ”๋€๋‹ˆ๋‹ค. Deployment๊ฐ€ ํŒŒ๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด ์ด์ „ ํŒŒ๋“œ์˜ IP๋Š” ์‚ฌ๋ผ์ง€๊ณ  ์™„์ „ํžˆ ์ƒˆ๋กœ์šด IP๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ „ IP๋กœ ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์—ฐ๊ฒฐ์ด ๋Š๊น๋‹ˆ๋‹ค.

๋‘˜์งธ, ๊ต์ฒด๋œ ํŒŒ๋“œ์˜ ์ƒˆ IP๋ฅผ ์•Œ์•„๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ƒˆ IP๋Š” Kubernetes API๋ฅผ ์ง์ ‘ ์กฐํšŒํ•ด์•ผ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— Kubernetes API ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‚ด์žฅํ•˜๋Š” ๊ฑด ํ˜„์‹ค์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—์„œ๋„ ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ๋„๋ฉ”์ธ ๋„ค์ž„๊ณผ ์ด๋ฅผ IP๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” DNS๋ฅผ ๋„์ž…ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. Kubernetes๋„ ๊ฐ™์€ ์ „๋žต์„ ์”๋‹ˆ๋‹ค.

Service — ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ€์ƒ์˜ ์ง„์ž…์ 

Kubernetes์˜ Service๋Š” ๋ณต์ˆ˜์˜ ํŒŒ๋“œ๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ •๋œ ๊ฐ€์ƒ IP ์ฃผ์†Œ(ClusterIP)์ž…๋‹ˆ๋‹ค. Service๋Š” Deployment์ฒ˜๋Ÿผ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋Œ€์ƒ ํŒŒ๋“œ๋ฅผ ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋“œ๊ฐ€ ๊ต์ฒด๋˜์–ด๋„ ๋ ˆ์ด๋ธ”๋งŒ ๊ฐ™์œผ๋ฉด Service๋Š” ์ž๋™์œผ๋กœ ์ƒˆ ํŒŒ๋“œ๋ฅผ ๋Œ€์ƒ์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: my-backend
spec:
  selector:
    app: backend    # ์ด ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ํŒŒ๋“œ๋“ค์ด ๋Œ€์ƒ
  ports:
  - port: 80
    targetPort: 8080

์ด Service๋ฅผ ๋งŒ๋“ค๋ฉด my-backend๋ผ๋Š” ์ด๋ฆ„๊ณผ 10.96.x.x ํ˜•ํƒœ์˜ ClusterIP๊ฐ€ ํ• ๋‹น๋˜๊ณ , ์ด ์ •๋ณด๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ DNS์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒ๋“œ๋Š” IP ๋Œ€์‹  my-backend๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

CoreDNS — ํด๋Ÿฌ์Šคํ„ฐ ์ „์šฉ DNS ์„œ๋ฒ„

"ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ DNS"๊ฐ€ ๋ฐ”๋กœ CoreDNS์ž…๋‹ˆ๋‹ค. kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ Deployment๋กœ ์‹คํ–‰๋˜๋Š” ํŒŒ๋“œ์ด๋ฉฐ, ๋ณดํ†ต 2๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

CoreDNS๊ฐ€ ํ•˜๋Š” ์ผ

ํŒŒ๋“œ๊ฐ€ my-backend๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ํŒŒ๋“œ ๋‚ด๋ถ€์˜ /etc/resolv.conf์— ์„ค์ •๋œ ๋„ค์ž„์„œ๋ฒ„(CoreDNS์˜ Service IP)๋กœ DNS ์กฐํšŒ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

# ํŒŒ๋“œ ๋‚ด๋ถ€์˜ /etc/resolv.conf (kubelet์ด ์ž๋™ ์„ค์ •)
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

search ๋ฆฌ์ŠคํŠธ ๋•๋ถ„์— my-backend๋งŒ ์ž…๋ ฅํ•ด๋„ my-backend.default.svc.cluster.local๊นŒ์ง€ ์ž๋™์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. CoreDNS๋Š” ์ด FQDN์— ๋งค์นญ๋˜๋Š” Service์˜ ClusterIP๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

DNS ๋ ˆ์ฝ”๋“œ ํ˜•์‹

Service์˜ DNS A ๋ ˆ์ฝ”๋“œ ํ˜•์‹์€ <service-name>.<namespace>.svc.<cluster-domain>์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์—์„œ๋Š” ์„œ๋น„์Šค๋ช…๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๊ณ , ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ๋•Œ๋Š” my-backend.other-ns ํ˜•ํƒœ๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

CoreDNS์˜ ๊ตฌ์กฐ

CoreDNS๋Š” Go๋กœ ์ž‘์„ฑ๋œ ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์€ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ coredns ConfigMap์— ์žˆ๋Š” Corefile๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

.:53 {
    errors
    health { lameduck 5s }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
       ttl 30
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

kubernetes ํ”Œ๋Ÿฌ๊ทธ์ธ์ด Service/Pod DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , forward๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ๋„๋ฉ”์ธ(์˜ˆ: google.com)์„ ๋…ธ๋“œ์˜ upstream DNS๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜: CoreDNS Service์˜ ์ด๋ฆ„์€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด kube-dns๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. kubectl get svc -n kube-system์œผ๋กœ ํ™•์ธํ•˜๋ฉด kube-dns๋ผ๋Š” ์ด๋ฆ„์ด ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ CoreDNS ํŒŒ๋“œ์ž…๋‹ˆ๋‹ค.

kube-proxy — ๊ฐ€์ƒ IP๋ฅผ ์‹ค์ œ ํŒŒ๋“œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋งˆ๋ฒ•

์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ด ์ƒ๊น๋‹ˆ๋‹ค. CoreDNS๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ClusterIP(์˜ˆ: 10.96.100.50)๋Š” ๊ฐ€์ƒ IP์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๊ณ , ์‹ค์ œ๋กœ "์กด์žฌ"ํ•˜์ง€ ์•Š๋Š” IP์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒŒ๋“œ๊ฐ€ ์ด ๊ฐ€์ƒ IP๋กœ ํŒจํ‚ท์„ ๋ณด๋‚ด๋ฉด ์–ด๋–ป๊ฒŒ ์‹ค์ œ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ์— ๋„์ฐฉํ• ๊นŒ์š”?

์ด ๋งˆ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด kube-proxy์ž…๋‹ˆ๋‹ค.

kube-proxy์˜ ์—ญํ• 

kube-proxy๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค. DaemonSet์œผ๋กœ ๋ฐฐํฌ๋˜์–ด ๊ฐ ๋…ธ๋“œ์— ํ•˜๋‚˜์”ฉ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. kube-proxy๋Š” Kubernetes API ์„œ๋ฒ„๋ฅผ watchํ•˜๋ฉด์„œ Service์™€ EndpointSlice ์˜ค๋ธŒ์ ํŠธ์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์‹œํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด ์ปค๋„ ์ˆ˜์ค€์—์„œ ํŒจํ‚ท ํฌ์›Œ๋”ฉ ๊ทœ์น™์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ทœ์น™์ด ํ•˜๋Š” ํ•ต์‹ฌ ๋™์ž‘์€ DNAT(Destination NAT) — ํŒจํ‚ท์˜ ๋ชฉ์ ์ง€ ์ฃผ์†Œ๋ฅผ ClusterIP์—์„œ ์‹ค์ œ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ IP๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ „์ฒด ํ†ต์‹  ํ๋ฆ„

Pod A: "my-backend์— ์š”์ฒญ์„ ๋ณด๋‚ด์ž"
  ↓
/etc/resolv.conf → nameserver 10.96.0.10 (CoreDNS)
  ↓
CoreDNS: "my-backend.default.svc.cluster.local → 10.96.100.50"
  ↓
Pod A๊ฐ€ 10.96.100.50:80์œผ๋กœ TCP ์—ฐ๊ฒฐ
  ↓
๋…ธ๋“œ์˜ netfilter (kube-proxy๊ฐ€ ์„ค์น˜ํ•œ ๊ทœ์น™)
  ↓
DNAT: 10.96.100.50 → 10.244.2.10 (๋ฐฑ์—”๋“œ ํŒŒ๋“œ ์ค‘ ํ•˜๋‚˜)
  ↓
Pod B๊ฐ€ ์š”์ฒญ์„ ์ˆ˜์‹ 

ํ”„๋ก์‹œ ๋ชจ๋“œ

kube-proxy์—๋Š” 3๊ฐ€์ง€ ์ฃผ์š” ๋ชจ๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ปค๋„์—์„œ ๊ทœ์น™์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

iptables ๋ชจ๋“œ (ํ˜„์žฌ ๊ธฐ๋ณธ๊ฐ’)๋Š” Linux ์ปค๋„์˜ netfilter/iptables๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค์™€ ์—”๋“œํฌ์ธํŠธ๋งˆ๋‹ค iptables ๊ทœ์น™์„ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ฐฑ์—”๋“œ ํŒŒ๋“œ ์„ ํƒ์€ ํ™•๋ฅ  ๊ธฐ๋ฐ˜ ๋žœ๋ค ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ์ปค๋„ ๊ณต๊ฐ„์—์„œ ์ด๋ฃจ์–ด์ ธ ๋น ๋ฅด์ง€๋งŒ, ์„œ๋น„์Šค ์ˆ˜๊ฐ€ ์ˆ˜๋งŒ ๊ฐœ๋กœ ๋Š˜์–ด๋‚˜๋ฉด ๊ทœ์น™์ด O(n)์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ iptables ๊ทœ์น™์„ ๋ณด๋ฉด ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค:

# 1๋‹จ๊ณ„: ClusterIP๋กœ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์„ ์„œ๋น„์Šค ์ฒด์ธ์œผ๋กœ ์ „๋‹ฌ
-A KUBE-SERVICES -d 10.0.1.175/32 -p tcp --dport 80 \
   -j KUBE-SVC-NWV5X2332I4OT4T3

# 2๋‹จ๊ณ„: ํ™•๋ฅ  ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฑ์—”๋“œ ํŒŒ๋“œ ์„ ํƒ (3๊ฐœ ํŒŒ๋“œ = ๊ฐ 33%)
-A KUBE-SVC-... --probability 0.33333 -j KUBE-SEP-aaa
-A KUBE-SVC-... --probability 0.50000 -j KUBE-SEP-bbb
-A KUBE-SVC-...                       -j KUBE-SEP-ccc

# 3๋‹จ๊ณ„: DNAT — ๋ชฉ์ ์ง€๋ฅผ ์‹ค์ œ ํŒŒ๋“œ IP๋กœ ๋ณ€ํ™˜
-A KUBE-SEP-aaa -p tcp -j DNAT --to-destination 10.244.1.7:9376
-A KUBE-SEP-bbb -p tcp -j DNAT --to-destination 10.244.2.3:9376
-A KUBE-SEP-ccc -p tcp -j DNAT --to-destination 10.244.3.6:9376

๐Ÿ’ก ํฌ์ธํŠธ: KUBE-SERVICESKUBE-SVC-*KUBE-SEP-* 3๋‹จ๊ณ„ ์ฒด์ธ ๊ตฌ์กฐ๋กœ, ์„œ๋น„์Šค ๋งค์นญ → ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ → DNAT๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

IPVS ๋ชจ๋“œ (v1.11๋ถ€ํ„ฐ ์•ˆ์ •)๋Š” ์ปค๋„์˜ IP Virtual Server๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ O(1) ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ผ์šด๋“œ๋กœ๋นˆ(rr), ์ตœ์†Œ ์—ฐ๊ฒฐ(lc), ๋ชฉ์ ์ง€ ํ•ด์‹ฑ(dh) ๋“ฑ ๋‹ค์–‘ํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ iptables์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋  ๋•Œ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

nftables ๋ชจ๋“œ (v1.31๋ถ€ํ„ฐ ๋ฒ ํƒ€)๋Š” ๊ฐ€์žฅ ์ตœ์‹  ๋ชจ๋“œ๋กœ, ๋ณ€๊ฒฝ๋œ ์„œ๋น„์Šค/์—”๋“œํฌ์ธํŠธ๋งŒ ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ iptables์™€ IPVS ๋ชจ๋‘๋ฅผ ๋Œ€์ฒดํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

EndpointSlice — ์„œ๋น„์Šค์™€ ํŒŒ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ชฉ๋ก

Service๊ฐ€ "๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋กœ ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค"๊ณ  ํ–ˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ "์–ด๋–ค ํŒŒ๋“œ๋“ค์ด ๋งค์นญ๋˜๋Š”์ง€"๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ EndpointSlice์ž…๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ์— ๋งค์นญ๋˜๋Š” ํŒŒ๋“œ๋“ค์˜ IP:Port ๋ชฉ๋ก์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ๋“œ๊ฐ€ ์ถ”๊ฐ€/์‚ญ์ œ/๊ต์ฒด๋  ๋•Œ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ EndpointSlice๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‘ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค — CoreDNS์™€ kube-proxy. ๋‘˜ ๋‹ค system:coredns / system:node-proxier ClusterRole์— EndpointSlice์— ๋Œ€ํ•œ list/watch ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•ญ์ƒ EndpointSlice๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•˜๋Š” ๊ฑธ๊นŒ์š”?

ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค: ์ •ํ™•ํžˆ ๋ฐ˜๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด, ๊ฐ™์€ Service์— ๋Œ€ํ•ด ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์‹œ์— EndpointSlice๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ Service (ClusterIP๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ)์—์„œ๋Š” CoreDNS๋Š” Service ์˜ค๋ธŒ์ ํŠธ์˜ ClusterIP๋งŒ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๋ฏ€๋กœ EndpointSlice๋ฅผ ์ฐธ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  kube-proxy๊ฐ€ EndpointSlice๋ฅผ ์ฐธ๊ณ ํ•ด์„œ "ClusterIP → ์‹ค์ œ ํŒŒ๋“œ IP" ๋งคํ•‘ ๊ทœ์น™(iptables/IPVS)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

[์ผ๋ฐ˜ Service]
CoreDNS    → Service ์˜ค๋ธŒ์ ํŠธ ์ฐธ๊ณ  (ClusterIP ๋ฐ˜ํ™˜)
kube-proxy → EndpointSlice ์ฐธ๊ณ  (iptables/IPVS ๊ทœ์น™ ์ƒ์„ฑ)

Headless Service (ClusterIP: None)์—์„œ๋Š” ClusterIP๊ฐ€ ์—†์œผ๋ฏ€๋กœ CoreDNS๊ฐ€ EndpointSlice๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํŒŒ๋“œ IP ๋ชฉ๋ก์„ ์ง์ ‘ DNS ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. kube-proxy๋Š” ์ฒ˜๋ฆฌํ•  ClusterIP๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์•„์˜ˆ ๊ด€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[Headless Service]
CoreDNS    → EndpointSlice ์ฐธ๊ณ  (ํŒŒ๋“œ IP ๋ชฉ๋ก ๋ฐ˜ํ™˜)
kube-proxy → ๊ด€์—ฌํ•˜์ง€ ์•Š์Œ

์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค:

์ปดํฌ๋„ŒํŠธ ์ผ๋ฐ˜ Service Headless Service
CoreDNS Service ์˜ค๋ธŒ์ ํŠธ (ClusterIP) EndpointSlice (ํŒŒ๋“œ IP ๋ชฉ๋ก)
kube-proxy EndpointSlice (๋ผ์šฐํŒ… ๊ทœ์น™) ๊ด€์—ฌ ์•ˆ ํ•จ

์„œ๋น„์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ์—ญํ• ์ด ๊น”๋”ํ•˜๊ฒŒ ๋‚˜๋‰˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ํ๋ฆ„์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ™•์ธ ๋ช…๋ น์–ด ๋ชจ์Œ

# CoreDNS ํŒŒ๋“œ ์ƒํƒœ ํ™•์ธ
kubectl get pods -n kube-system -l k8s-app=kube-dns

# kube-proxy ํŒŒ๋“œ ํ™•์ธ
kubectl get pods -n kube-system -l k8s-app=kube-proxy

# ์„œ๋น„์Šค์˜ EndpointSlice ํ™•์ธ
kubectl get endpointslices -l kubernetes.io/service-name=my-backend

# DNS ํ•ด์„ ํ…Œ์ŠคํŠธ (dnsutils ํŒŒ๋“œ์—์„œ)
kubectl exec -it dnsutils -- nslookup my-backend.default.svc.cluster.local

# ํŒŒ๋“œ ๋‚ด๋ถ€ resolv.conf ํ™•์ธ
kubectl exec -it <pod-name> -- cat /etc/resolv.conf

# kube-proxy ๋ชจ๋“œ ํ™•์ธ (๋…ธ๋“œ์—์„œ ์‹คํ–‰)
curl http://localhost:10249/proxyMode

# iptables ๋ชจ๋“œ: ์„œ๋น„์Šค ๊ด€๋ จ ๊ทœ์น™ ํ™•์ธ
iptables-save | grep KUBE-SVC

# IPVS ๋ชจ๋“œ: ๊ฐ€์ƒ ์„œ๋ฒ„ ํ…Œ์ด๋ธ” ํ™•์ธ
ipvsadm -ln

๋งˆ๋ฌด๋ฆฌ

Kubernetes ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹ ์€ ๊ฒฐ๊ตญ 4๊ฐœ์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜‘๋ ฅํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. Service๊ฐ€ ๊ณ ์ •๋œ ์ง„์ž…์ ์„ ์ œ๊ณตํ•˜๊ณ , CoreDNS๊ฐ€ ์„œ๋น„์Šค๋ช…์„ ClusterIP๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , kube-proxy๊ฐ€ ClusterIP๋ฅผ ์‹ค์ œ ํŒŒ๋“œ IP๋กœ ๋ผ์šฐํŒ…ํ•˜๋ฉฐ, EndpointSlice๊ฐ€ "์–ด๋–ค ํŒŒ๋“œ๊ฐ€ ํ˜„์žฌ ์ด ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ์ธ์ง€"๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ EndpointSlice์˜ ๊ฒฝ์šฐ, ์ผ๋ฐ˜ Service์—์„œ๋Š” kube-proxy๋งŒ, Headless Service์—์„œ๋Š” CoreDNS๋งŒ ์ฐธ๊ณ ํ•œ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ์—ญํ• ์ด ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋ฉด, ๋„คํŠธ์›Œํฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‹œ ์–ด๋””๋ฅผ ๋ด์•ผ ํ• ์ง€๋„ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” Service์˜ ์œ ํ˜•๋ณ„ ์ฐจ์ด(ClusterIP, NodePort, LoadBalancer, ExternalName)์™€ Ingress/Gateway API๋ฅผ ํ†ตํ•œ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…์„ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ