ํ•ด๋‹น ๋ฌธ์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „: v1.33

Kubernetes v1.33 ๋ฌธ์„œ๋Š” ๋” ์ด์ƒ ์ ๊ทน์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ. ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์„œ๋Š” ์ •์  ์Šค๋ƒ…์ƒท์ž„. ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š”, ๋‹ค์Œ์„ ์ฐธ๊ณ . ์ตœ์‹  ๋ฒ„์ „.

์†Œ์Šค IP ์ฃผ์†Œ ์ด์šฉํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด์„œ ์„œ๋กœ๋ฅผ, ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€ ์„ธ๊ณ„๋ฅผ ์ฐพ๊ณ  ํ†ต์‹ ํ•œ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค๋กœ ์ „์†ก๋œ ํŒจํ‚ท์˜ ์†Œ์Šค IP์— ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€์™€ ์ด ๋™์ž‘์„ ํ•„์š”์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์šฉ์–ด

์ด ๋ฌธ์„œ๋Š” ๋‹ค์Œ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

NAT
๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜
์†Œ์Šค NAT
ํŒจํ‚ท ์ƒ์˜ ์†Œ์Šค IP ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋…ธ๋“œ IP ์ฃผ์†Œ๋กœ์˜ ๋ณ€๊ฒฝ์„ ์˜๋ฏธํ•จ.
๋Œ€์ƒ NAT
ํŒจํ‚ท ์ƒ์˜ ๋Œ€์ƒ IP ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ๋“œ IP ์ฃผ์†Œ๋กœ์˜ ๋ณ€๊ฒฝ์„ ์˜๋ฏธํ•จ.
VIP
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ชจ๋“  ์„œ๋น„์Šค์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€, ๊ฐ€์ƒ IP ์ฃผ์†Œ.
Kube-proxy
๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์„œ๋น„์Šค VIP ๊ด€๋ฆฌ๋ฅผ ์กฐ์œจํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋ฐ๋ชฌ.

์ „์ œ ์กฐ๊ฑด

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์˜ˆ์‹œ๋Š” HTTP ํ—ค๋”๋กœ ์ˆ˜์‹ ํ•œ ์š”์ฒญ์˜ ์†Œ์Šค IP ์ฃผ์†Œ๋ฅผ ํšŒ์‹ ํ•˜๋Š” ์ž‘์€ nginx ์›น ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl create deployment source-ip-app --image=registry.k8s.io/echoserver:1.10

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

deployment.apps/source-ip-app created

๋ชฉ์ 

  • ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์ข…๋ฅ˜๋กœ ๋…ธ์ถœํ•˜๊ธฐ
  • ๊ฐ ์„œ๋น„์Šค ์œ ํ˜•์— ๋”ฐ๋ฅธ ์†Œ์Šค IP NAT ์˜ ๋™์ž‘ ์ดํ•ดํ•˜๊ธฐ
  • ์†Œ์Šค IP ์ฃผ์†Œ ๋ณด์กด์— ๊ด€ํ•œ ์ ˆ์ถฉ ์‚ฌํ•ญ ์ดํ•ด

Type=ClusterIP ์ธ ์„œ๋น„์Šค์—์„œ ์†Œ์Šค IP

iptables ๋ชจ๋“œ (๊ธฐ๋ณธ๊ฐ’)์—์„œ kube-proxy๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ํด๋Ÿฌ์Šคํ„ฐIP๋กœ ํŒจํ‚ท์„ ๋ณด๋‚ด๋ฉด ์†Œ์Šค NAT๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š๋Š”๋‹ค. kube-proxy๊ฐ€ ์‹คํ–‰์ค‘์ธ ๋…ธ๋“œ์—์„œ http://localhost:10249/proxyMode ๋ฅผ ์ž…๋ ฅํ•ด์„œ kube-proxy ๋ชจ๋“œ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get nodes

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

NAME                           STATUS     ROLES    AGE     VERSION
kubernetes-node-6jst   Ready      <none>   2h      v1.13.0
kubernetes-node-cx31   Ready      <none>   2h      v1.13.0
kubernetes-node-jj1t   Ready      <none>   2h      v1.13.0

ํ•œ ๋…ธ๋“œ์˜ ํ”„๋ก์‹œ ๋ชจ๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค. (kube-proxy๋Š” ํฌํŠธ 10249์—์„œ ์ˆ˜์‹ ๋Œ€๊ธฐํ•œ๋‹ค.)

# ์งˆ์˜ ํ•  ๋…ธ๋“œ์˜ ์‰˜์—์„œ ์ด๊ฒƒ์„ ์‹คํ–‰ํ•œ๋‹ค.
curl localhost:10249/proxyMode

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

iptables

์†Œ์Šค IP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์†Œ์Šค IP ์ฃผ์†Œ ๋ณด์กด ์—ฌ๋ถ€๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl expose deployment source-ip-app --name=clusterip --port=80 --target-port=8080

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

service/clusterip exposed
kubectl get svc clusterip

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
clusterip    ClusterIP   10.0.170.92   <none>        80/TCP    51s

๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŒŒ๋“œ์—์„œ ํด๋Ÿฌ์Šคํ„ฐIP๋ฅผ ์น˜๋ฉด:

kubectl run busybox -it --image=busybox:1.28 --restart=Never --rm

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Waiting for pod default/busybox to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํŒŒ๋“œ ๋‚ด์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

# "kubectl run" ์œผ๋กœ ํ„ฐ๋ฏธ๋„ ๋‚ด์—์„œ ์ด๊ฒƒ์„ ์‹คํ–‰ํ•œ๋‹ค.
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue
    link/ether 0a:58:0a:f4:03:08 brd ff:ff:ff:ff:ff:ff
    inet 10.244.3.8/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::188a:84ff:feb0:26a5/64 scope link
       valid_lft forever preferred_lft forever

๊ทธ๋Ÿฐ ๋‹ค์Œ wget ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ์ปฌ ์›น ์„œ๋ฒ„์— ์ฟผ๋ฆฌํ•œ๋‹ค.

# "10.0.170.92"๋ฅผ "clusterip"๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค์˜ IPv4 ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
wget -qO - 10.0.170.92
CLIENT VALUES:
client_address=10.244.3.8
command=GET
...

client_address ๋Š” ํด๋ผ์ด์–ธํŠธ ํŒŒ๋“œ์™€ ์„œ๋ฒ„ ํŒŒ๋“œ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ ๋˜๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ํด๋ผ์ด์–ธํŠธ ํŒŒ๋“œ์˜ IP ์ฃผ์†Œ์ด๋‹ค.

Type=NodePort ์ธ ์„œ๋น„์Šค์—์„œ ์†Œ์Šค IP

Type=NodePort์ธ ์„œ๋น„์Šค๋กœ ๋ณด๋‚ด์ง„ ํŒจํ‚ท์€ ์†Œ์Šค NAT๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ ์šฉ๋œ๋‹ค. NodePort ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

service/nodeport exposed
NODEPORT=$(kubectl get -o jsonpath="{.spec.ports[0].nodePort}" services nodeport)
NODES=$(kubectl get nodes -o jsonpath='{ $.items[*].status.addresses[?(@.type=="InternalIP")].address }')

ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ์ƒ์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ์œ„์— ๋ณด๊ณ ๋œ nodes:nodeport๋ฅผ ์œ„ํ•œ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์—ด์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด์ œ ์œ„์— ๋…ธ๋“œ ํฌํŠธ๋กœ ํ• ๋‹น๋ฐ›์€ ํฌํŠธ๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์„œ๋น„์Šค์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

for node in $NODES; do curl -s $node:$NODEPORT | grep -i client_address; done

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

client_address=10.180.1.1
client_address=10.240.0.5
client_address=10.240.0.3

๋ช…์‹ฌํ•  ๊ฒƒ์€ ์ •ํ™•ํ•œ ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ IP ์ฃผ์†Œ์ด๋‹ค. ์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๋Š” node2:nodePort๋กœ ํŒจํ‚ท์„ ๋ณด๋‚ธ๋‹ค.
  • node2๋Š” ์†Œ์Šค IP ์ฃผ์†Œ(SNAT)๋ฅผ ํŒจํ‚ท ์ƒ์—์„œ ์ž์‹ ์˜ IP ์ฃผ์†Œ๋กœ ๊ต์ฒดํ•œ๋‹ค.
  • noee2๋Š” ๋Œ€์ƒ IP๋ฅผ ํŒจํ‚ท ์ƒ์—์„œ ํŒŒ๋“œ์˜ IP๋กœ ๊ต์ฒดํ•œ๋‹ค.
  • ํŒจํ‚ท์€ node 1๋กœ ๋ผ์šฐํŒ… ๋œ ๋‹ค์Œ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŒ… ๋œ๋‹ค.
  • ํŒŒ๋“œ์˜ ์‘๋‹ต์€ node2๋กœ ๋‹ค์‹œ ๋ผ์šฐํŒ…๋œ๋‹ค.
  • ํŒŒ๋“œ์˜ ์‘๋‹ต์€ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‹ค์‹œ ์ „์†ก๋œ๋‹ค.

์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

source IP nodeport figure 01

๊ทธ๋ฆผ. Source IP Type=NodePort using SNAT

์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค IP ์ฃผ์†Œ๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. service.spec.externalTrafficPolicy ์˜ ๊ฐ’์„ Local ๋กœ ํ•˜๋ฉด ์˜ค์ง ๋กœ์ปฌ ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ํ”„๋ก์‹œ ์š”์ฒญํ•˜๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์›๋ณธ ์†Œ์Šค IP ์ฃผ์†Œ๋ฅผ ๋ณด์กดํ•œ๋‹ค. ๋งŒ์•ฝ ๋กœ์ปฌ ์—”๋“œ ํฌ์ธํŠธ๊ฐ€ ์—†๋‹ค๋ฉด, ๊ทธ ๋…ธ๋“œ๋กœ ๋ณด๋‚ด์ง„ ํŒจํ‚ท์€ ๋ฒ„๋ ค์ง€๋ฏ€๋กœ ํŒจํ‚ท ์ฒ˜๋ฆฌ ๊ทœ์น™์—์„œ ์ •ํ™•ํ•œ ์†Œ์Šค IP ์ž„์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŒจํ‚ท์„ ์—”๋“œํฌ์ธํŠธ๊นŒ์ง€ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด service.spec.externalTrafficPolicy ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์ž.

kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

service/nodeport patched

์ด์ œ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

for node in $NODES; do curl --connect-timeout 1 -s $node:$NODEPORT | grep -i client_address; done

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

client_address=104.132.1.79

์—”๋“œํฌ์ธํŠธ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋…ธ๋“œ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ์ธ ๋”ฑ ํ•œ ์ข…๋ฅ˜์˜ ์‘๋‹ต๋งŒ ์ˆ˜์‹ ํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋ ‡๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€:

  • ํด๋ผ์ด์–ธํŠธ๋Š” ํŒจํ‚ท์„ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—†๋Š” node2:nodePort ๋ณด๋‚ธ๋‹ค.
  • ํŒจํ‚ท์€ ๋ฒ„๋ ค์ง„๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ํŒจํ‚ท์„ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ€์ง„ node1:nodePort ๋ณด๋‚ธ๋‹ค.
  • node1์€ ํŒจํ‚ท์„ ์˜ฌ๋ฐ”๋ฅธ ์†Œ์Šค IP ์ฃผ์†Œ๋กœ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŒ… ํ•œ๋‹ค.

์ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

source IP nodeport figure 02

๊ทธ๋ฆผ. Source IP Type=NodePort preserves client source IP address

Type=LoadBalancer ์ธ ์„œ๋น„์Šค์—์„œ ์†Œ์Šค IP

Type=LoadBalancer์ธ ์„œ๋น„์Šค๋กœ ๋ณด๋‚ธ ํŒจํ‚ท์€ ์†Œ์Šค NAT๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋Š”๋ฐ, Ready ์ƒํƒœ๋กœ ๋ชจ๋“  ์Šค์ผ€์ค„๋œ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํŠธ๋ž˜ํ”ฝ์— ์ ํ•ฉํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ์— ํŒจํ‚ท์ด ๋„์ฐฉํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•œ ๋…ธ๋“œ์— ํ”„๋ก์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŒจํ‚ท ์ƒ์—์„œ ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋กœ ์†Œ์Šค IP ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค (์ด์ „ ์„น์…˜์—์„œ ๊ธฐ์ˆ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ).

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด source-ip-app์„ ๋…ธ์ถœํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl expose deployment source-ip-app --name=loadbalancer --port=80 --target-port=8080 --type=LoadBalancer

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

service/loadbalancer exposed

์„œ๋น„์Šค์˜ IP ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get svc loadbalancer

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP       PORT(S)   AGE
loadbalancer   LoadBalancer   10.0.65.118   203.0.113.140     80/TCP    5m

๋‹ค์Œ์œผ๋กœ ์ด ์„œ๋น„์Šค์˜ ์™ธ๋ถ€ IP์— ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.

curl 203.0.113.140

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

CLIENT VALUES:
client_address=10.240.0.5
...

๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์—”์ง„/GCE ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด ๋™์ผํ•œ service.spec.externalTrafficPolicy ํ•„๋“œ๋ฅผ Local๋กœ ์„ค์ •ํ•˜๋ฉด ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋Š” ๊ณ ์˜๋กœ ํ—ฌ์Šค ์ฒดํฌ์— ์‹คํŒจํ•˜์—ฌ ๊ฐ•์ œ๋กœ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ๋ชฉ๋ก์—์„œ ์ž์‹ ์„ ์Šค์Šค๋กœ ์ œ๊ฑฐํ•œ๋‹ค.

์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Source IP with externalTrafficPolicy

์ด๊ฒƒ์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl patch svc loadbalancer -p '{"spec":{"externalTrafficPolicy":"Local"}}'

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์˜ํ•ด service.spec.healthCheckNodePort ํ•„๋“œ๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๊ฒƒ์„ ๋ด์•ผ ํ•œ๋‹ค.

kubectl get svc loadbalancer -o yaml | grep -i healthCheckNodePort

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

  healthCheckNodePort: 32122

service.spec.healthCheckNodePort ํ•„๋“œ๋Š” /healthz์—์„œ ํ—ฌ์Šค ์ฒดํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ํฌํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get pod -o wide -l app=source-ip-app

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

NAME                            READY     STATUS    RESTARTS   AGE       IP             NODE
source-ip-app-826191075-qehz4   1/1       Running   0          20h       10.180.1.136   kubernetes-node-6jst

๋‹ค์–‘ํ•œ ๋…ธ๋“œ์—์„œ /healthz ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด curl ์„ ์‚ฌ์šฉํ•œ๋‹ค.

# ์„ ํƒํ•œ ๋…ธ๋“œ์—์„œ ๋กœ์ปฌ๋กœ ์ด๊ฒƒ์„ ์‹คํ–‰ํ•œ๋‹ค.
curl localhost:32122/healthz
1 Service Endpoints found

๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ๋Š” ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

# ์„ ํƒํ•œ ๋…ธ๋“œ์—์„œ ๋กœ์ปฌ๋กœ ์ด๊ฒƒ์„ ์‹คํ–‰ํ•œ๋‹ค.
curl localhost:32122/healthz
No Service Endpoints Found

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์—์„œ ์‹คํ–‰์ค‘์ธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์šฐ๋“œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ๋˜ํ•œ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ฐ ๋…ธ๋“œ์—์„œ ํฌํŠธ/๊ฒฝ๋กœ(port/path)๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” HTTP ์ƒํƒœ ํ™•์ธ๋„ ํ• ๋‹นํ•œ๋‹ค. ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—†๋Š” 2๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์ƒํƒœ ํ™•์ธ์— ์‹คํŒจํ•  ๋•Œ๊นŒ์ง€ ์•ฝ 10์ดˆ๊ฐ„ ๋Œ€๊ธฐํ•œ ๋‹ค์Œ, curl ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ IPv4 ์ฃผ์†Œ๋ฅผ ์ฟผ๋ฆฌํ•œ๋‹ค.

curl 203.0.113.140

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

CLIENT VALUES:
client_address=198.51.100.79
...

ํฌ๋กœ์Šค-ํ”Œ๋žซํผ ์ง€์›

์ผ๋ถ€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋งŒ Type=LoadBalancer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์†Œ์Šค IP ๋ณด์กด์„ ์ง€์›ํ•œ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์š”์ฒญํ•œ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ณ  ์ƒˆ ์—ฐ๊ฒฐ์„ ์—ฌ๋Š” ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ ์†Œ์Šค IP ์ฃผ์†Œ๋Š” ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๊ณ  ํ•ญ์ƒ ํด๋ผ์šฐ๋“œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ IP ์ฃผ์†Œ์ด๋‹ค.

  2. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ VIP์— ์ „๋‹ฌ๋œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์„ ์ค‘๊ฐ„ ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค IP ์ฃผ์†Œ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋กœ ๋๋‚˜๋Š” ํŒจํ‚ท ์ „๋‹ฌ์ž๋ฅผ ์ด์šฉํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฒ”์ฃผ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋Š” ์ง„์งœ ํด๋ผ์ด์–ธํŠธ IP๋ฅผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด HTTP Forwarded ๋˜๋Š” X-FORWARDED-FOR ํ—ค๋” ๋˜๋Š” ํ”„๋ก์‹œ ํ”„๋กœํ† ์ฝœ๊ณผ ๊ฐ™์€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์— ํ•ฉ์˜๋œ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฒ”์ฃผ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋Š” ์„œ๋น„์Šค์˜ service.spec.healthCheckNodePort ํ•„๋“œ์˜ ์ €์žฅ๋œ ํฌํŠธ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” HTTP ํ—ฌ์Šค ์ฒดํฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜๊ธฐ

์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

kubectl delete svc -l app=source-ip-app

๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ๊ทธ๋ฆฌ๊ณ  ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

kubectl delete deployment source-ip-app

๋‹ค์Œ ๋‚ด์šฉ

์ตœ์ข… ์ˆ˜์ • September 23, 2024 at 12:12 AM PST: [ko] Replace Deprecated echoserver (e200f22f78)