ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : 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 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 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
๋ก ์ค์ ํ๋ฉด
์๋น์ค ์๋ํฌ์ธํธ๊ฐ ์๋ ๋
ธ๋๋ ๊ณ ์๋ก ํฌ์ค ์ฒดํฌ์ ์คํจํ์ฌ
๊ฐ์ ๋ก ๋ก๋๋ฐธ๋ฐ์ฑ ํธ๋ํฝ์ ๋ฐ์ ์ ์๋ ๋
ธ๋ ๋ชฉ๋ก์์
์์ ์ ์ค์ค๋ก ์ ๊ฑฐํ๋ค.
์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ด๊ฒ์ ์ด๋ ธํ ์ด์ ์ ์ค์ ํ์ฌ ํ ์คํธํ ์ ์๋ค.
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 ๋ณด์กด์ ์ง์ํ๋ค.
์คํ ์ค์ธ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก
๋ก๋๋ฐธ๋ฐ์๋ฅผ ์์ฒญํ๋ค.
ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๊ณ ์ ์ฐ๊ฒฐ์ ์ฌ๋ ํ๋ก์๋ฅผ ์ด์ฉํ๋ค. ์ด ๊ฒฝ์ฐ ์์ค IP ์ฃผ์๋ ํด๋ผ์ด์ธํธ IP ์ฃผ์๊ฐ ์๋๊ณ ํญ์ ํด๋ผ์ฐ๋ ๋ก๋๋ฐธ๋ฐ์์ IP ์ฃผ์์ด๋ค.
๋ก๋๋ฐธ๋ฐ์์ 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
๋ค์ ๋ด์ฉ
- ์๋น์ค๋ฅผ ํตํ ์ ํ๋ฆฌ์ผ์ด์ ์ฐ๊ฒฐํ๊ธฐ๋ฅผ ๋ ์์ธํ ๋ณธ๋ค.
- ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์ ์์ฑ ๋ฐฉ๋ฒ์ ๋ณธ๋ค.