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

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

์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š”๊ฐ€

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ํ•™์Šตํ•˜๋‹ค ๋ณด๋ฉด ํŒŒ๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ๋น„๊ต์  ์ˆ˜์›”ํ•˜๊ฒŒ ๋”ฐ๋ผ๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ "์ด ํŒŒ๋“œ์—์„œ ์ € ํŒŒ๋“œ๋กœ ์–ด๋–ป๊ฒŒ ํ†ต์‹ ํ•˜์ง€?", "์™ธ๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜์ง€?" ๊ฐ™์€ ์งˆ๋ฌธ์— ๋ถ€๋”ชํžˆ๋Š” ์ˆœ๊ฐ„ ๋„คํŠธ์›Œํ‚น์ด๋ผ๋Š” ๋ฒฝ์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์˜ ํ•ต์‹ฌ 3๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•œ๋‹ค:

  1. ํŒŒ๋“œ ๊ฐ„ ๋‚ด๋ถ€ ํ†ต์‹  — DNS์™€ CoreDNS์˜ ์—ญํ• 
  2. ์„œ๋น„์Šค ์œ ํ˜•๋ณ„ ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„ — ClusterIP, LoadBalancer, NodePort, ExternalName
  3. ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ํŒŒ๋“œ๋ผ๋ฆฌ์˜ ํ†ต์‹  — CNI์™€ VXLAN Overlay

1. ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹ ์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ

ํŒŒ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํŒŒ๋“œ์™€ ํ†ต์‹ ํ•˜๋ ค๋ฉด IP ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ฒซ์งธ, ํŒŒ๋“œ๋Š” ์ผ์‹œ์ (ephemeral)์ด๋‹ค. ํŒŒ๋“œ๊ฐ€ ์žฌ์ƒ์„ฑ๋˜๋ฉด IP ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€๋‹ค. ๋‘˜์งธ, ๋ฐ”๋€ IP๋ฅผ ์•Œ ๋ฐฉ๋ฒ•์ด ๋งˆ๋•…์น˜ ์•Š๋‹ค. ์ƒˆ IP๋ฅผ ํŒŒ์•…ํ•˜๋ ค๋ฉด Kubernetes API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐ๋„ท์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๋– ์˜ฌ๋ ค ๋ณด๋ฉด, ๋‹ต์€ ๊ฐ™๋‹ค. ๋„๋ฉ”์ธ ๋„ค์ž„ ์‹œ์Šคํ…œ(DNS)์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋„ ํด๋Ÿฌ์Šคํ„ฐ ์ „์šฉ DNS ์„œ๋ฒ„๋ฅผ ๋‘๊ณ , ์„œ๋น„์Šค ์ด๋ฆ„๊ณผ IP ์ฃผ์†Œ๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์„œ๋น„์Šค — ํŒŒ๋“œ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ์ง„์ž…์ 

์„œ๋น„์Šค(Service)๋Š” ํŒŒ๋“œ๋“ค์ด ๊ณต์œ ํ•˜๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ(Virtual IP)๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋กœ ํŒŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋“ฏ, ์„œ๋น„์Šค๋„ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋กœ ๋Œ€์ƒ ํŒŒ๋“œ์™€ ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ๋‹ค. ์ด๋•Œ ์„œ๋น„์Šค์™€ ํŒŒ๋“œ ์‚ฌ์ด์—๋Š” Endpoints(๋˜๋Š” EndpointSlice) ๋ฆฌ์†Œ์Šค๊ฐ€ ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค. ์…€๋ ‰ํ„ฐ์— ์ผ์น˜ํ•˜๋Š” ํŒŒ๋“œ์˜ IP:Port ๋ชฉ๋ก์ด Endpoints์— ์ž๋™ ๋“ฑ๋ก๋˜๊ณ , kube-proxy๋Š” ์ด ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

์„œ๋น„์Šค๊ฐ€ ์—†๋Š” ํŒŒ๋“œ๋Š” ๋„๋ฉ”์ธ ๋„ค์ž„์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ DNS ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๋‹ค๋ฅธ ํŒŒ๋“œ์—์„œ ์ด๋ฆ„์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.


2. CoreDNS — ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ „์šฉ DNS ์„œ๋ฒ„

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ "์ „์šฉ DNS ์„œ๋ฒ„"๋Š” ๋ฐ”๋กœ CoreDNS ํŒŒ๋“œ๋‹ค.

CoreDNS๋Š” Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋ฐ˜์˜ DNS ์„œ๋ฒ„๋กœ, Kubernetes 1.11๋ถ€ํ„ฐ ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ DNS๋กœ ์ฑ„ํƒ๋˜์—ˆ๋‹ค. ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ kube-dns๋Š” dnsmasq + kube-dns + sidecar 3๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์ง€๋งŒ, CoreDNS๋Š” ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ, ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋กœ ๋™์ž‘ํ•ด ํ›จ์”ฌ ๋‹จ์ˆœํ•˜๋‹ค.

CoreDNS ๋ฐฐํฌ ๊ตฌ์กฐ

๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„ ์„ค๋ช…
Deployment coredns kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๊ธฐ๋ณธ 2 ๋ ˆํ”Œ๋ฆฌ์นด (๊ณ ๊ฐ€์šฉ์„ฑ)
Service kube-dns kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค. ์ด๋ฆ„์ด "kube-dns"์ธ ์ด์œ ๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ
ConfigMap coredns Corefile(์„ค์ • ํŒŒ์ผ)์„ ๋‹ด๊ณ  ์žˆ์Œ
ClusterRole system:coredns Service, Endpoints, Pod, Namespace์— ๋Œ€ํ•œ list/watch ๊ถŒํ•œ
# CoreDNS ํŒŒ๋“œ ํ™•์ธ
kubectl get pods -n kube-system -l k8s-app=kube-dns

# CoreDNS ์„œ๋น„์Šค์˜ ClusterIP ํ™•์ธ
kubectl get svc -n kube-system kube-dns
# NAME       TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)                  AGE
# kube-dns   ClusterIP   192.168.194.138   <none>        53/UDP,53/TCP,9153/TCP   573d

Corefile — CoreDNS์˜ ํ•ต์‹ฌ ์„ค์ •

.:53 {
    errors                          # ์—๋Ÿฌ๋ฅผ stdout์œผ๋กœ ์ถœ๋ ฅ
    health { lameduck 5s }          # ํ—ฌ์Šค์ฒดํฌ ์—”๋“œํฌ์ธํŠธ
    ready                           # readiness ํ”„๋กœ๋ธŒ ์—”๋“œํฌ์ธํŠธ

    kubernetes cluster.local in-addr.arpa ip6.arpa {
        pods insecure               # ํŒŒ๋“œ A ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ (kube-dns ํ˜ธํ™˜)
        fallthrough in-addr.arpa ip6.arpa
        ttl 30                      # DNS TTL 30์ดˆ
    }

    prometheus :9153                # ๋ฉ”ํŠธ๋ฆญ ๋…ธ์ถœ
    forward . /etc/resolv.conf      # cluster.local ์™ธ ์ฟผ๋ฆฌ๋ฅผ upstream DNS๋กœ ์ „๋‹ฌ
    cache 30                        # 30์ดˆ๊ฐ„ ์‘๋‹ต ์บ์‹œ
    loop                            # ๋ฌดํ•œ ๋ฃจํ”„ ๊ฐ์ง€ ์‹œ ์ข…๋ฃŒ
    reload                          # Corefile ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ๋ฆฌ๋กœ๋“œ
    loadbalance                     # A/AAAA ๋ ˆ์ฝ”๋“œ ๋ผ์šด๋“œ๋กœ๋นˆ
}

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ kubernetes ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค. CoreDNS๊ฐ€ ์‹œ์ž‘๋˜๋ฉด Kubernetes API ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜์—ฌ Service, Endpoints, Pod ๋ฆฌ์†Œ์Šค๋ฅผ watchํ•˜๊ณ , ์ˆ˜์‹ ํ•œ ์ •๋ณด๋ฅผ ์ธ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•œ๋‹ค. DNS ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด API ์„œ๋ฒ„์— ๋งค๋ฒˆ ์งˆ์˜ํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ์—์„œ ๋ฐ”๋กœ ์‘๋‹ตํ•œ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ/์‚ญ์ œ๋˜๋ฉด watch ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์บ์‹œ๊ฐ€๊ฐฑ์‹ ๋œ๋‹ค.

DNS ์กฐํšŒ ์ „์ฒด ํ๋ฆ„ (7๋‹จ๊ณ„)

ํŒŒ๋“œ์—์„œ ์„œ๋น„์Šค๋กœ ํŠธ๋ž˜ํ”ฝ์ด ์ „๋‹ฌ๋˜๋Š” ์ „์ฒด ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํŒŒ๋“œ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋น„์Šค ์ด๋ฆ„(์˜ˆ: my-service)์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  2. ํŒŒ๋“œ์˜ /etc/resolv.conf์— ์ง€์ •๋œ nameserver(CoreDNS์˜ ClusterIP)๋กœ DNS ์ฟผ๋ฆฌ๊ฐ€ ์ „์†ก๋œ๋‹ค.
  3. resolv.conf์˜ search ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ my-service.<namespace>.svc.cluster.local๋กœ ํ™•์žฅ๋œ๋‹ค.
  4. CoreDNS๊ฐ€ ์บ์‹œ์—์„œ ํ•ด๋‹น ์„œ๋น„์Šค์˜ ClusterIP๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  5. ํŒŒ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฐ›์€ ClusterIP๋กœ ํŒจํ‚ท์„ ์ „์†กํ•œ๋‹ค.
  6. kube-proxy๊ฐ€ ์„ค์ •ํ•œ iptables/IPVS ๊ทœ์น™์— ์˜ํ•ด ClusterIP๊ฐ€ ์‹ค์ œ ํŒŒ๋“œ IP๋กœ DNAT๋œ๋‹ค.
  7. ํŒจํ‚ท์ด CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ตฌ์„ฑํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋Œ€์ƒ ํŒŒ๋“œ์— ๋„๋‹ฌํ•œ๋‹ค.
# ํŒŒ๋“œ ๋‚ด๋ถ€์˜ /etc/resolv.conf (kubelet์ด ์ž๋™ ์„ค์ •)
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

๐Ÿ’ก ndots:5๋ž€? ์ฟผ๋ฆฌ์— ์ (.)์ด 5๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด FQDN์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , search ๋„๋ฉ”์ธ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋ถ™์—ฌ์„œ ์กฐํšŒํ•œ๋‹ค. my-service๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด ๋จผ์ € my-service.default.svc.cluster.local์„ ์‹œ๋„ํ•˜๋Š” ์ด์œ ๋‹ค.

DNS ์ด๋ฆ„ ํ•ด์„ ๊ทœ์น™

์ฟผ๋ฆฌ ํ•ด์„ ๊ฒฐ๊ณผ ์„ค๋ช…
my-service my-service.default.svc.cluster.local ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
my-service.prod my-service.prod.svc.cluster.local ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
my-service.prod.svc.cluster.local ๊ทธ๋Œ€๋กœ FQDN ์ง์ ‘ ์กฐํšŒ
google.com upstream DNS๋กœ forward cluster.local์— ์—†๋Š” ์™ธ๋ถ€ ๋„๋ฉ”์ธ

CoreDNS๊ฐ€ ์ƒ์„ฑํ•˜๋Š” DNS ๋ ˆ์ฝ”๋“œ

๋ ˆ์ฝ”๋“œ ๋Œ€์ƒ FQDN ํ˜•์‹ ๋ฐ˜ํ™˜๊ฐ’
A/AAAA ์ผ๋ฐ˜ Service <svc>.<ns>.svc.cluster.local ClusterIP
A/AAAA Headless Service <svc>.<ns>.svc.cluster.local ํŒŒ๋“œ IP ๋ชฉ๋ก
SRV ์ด๋ฆ„ ์žˆ๋Š” ํฌํŠธ _<port>._<proto>.<svc>.<ns>.svc.cluster.local ํฌํŠธ ๋ฒˆํ˜ธ + ๋„๋ฉ”์ธ
CNAME ExternalName Service <svc>.<ns>.svc.cluster.local ์™ธ๋ถ€ ๋„๋ฉ”์ธ๋ช…

๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ DNS

๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์— ์กด์žฌํ•œ๋‹ค. ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„๋งŒ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„œ๋น„์Šค๋Š” FQDN์ด ํ•„์š”ํ•˜๋‹ค.

# ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค (default → default)
kubectl exec deploy/sleep-1 -- sh -c 'nslookup numbers-api'
# → numbers-api.default.svc.cluster.local → 192.168.194.228

# ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„œ๋น„์Šค (default → kube-system)
kubectl exec deploy/sleep-1 -- sh -c 'nslookup kube-dns.kube-system.svc.cluster.local'
# → 192.168.194.138

3. ์„œ๋น„์Šค ์œ ํ˜•๋ณ„ ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„

ClusterIP — ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ์ „์šฉ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์„œ๋น„์Šค ์œ ํ˜•์ด๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ์œ ํšจํ•œ ๊ฐ€์ƒ IP๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ํŒŒ๋“œ๊ฐ€ ์–ด๋А ๋…ธ๋“œ์— ์žˆ๋“  ์ด IP๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

kubectl apply -f sleep/sleep2-service.yaml
# service/sleep-2 created

kubectl get svc sleep-2
# NAME      TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
# sleep-2   ClusterIP   192.168.194.221   <none>        80/TCP    7s

โš ๏ธ ClusterIP๋กœ๋Š” ping์ด ์•ˆ ๋œ๋‹ค. ClusterIP๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฐ”์ธ๋”ฉ๋œ ์‹ค์ œ IP๊ฐ€ ์•„๋‹ˆ๋ผ, kube-proxy๊ฐ€ iptables ๊ทœ์น™์œผ๋กœ ํŠน์ • ํ”„๋กœํ† ์ฝœ:ํฌํŠธ ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋งŒ DNAT์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์ƒ IP๋‹ค. ํฌํŠธ ๊ฐœ๋…์ด ์—†๋Š” ICMP(ping) ํŒจํ‚ท์€ ๋งค์นญ๋˜๋Š” ๊ทœ์น™์ด ์—†์–ด ๋“œ๋กญ๋œ๋‹ค.

# ping์€ ์‹คํŒจํ•œ๋‹ค
kubectl exec deploy/sleep-1 -- ping -c 1 sleep-2
# PING sleep-2 (192.168.194.221): 56 data bytes
# (์‘๋‹ต ์—†์Œ)

# TCP ๊ธฐ๋ฐ˜ ํ™•์ธ์€ ์„ฑ๊ณตํ•œ๋‹ค
kubectl exec deploy/sleep-1 -- wget -qO- http://sleep-2
kubectl exec deploy/sleep-1 -- nc -zv sleep-2 80

LoadBalancer — ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์˜ ํ”„๋กœ๋•์…˜ ์ง„์ž…์ 

์™ธ๋ถ€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ค์ œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํ”„๋กœ๋น„์ €๋‹๋œ๋‹ค.

kubectl get svc numbers-web
# NAME          TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
# numbers-web   LoadBalancer   192.168.194.241   192.168.139.2   8080:30732/TCP   61s

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ์ ์€ 8080:30732/TCP๋ผ๋Š” ์ถœ๋ ฅ์ด๋‹ค. 8080์€ ์„œ๋น„์Šค ํฌํŠธ, 30732๋Š” ์ž๋™ ์ƒ์„ฑ๋œ NodePort๋‹ค. ์ด๊ฒƒ์ด ์„œ๋น„์Šค์˜ Superset ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚       LoadBalancer Service            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚      NodePort Service             โ”‚ โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚  โ”‚  โ”‚    ClusterIP Service          โ”‚ โ”‚ โ”‚
โ”‚  โ”‚  โ”‚    (๊ฐ€์ƒ IP: 10.96.x.x)       โ”‚ โ”‚ โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚  โ”‚  NodePort: 30000-32767            โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  External LB + External IP            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

LoadBalancer๋ฅผ ๋งŒ๋“ค๋ฉด NodePort์™€ ClusterIP๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จ๋œ๋‹ค. ์ฆ‰, LoadBalancer ์„œ๋น„์Šค๋Š” ์™ธ๋ถ€ IP + NodePort + ClusterIP ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ชจ๋‘ ๊ฐ€์ง„๋‹ค.

๐Ÿ’ก ๋ถ„์‚ฐ ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์ฐจ์ด: ๊ฐ™์€ YAML ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ผ๋„ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. Docker Desktop์€ localhost ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , K3s๋Š” ํ˜ธ์ŠคํŠธ VM IP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, AKS/EKS ๊ฐ™์€ ํด๋ผ์šฐ๋“œ์—์„œ๋Š” ๊ณต์ธ IP๊ฐ€ ํ• ๋‹น๋œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

NodePort — ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ œ์•ฝ์ด ์žˆ๋Š” ์™ธ๋ถ€ ์ ‘๊ทผ

์™ธ๋ถ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์—†์ด ๋ชจ๋“  ๋…ธ๋“œ์˜ ํŠน์ • ํฌํŠธ(๊ธฐ๋ณธ 30000-32767)๋ฅผ ๊ฐœ๋ฐฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ํŠน์ • ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜จ ํ›„์—๋Š” kube-proxy๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ํŒŒ๋“œ๋กœ ๋ถ„์‚ฐํ•œ๋‹ค.

๋‹จ, NodePort๋Š” ๋…ธ๋“œ ์ˆ˜์ค€์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๋‹จ์ ์ด๋‹ค. ์™ธ๋ถ€์—์„œ ํŠน์ • ๋…ธ๋“œ ํ•˜๋‚˜๋กœ๋งŒ ์š”์ฒญ์ด ์ง‘์ค‘๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋…ธ๋“œ๋“ค ์‚ฌ์ด์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜๋Š” ์™ธ๋ถ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ ์—ญํ• ์ด ๋น ์ ธ ์žˆ๋‹ค.

externalTrafficPolicy — ์•Œ์•„๋‘๋ฉด ์ข‹์€ ์„ค์ •

LoadBalancer์™€ NodePort ์„œ๋น„์Šค์—๋Š” externalTrafficPolicy๋ผ๋Š” ์ค‘์š”ํ•œ ์„ค์ •์ด ์žˆ๋‹ค:

๊ฐ’ ๋™์ž‘ ์žฅ์  ๋‹จ์ 
Cluster (๊ธฐ๋ณธ) ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ํŒŒ๋“œ๋กœ ๋ถ„์‚ฐ ๊ท ๋“ฑ ๋ถ„์‚ฐ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€ ํ™‰ ๋ฐœ์ƒ, ํด๋ผ์ด์–ธํŠธ IP๊ฐ€ SNAT๋จ
Local ์š”์ฒญ ๋ฐ›์€ ๋…ธ๋“œ์˜ ํŒŒ๋“œ๋กœ๋งŒ ์ „๋‹ฌ ํด๋ผ์ด์–ธํŠธ ์›๋ณธ IP ๋ณด์กด, ์ถ”๊ฐ€ ํ™‰ ์—†์Œ ํ•ด๋‹น ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ์—†์œผ๋ฉด ํŠธ๋ž˜ํ”ฝ ๋“œ๋กญ

4. ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ํŒŒ๋“œ๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ(๋งค๋‹ˆ์ง€๋“œ DB, ์™ธ๋ถ€ API ๋“ฑ)๊ณผ ํ†ต์‹ ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ ๋กœ์ปฌ ๋„๋ฉ”์ธ ๋„ค์ž„์„ ํ™œ์šฉํ•˜์—ฌ ์™ธ๋ถ€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

ExternalName ์„œ๋น„์Šค — DNS ์ˆ˜์ค€์˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

ExternalName ์„œ๋น„์Šค๋Š” ๋กœ์ปฌ ์„œ๋น„์Šค ์ด๋ฆ„์„ ์™ธ๋ถ€ ๋„๋ฉ”์ธ์˜ CNAME์œผ๋กœ ์น˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํŒŒ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ์ด๋ฆ„๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋˜๊ณ , ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค DNS๊ฐ€ ์ด๋ฅผ ์™ธ๋ถ€ ๋„๋ฉ”์ธ์œผ๋กœ ํ•ด์†Œํ•ด์ค€๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: numbers-api
spec:
  type: ExternalName
  externalName: raw.githubusercontent.com
kubectl exec deploy/sleep-1 -- sh -c 'nslookup numbers-api | tail -n 5'
# Name:   raw.githubusercontent.com
# Address: 185.199.111.133
# Address: 185.199.108.133

โš ๏ธ HTTP Host ํ—ค๋” ๋ฌธ์ œ: ExternalName์˜ ๊ฐ€์žฅ ํฐ ์ œ์•ฝ์ด๋‹ค. HTTP ์š”์ฒญ ์‹œ Host ํ—ค๋”์—๋Š” ํŒŒ๋“œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋กœ์ปฌ ์ด๋ฆ„(numbers-api)์ด ๋“ค์–ด๊ฐ„๋‹ค. ์™ธ๋ถ€ ์„œ๋ฒ„(GitHub)๋Š” Host: numbers-api๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์š”์ฒญ์ด ์‹คํŒจํ•œ๋‹ค. ๋น„์œ ํ•˜์ž๋ฉด, ํŽธ์ง€๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฑด๋ฌผ(GitHub ์„œ๋ฒ„)์— ๋„์ฐฉํ–ˆ์ง€๋งŒ ํŽธ์ง€ ์•ˆ์— "์ˆ˜์‹ : numbers-api ๊ท€ํ•˜"๋ผ๊ณ  ์ ํ˜€ ์žˆ์–ด์„œ ๊ฑด๋ฌผ ๊ด€๋ฆฌ์ธ์ด "๊ทธ๋Ÿฐ ์‚ฌ๋žŒ ์—†๋Š”๋ฐ์š”?"๋ผ๊ณ  ๊ฑฐ๋ถ€ํ•˜๋Š” ์…ˆ์ด๋‹ค. HTTPS์˜ ๊ฒฝ์šฐ TLS SNI ๋ถˆ์ผ์น˜๋กœ ์ธ์ฆ์„œ ๊ฒ€์ฆ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•˜๋ฏ€๋กœ ๋” ์‹ฌ๊ฐํ•˜๋‹ค.

TCP ํ”„๋กœํ† ์ฝœ(DB ๋“ฑ)์€ Host ํ—ค๋” ๊ฐœ๋…์ด ์—†์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ExternalName์€ TCP ๊ธฐ๋ฐ˜ ์™ธ๋ถ€ ์„œ๋น„์Šค(DB ๋“ฑ)์— ์ ํ•ฉํ•˜๋‹ค.

์ฃผ์˜ํ•  ์ ์ด ํ•˜๋‚˜ ๋” ์žˆ๋‹ค. externalName ํ•„๋“œ์— IP ์ฃผ์†Œ ๋ฌธ์ž์—ด(์˜ˆ: 1.2.3.4)์„ ๋„ฃ์œผ๋ฉด IP๊ฐ€ ์•„๋‹Œ DNS ์ด๋ฆ„์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด ์กฐํšŒ๊ฐ€ ์‹คํŒจํ•œ๋‹ค. IP ์ฃผ์†Œ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์…€๋ ‰ํ„ฐ ์—†๋Š” ์„œ๋น„์Šค + ์ˆ˜๋™ Endpoints — IP ์ˆ˜์ค€์˜ ํ”„๋ก์‹œ

ExternalName์ด DNS ์ˆ˜์ค€์—์„œ ๋™์ž‘ํ•œ๋‹ค๋ฉด, ์ด ๋ฐฉ์‹์€ kube-proxy๋ฅผ ํ†ตํ•œ IP ์ˆ˜์ค€ ํ”„๋ก์‹œ๋‹ค. ClusterIP ์„œ๋น„์Šค๋ฅผ ์…€๋ ‰ํ„ฐ ์—†์ด ๋งŒ๋“ค๊ณ , Endpoints ๋ฆฌ์†Œ์Šค์— ์™ธ๋ถ€ IP๋ฅผ ์ง์ ‘ ์ง€์ •ํ•œ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: numbers-api
spec:
  type: ClusterIP
  ports:
    - port: 80
---
kind: Endpoints
apiVersion: v1
metadata:
  name: numbers-api   # ์„œ๋น„์Šค์™€ ์ด๋ฆ„์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค
subsets:
  - addresses:
      - ip: 192.168.123.234
    ports:
      - port: 80
kubectl get svc numbers-api
# NAME          TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
# numbers-api   ClusterIP   192.168.194.228   <none>        80/TCP    4m27s

kubectl exec deploy/sleep-1 -- sh -c 'nslookup numbers-api | grep "^[^*]"'
# Name:   numbers-api.default.svc.cluster.local
# Address: 192.168.194.228    ← Endpoints IP๊ฐ€ ์•„๋‹Œ ClusterIP๊ฐ€ ๋ฐ˜ํ™˜๋จ

DNS ๊ฒฐ๊ณผ๊ฐ€ Endpoints IP(192.168.123.234)๊ฐ€ ์•„๋‹Œ ClusterIP(192.168.194.228)์ธ ์ด์œ ๋Š”, clusterIP: None์ด ์•„๋‹Œ ์ผ๋ฐ˜ ClusterIP ์„œ๋น„์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. DNS๋Š” ClusterIP๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์‹ค์ œ ์™ธ๋ถ€ IP๋กœ์˜ ๋ผ์šฐํŒ…์€ kube-proxy๊ฐ€ DNAT์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๐Ÿ’ก ๊ณต์‹ Headless Service์™€์˜ ์ฐจ์ด: clusterIP: None์œผ๋กœ ์ •์˜ํ•œ ์„œ๋น„์Šค๊ฐ€ ๊ณต์‹์ ์ธ Headless Service๋‹ค. Headless Service๋Š” ClusterIP ์—†์ด DNS๊ฐ€ ํŒŒ๋“œ IP๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์œ„ ์˜ˆ์‹œ๋Š” ClusterIP๊ฐ€ ํ• ๋‹น๋œ ์„œ๋น„์Šค์ด๋ฏ€๋กœ ์ •ํ™•ํžˆ๋Š” "์…€๋ ‰ํ„ฐ ์—†๋Š” ์„œ๋น„์Šค(Service without selector)"์— ํ•ด๋‹นํ•œ๋‹ค.

์ด ํŒจํ„ด์€ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค. ์™ธ๋ถ€ DB๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€๋กœ ์ด์ „ํ•  ๋•Œ Endpoints์˜ IP๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ํŒŒ๋“œ๋Š” ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋‘ ๋ฐฉ์‹ ๋น„๊ต

๊ตฌ๋ถ„ ExternalName ์…€๋ ‰ํ„ฐ ์—†๋Š” ์„œ๋น„์Šค + Endpoints
๋™์ž‘ ์ˆ˜์ค€ DNS (CNAME ์น˜ํ™˜) IP (kube-proxy DNAT)
ClusterIP ํ• ๋‹น ์•ˆ ๋จ ํ• ๋‹น๋จ
์™ธ๋ถ€ ๋Œ€์ƒ ์ง€์ • ๋„๋ฉ”์ธ ๋„ค์ž„๋งŒ IP ์ฃผ์†Œ๋งŒ
HTTP Host ํ—ค๋” ๋ฌธ์ œ ์žˆ์Œ ์žˆ์Œ
HTTPS/TLS SNI ๋ฌธ์ œ ์žˆ์Œ (๋” ์‹ฌ๊ฐ) ์žˆ์Œ
TCP ์„œ๋น„์Šค ํ˜ธํ™˜ ์ข‹์Œ (DB์— ์ตœ์ ) ์ข‹์Œ
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ™œ์šฉ ์™ธ๋ถ€→์™ธ๋ถ€ ์ „ํ™˜ ์™ธ๋ถ€→๋‚ด๋ถ€ ์ „ํ™˜ (Endpoints IP๋งŒ ๊ต์ฒด)

5. ์„œ๋น„์Šค์˜ ํ•ด์†Œ ๊ณผ์ •๊ณผ Endpoints ๋ผ์ดํ”„์‚ฌ์ดํด

์„œ๋น„์Šค์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡๋‹ค. ํŒŒ๋“œ์˜ DNS ์กฐํšŒ๋Š” CoreDNS๊ฐ€ ์‘๋‹ตํ•˜๊ณ , ํŒŒ๋“œ์—์„œ ๋‚˜์˜จ ๋ชจ๋“  ํ†ต์‹ ์€ ๊ฐ ๋…ธ๋“œ์—์„œ ๋™์ž‘ํ•˜๋Š” kube-proxy๊ฐ€ ๋ผ์šฐํŒ…์„ ๋‹ด๋‹นํ•œ๋‹ค. kube-proxy๋Š” Endpoints์˜ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ, ์šด์˜์ฒด์ œ์˜ ํŒจํ‚ท ํ•„ํ„ฐ(iptables ๋˜๋Š” IPVS)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ClusterIP๋ฅผ ์‹ค์ œ ํŒŒ๋“œ IP๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.

์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ์™€ Endpoints์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์‹ค์Šต์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค:

# 1. ์„œ๋น„์Šค๊ฐ€ ์žˆ์„ ๋•Œ — Endpoints์— ํŒŒ๋“œ IP๊ฐ€ ๋“ฑ๋ก๋จ
kubectl get endpoints sleep-2
# NAME      ENDPOINTS           AGE
# sleep-2   192.168.194.38:80   3m28s

# 2. ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด — ์ƒˆ ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Endpoints๊ฐ€ ์ž๋™ ๊ฐฑ์‹ ๋จ
kubectl delete pods -l app=sleep-2
kubectl get endpoints sleep-2
# NAME      ENDPOINTS           AGE
# sleep-2   192.168.194.40:80   4m2s   ← IP๊ฐ€ ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ ์ž๋™ ๊ฐฑ์‹ 

# 3. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์‚ญ์ œํ•˜๋ฉด — ํŒŒ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ Endpoints๊ฐ€ ๋น„์–ด์ง
kubectl delete deploy sleep-2
kubectl get endpoints sleep-2
# NAME      ENDPOINTS   AGE
# sleep-2   <none>      4m20s       ← ๋Œ€์ƒ ํŒŒ๋“œ ์—†์Œ

# 4. ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฉด — Endpoints๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋จ
kubectl delete svc sleep-2
kubectl get endpoints sleep-2
# Error from server (NotFound): endpoints "sleep-2" not found

์ด๊ฒƒ์ด ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๊ฐ€์น˜๋‹ค. ClusterIP๋Š” ์„œ๋น„์Šค๊ฐ€ ์‚ญ์ œ๋  ๋•Œ๊นŒ์ง€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํŒŒ๋“œ๊ฐ€ ๊ต์ฒด๋˜์–ด๋„ Endpoints๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋˜์–ด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ์˜ ๋ฐฑ์—”๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.


6. ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ํŒŒ๋“œ๋ผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ†ต์‹ ํ• ๊นŒ?

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ์˜ ํ•ต์‹ฌ ์š”๊ตฌ์‚ฌํ•ญ์€ "๋ชจ๋“  ํŒŒ๋“œ๋Š” NAT ์—†์ด ๋‹ค๋ฅธ ๋ชจ๋“  ํŒŒ๋“œ์™€ ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ™์€ ๋…ธ๋“œ๋“ , ๋‹ค๋ฅธ ๋…ธ๋“œ๋“  ์ƒ๊ด€์—†๋‹ค. ์ด๊ฒƒ์„ ์‹คํ˜„ํ•˜๋Š” ๊ฒƒ์ด CNI(Container Network Interface) ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค.

๊ฐ™์€ ๋…ธ๋“œ ๋‚ด ํ†ต์‹ 

๊ฐ™์€ ๋…ธ๋“œ์— ์žˆ๋Š” ํŒŒ๋“œ๋ผ๋ฆฌ๋Š” ๋‹จ์ˆœํ•˜๋‹ค. ๊ฐ ํŒŒ๋“œ๋Š” veth pair(๊ฐ€์ƒ ์ด๋”๋„ท ์Œ)๋กœ ๋…ธ๋“œ์˜ ๋ธŒ๋ฆฟ์ง€(cni0 ๋˜๋Š” cbr0)์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. veth pair์˜ ํ•œ์ชฝ ๋์€ ํŒŒ๋“œ ์•ˆ์—, ๋‹ค๋ฅธ ์ชฝ์€ ๋…ธ๋“œ์˜ ๋ธŒ๋ฆฟ์ง€์— ์žˆ๋‹ค. ๋ธŒ๋ฆฟ์ง€๊ฐ€ L2 ์Šค์œ„์น˜ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, ๊ฐ™์€ ๋…ธ๋“œ์˜ ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹ ์€ ๋ธŒ๋ฆฟ์ง€ ๋‚ด์—์„œ MAC ์ฃผ์†Œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ ์ „๋‹ฌ๋œ๋‹ค.

๋‹ค๋ฅธ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹  — VXLAN Overlay

๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ํŒŒ๋“œ๋ผ๋ฆฌ ํ†ต์‹ ํ•  ๋•Œ๋Š” ํŒจํ‚ท์ด ๋ฌผ๋ฆฌ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์€ VXLAN Overlay๋‹ค. Flannel(๊ธฐ๋ณธ ๋ชจ๋“œ), Calico(vxlan ๋ชจ๋“œ), Cilium ๋“ฑ์ด ์ด ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์บก์Аํ™”(Encapsulation)๋‹ค. ์›๋ณธ ํŒŒ๋“œ ํŒจํ‚ท์„ UDP ํŒจํ‚ท์œผ๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ์„œ ๋…ธ๋“œ ๊ฐ„ ๋ฌผ๋ฆฌ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ต๊ณผ์‹œํ‚จ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋ณด๋ฉด

  1. Pod A (10.244.1.5, Node1)๊ฐ€ Pod C (10.244.2.10, Node2)๋กœ ํŒจํ‚ท์„ ๋ณด๋‚ธ๋‹ค.
  2. ํŒจํ‚ท์ด veth → cni0 ๋ธŒ๋ฆฟ์ง€๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  3. Node1์˜ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์—์„œ 10.244.2.0/24๊ฐ€ VXLAN ํ„ฐ๋„(flannel.1) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋„๋‹ฌ ๊ฐ€๋Šฅํ•จ์„ ํ™•์ธํ•œ๋‹ค.
  4. flannel.1 (VTEP)์ด ์›๋ณธ ํŒจํ‚ท์„ UDP:4789๋กœ ์บก์Аํ™”ํ•œ๋‹ค. ์™ธ๋ถ€ ํ—ค๋”์˜ ๋ชฉ์ ์ง€๋Š” Node2์˜ IP๋‹ค.
  5. ๋ฌผ๋ฆฌ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด Node2๋กœ ์ „์†ก๋œ๋‹ค. ๋ฌผ๋ฆฌ ๋„คํŠธ์›Œํฌ ์ž…์žฅ์—์„œ๋Š” ๊ทธ๋ƒฅ Node1→Node2์˜ ์ผ๋ฐ˜ UDP ํŠธ๋ž˜ํ”ฝ์ด๋‹ค.
  6. Node2์˜ flannel.1์ด ์™ธ๋ถ€ UDP ํ—ค๋”๋ฅผ ๋ฒ—๊ฒจ๋‚ด๊ณ  ์›๋ณธ ํŒŒ๋“œ ํŒจํ‚ท์„ ๋ณต์›ํ•œ๋‹ค.
  7. ๋ณต์›๋œ ํŒจํ‚ท์ด cni0 → veth → Pod C์— ๋„๋‹ฌํ•œ๋‹ค.

CNI ๋ชจ๋“œ ๋น„๊ต

๊ตฌ๋ถ„ VXLAN (Overlay) IP-in-IP BGP (Direct Routing)
์บก์Аํ™” UDP:4789 IP ํ”„๋กœํ† ์ฝœ 4 ์—†์Œ
์˜ค๋ฒ„ํ—ค๋“œ 50๋ฐ”์ดํŠธ 20๋ฐ”์ดํŠธ 0๋ฐ”์ดํŠธ
๋„คํŠธ์›Œํฌ ์š”๊ตฌ L3 (์–ด๋””์„œ๋“  ๋™์ž‘) L3 (IP ํ”„๋กœํ† ์ฝœ 4 ํ—ˆ์šฉ) L2 ๋˜๋Š” BGP ๋ผ์šฐํ„ฐ
์„ฑ๋Šฅ ๋ณดํ†ต ์ข‹์Œ ์ตœ๊ณ 
๋Œ€ํ‘œ CNI Flannel, Calico, Cilium Calico (๊ธฐ๋ณธ) Calico BGP, Flannel host-gw
ํด๋ผ์šฐ๋“œ ํ˜ธํ™˜ ๋ชจ๋“  ํ™˜๊ฒฝ ๋Œ€๋ถ€๋ถ„ ๋ฒ ์–ด๋ฉ”ํƒˆ/์˜จํ”„๋ ˆ๋ฏธ์Šค์— ์ ํ•ฉ

๋งˆ๋ฌด๋ฆฌ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡๋‹ค: CoreDNS๊ฐ€ ์ด๋ฆ„์„ IP๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , kube-proxy๊ฐ€ ๊ฐ€์ƒ IP๋ฅผ ์‹ค์ œ ํŒŒ๋“œ IP๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉฐ, CNI๊ฐ€ ๋…ธ๋“œ ๊ฐ„ ํŒจํ‚ท ์ „๋‹ฌ์„ ์ฑ…์ž„์ง„๋‹ค.

ํ•™์Šตํ•˜๋ฉด์„œ ๋А๋‚€ ์ ์€, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํŠน๋ณ„ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐœ๋ช…ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. DNS, iptables, VXLAN, BGP — ๋ชจ๋‘ ์ด๋ฏธ ๊ฒ€์ฆ๋œ ๋„คํŠธ์›Œํฌ ๊ธฐ์ˆ ์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ด๊ฒƒ๋“ค์„ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์— ๋งž๊ฒŒ ์กฐํ•ฉํ•˜๊ณ  ์ž๋™ํ™”ํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ์กด ๋„คํŠธ์›Œํฌ ์ง€์‹์ด ์žˆ๋‹ค๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ํ•™์Šตํ•  ์ฃผ์ œ๋กœ๋Š” Ingress/Gateway API(HTTP ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…), NetworkPolicy(ํŒŒ๋“œ ๊ฐ„ ๋ฐฉํ™”๋ฒฝ), ์„œ๋น„์Šค ๋ฉ”์‹œ(Istio/Linkerd)(mTLS, ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ) ๋“ฑ์„ ์ถ”์ฒœํ•œ๋‹ค.


์ฐธ๊ณ  ๋ฌธ์„œ

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
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
๊ธ€ ๋ณด๊ด€ํ•จ