Kubernetes Service(1): ClusterIP/NodePort

  • kkumtree

2024-09-27T21:28:17+09:00

kans
clusterip
nodeport
kubernetes

Kubernetes์˜ (์ปจ์…‰, ํ˜น์€ ์ฝ˜์…‰ํŠธ๋ผ ๋ถˆ๋ฆฌ๋Š”) Concepts ์ค‘์—์„œ Service์˜ ์ฃผ์ œ๋ฅผ ๋‹ค๋ค„๋ด…๋‹ˆ๋‹ค.

CloudNet@์—์„œ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” K8s Advanced Network Study(์ดํ•˜, KANS)๋ฅผ ํ†ตํ•ด ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Service Docs์— ๋ช…๋ฃŒํ•˜๊ฒŒ ์ ํ˜€์žˆ๊ธด ํ•˜์ง€๋งŒ,
๋‹จ์œ„ ๊ธฐ๋Šฅ์œผ๋กœ ์ž˜๊ฒŒ ์ชผ๊ฐ  Pod๋Š” ๊ฒฐ๊ตญ ๊ฐœ๋ณ„์ ์ธ IP๋ฅผ ๊ฐ–๊ฒŒ๋˜๋Š”๋ฐ, Blue/Green ์ด๋ฏธ์ง€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น„๋กฏํ•ด์„œ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ƒˆ๋กœ์šด Pod์˜ IP๋ฅผ ๋‹ค๋ฅธ Pod๊ฐ€ IP์ฃผ์†Œ ๊ทธ๋Œ€๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ค์›Œ ์ค‘๊ฐ„์— ๋‘” ๊ฒƒ์œผ๋กœ ์ดํ•ด๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋ ˆ๋ฒจ์—์„œ๋Š” ๊ฐ€์ •์šฉ ๊ณต์œ ๊ธฐ์—์„œ ๋™์ IP ํ™˜๊ฒฝ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด, DDNS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ, MAC ADDR ๊ธฐ์ค€์œผ๋กœ Static IP(DHCP๋ชจ๋“œ์‹œ ํ™œ์šฉ)๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” ๊ฒƒ์„ ์„ž์€ ๊ทธ ์–ด๋”˜๊ฐ€๋กœ ๋‚ฉ๋“ํ•˜๊ณ  ๊ณ„์† ์จ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Service type ๊ทธ๋ฆฌ๊ณ  ClusterIP์™€ NodePort

Service type์€ expose(๋…ธ์ถœ)๋ฒ”์œ„์— ๋”ฐ๋ผ, ์•„๋ž˜์™€ ๊ฐ™์ด 4๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ClusterIP(default): (ํด๋Ÿฌ์Šคํ„ฐ์˜) ๋‚ด๋ถ€ IP ๋Œ€์—ญ์— ๋…ธ์ถœ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋œป์€ ๋™์ผ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ํ•ด๋‹น ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Service์— ๋Œ€ํ•œ ๊ณ ์ •๋œ ํ˜ธ์ถœ๋ฐฉ๋ฒ•์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ, Static Virtual IP(๊ณ ์ • ๊ฐ€์ƒIP)์™€ Domain Name(์ฃผ์†Œ, ํ˜น์€ ๋„๋ฉ”์ธ ๋„ค์ž„)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • NodePort: (ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”) ๊ฐ ๋…ธ๋“œ์˜ ์™ธ๋ถ€IP๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋ณด๋ฉด ๊ณต์œ ๊ธฐ์˜ port-forward ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    ๋ˆˆ๋งŒ ๋œจ๋ฉด ๋Š˜ ์ƒˆ๋กœ์›Œ ๋ณด์ด๋Š” k8s ์ธ์ง€๋ผ, ์ด์ œ์„œ์•ผ ๋ˆˆ์น˜๋ฅผ ์ฑ˜์ง€๋งŒ ClusterIP๋ž‘ ๋ฐฐํƒ€์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • LoadBalancer: ๊ฐ CSP์—์„œ ์ œ๊ณต๋˜๋Š” LB๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค์˜ “์™ธ๋ถ€” ๋…ธ์ถœ๋ฒ”์œ„ ๊ฒฐ์ •๊ถŒ์„ LB์— ๋„˜๊ธฐ๋Š” ๊ฒƒ์œผ๋กœ๋งŒ ์ดํ•ดํ•˜๋Š” ์ค‘์ธ๋ฐ,
    ์ด๊ฑด ๋‹ค์Œ์ฃผ์ฐจ์— ๋‹ค๋ค„์งˆ ์˜ˆ์ •์ธ์ง€๋ผ ์ด๋ฒˆ์—๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ExternalName: CNAME ๋ ˆ์ฝ”๋“œ ๊ด€๋ฆฌ์ด๋ฉฐ, ํ”„๋ก์‹œ๊ฐ€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. no proxying of any kind
    DNS๊ณต๊ธ‰์ž๋ž‘ ํ˜ธํ™˜(ACME)์ด ์•ˆ๋˜๋ฉด ๋‚œ์ด๋„๊ฐ€ ๋งค์šฐ ๋†’์•„์ง€๋Š” ๊ฑธ๋กœ๋งŒ ํŒŒ์•….
    ์ด ๋˜ํ•œ ์ƒ๋žต.

์ด๊ฑฐ๋กœ ClusterIP์™€ NodePort๋ฅผ ๋‹ค ์ดํ•ดํ•˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, iptables ์ฒ˜๋ฆฌ๋„ ์ดํ•ด๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ Network traffic์˜ ๋ฌธ์ œ๋ผ ์–ด๋””์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€๋„ ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.

a. ClusterIP

  • iptables: Control Plane์˜ iptables Rule์— ์˜ํ•ด ๊ฐ ๋…ธ๋“œ์— ๋ฐฐํฌ๋œ Pod์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • load balancing: ๋žœ๋ค์œผ๋กœ ๊ฐ ํŒŒ๋“œ์— ๋ถ€ํ•˜๋ถ„์‚ฐ(๊ณตํ†ต)
  • sessionAffinity: ๊ณ ์ •์ ์ธ ์ ‘์† ์ง€์› ๋ฐ ์ตœ๋Œ€ ์„ธ์…˜ ๊ณ ์ • ์‹œ๊ฐ„[default: 10800 (sec)]์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.

ClusterIP์˜ ๋‹จ์ 

  • Health Check(H/C) ๋ถˆ๊ฐ€: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” Pod์— ์ ‘๊ทผ ๊ฐ€๋Šฅ.
    Readiness Probe ์„ค์ •์œผ๋กœ ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ์—์„œ ์ œ์™ธํ•˜์—ฌ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ.
  • sessionAffinity ์ด์™ธ์—๋Š” ๋ถ„์‚ฐ ๋ฐฉ์‹ ์„ค์ • ๋ถˆ๊ฐ€๋Šฅ.
    cf. IPVS: ๋‹ค์–‘ํ•œ ๋ถ„์‚ฐ๋ฐฉ์‹(์•Œ๊ณ ๋ฆฌ์ฆ˜) ๊ฐ€๋Šฅ.

b. NodePort

  • iptables: ํŠน์ • Node์˜ iptables์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ Public IP ๋“ฑ์„ ํ†ตํ•ด ์ ‘์†ํ•˜๋Š”๋ฐ
    ํ•ด๋‹น ๋…ธ๋“œ ์•ˆ์— ์—†๋Š” Pod์—ฌ๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
  • load balancing: ๋žœ๋ค์œผ๋กœ ๊ฐ ํŒŒ๋“œ์— ๋ถ€ํ•˜๋ถ„์‚ฐ(๊ณตํ†ต)

NodePort์˜ ๋‹จ์ 

  • ๋ณด์•ˆ ์ทจ์•ฝ: ์™ธ๋ถ€์—์„œ ๋…ธ๋“œ์˜ Public IP ๋ฐ ํฌํŠธ๋กœ ์ ‘์†ํ•˜๋‹ˆ๊นŒ. LoadBalancer Service Type์œผ๋กœ ์™ธ๋ถ€ ๊ณต๊ฐœ ์ตœ์†Œํ™”.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ์˜ IP๋ฅผ ์›น์„œ๋ฒ„์—์„œ ์ˆ˜์ง‘ ๋ถˆ๊ฐ€ํ•จ. ๋…ธ๋“œ์˜ IP๋กœ SNAT ๋˜๊ธฐ ๋•Œ๋ฌธ.
    { externalTrafficPolicy: local } ์„ค์ •์‹œ, ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐฐ์น˜๋œ ํŒŒ๋“œ๋กœ๋งŒ ์ ‘์†๋˜๊ธฐ์— SNAT๋˜์ง€ ์•Š์•„ ์ˆ˜์ง‘๊ฐ€๋Šฅ.
  • { externalTrafficPolicy: local } ์ƒํƒœ์—์„œ ํŒŒ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œIP์˜ NodePort๋กœ ์ ‘์† ์‹œ ์‹คํŒจ.
    ์ด ๋˜ํ•œ LB Service Type์—์„œ Probe(H/C)๋กœ ๋Œ€์‘ ๊ฐ€๋Šฅ.

2. kube-proxy ๋ชจ๋“œ ์ •๋ฆฌ

Mode: iptables / ipvs / nftables / eBPF
kube-proxy ๊ฐ€ ์ด์ œ kubernetes ์šด์šฉ์‹œ optional๋กœ ๋˜์—ˆ์ง€๋งŒ, ๊ฐ ๋ชจ๋“œ ์ž์ฒด๋Š” ์ธ์ง€ํ•  ํ•„์š”์„ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

a. user space (deprecated)

  • 1 Port : 1 Service Mapping
  • user space -> kernel space: ๋ณ€ํ™˜ ๋น„์šฉ
  • kube-proxy ํ”„๋กœ์„ธ์Šค ์žฅ์• ์‹œ, SPOF. ๋Œ€์‘์ด ์–ด๋ ค์›€

b. iptables (iptables APIs -> netfilter subsystem)

  • SPOF ํ•ด์†Œ: netfilter๊ฐ€ proxy ์—ญํ• ์„ ๋Œ€์‹  ์ˆ˜ํ–‰
  • kube-proxy: netfilter rule ์ˆ˜์ • ๋‹ด๋‹น, DaemonSet ๊ตฌ์„ฑ

c. IPVS (kernel IPVS, iptables APIs -> netfilter subsystem)

์‚ฌ์‹ค ์ด๊ฑฐ ๋•Œ๋ฌธ์— ์ •๋ฆฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • IPVS ๋ž€?
    • Linux ์ปค๋„๋‹จ์—์„œ ์ œ๊ณตํ•˜๋Š” L4 Load Balancer: transport์—์„œ๋Š” Port๋กœ ์„œ๋น„์Šค ๊ตฌ๋ถ„
      • iptables์™€ ์œ ์‚ฌํ•œ netfilter hook ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋‚˜,
        hash table์„ default ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ , kernel space์—์„œ ๋™์ž‘.
      • ๊ฒฐ๊ตญ, Packet LB ์ˆ˜ํ–‰์‹œ iptable๋ณด๋‹ค ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์ž„.
        • Proxy rule sync ๋ฐ ๋ฆฌ๋””๋ ˆ์…˜ latency, ๋†’์€ network traffic ์ฒ˜๋ฆฌ์— ์žˆ์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ.

d. nftables (ntables API -> netfilter subsystem)

  • Only available on Linux Node, specific Linux kernel(>=5.13) required.
  • Alternative of iptables API for speed and scailability.
  • ํ˜„์žฌ k8s v1.31 ๊ธฐ์ค€, ๋ชจ๋“  network plugin๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์ธ.

e. eBPF (+XDP Networking Module)

  • L3/L4 ๊ตฌ๊ฐ„(Netfilter <-> TCP/UCP)์„ ๊ฑฐ์น˜๋Š” kernel overhead๋งˆ์ € bypass ๋ชฉ์ 

kkumtree

plumber for infra

kkumtree

Source code on GitHub

ยฉ 2025 kkumtree and contributors All rights reserved.
Licensed under
CC BY-NC-ND 4.0