# 07์ฅ ์๋น์ค
Assembled by GimunLee
# ์๋น์ค
- ํ๋๋ ์ปจํธ๋กค๋ฌ๊ฐ ๊ด๋ฆฌํ๋ฏ๋ก ํ๊ตฐ๋ฐ์ ๊ณ ์ ํด์ ์คํ๋์ง ์๊ณ , ํด๋ฌ์คํฐ ์์ ์ฎ๊ฒจ๋ค๋๋๋ฐ ์ด ๊ณผ์ ์์ ๋ ธ๋๊ฐ ๋ณ๊ฒฝ๋๊ธฐ๋ ํ๊ณ ํด๋ฌ์คํฐ ์ ํ๋์ IP๊ฐ ๋ณ๊ฒฝ๋๊ธฐ๋ ํจ
- ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค๋ ์์ฒ๋ผ ๋์ ์ผ๋ก ๋ณํ๋ ํ๋๋ค์ ๊ณ ์ ์ ์ผ๋ก ์ ๊ทผํ ๋ ์ฌ์ฉ
- ์๋น์ค๋ ์ฃผ๋ก L4 ์์ญ(์ ์ก๊ณ์ธต)์์ ํต์ ํ ๋ ์ฌ์ฉ๋จ
# ์๋น์ค ํ์
ClustserIP
- ๊ธฐ๋ณธ ์๋น์ค ํ์ ์ด๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํจ
- ํด๋ฌ์คํฐ ์ ๋ ธ๋๋ ํ๋์์๋ ClusterIP๋ฅผ ์ด์ฉํด์ ์๋น์ค์ ์ฐ๊ฒฐ๋ ํ๋์ ์ ๊ทผ
- ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์ด์ฉ ๋ถ๊ฐ
NodePort
- ์๋น์ค ํ๋์ ๋ชจ๋ ๋ ธ๋์ ์ง์ ๋ ํฌํธ๋ฅผ ํ ๋น
- ๋ ธ๋์ ์๊ด์์ด ์๋น์ค์ ์ง์ ๋ ํฌํธ ๋ฒํธ๋ง ์ฌ์ฉํ๋ฉด ํ๋์ ์ ๊ทผ ๊ฐ๋ฅ
- ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ
- ์๋์ผ๋ก ์คํ๋๊ณ ์๋ ํ๋๋ก ์ฐ๊ฒฐํด์ฃผ๋ ํน์ง์ด ์์
- ํด๋ฌ์คํฐ ์ธ๋ถ์์ ํด๋ฌ์คํฐ ์ ํ๋๋ก ์ ๊ทผํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ
LoadBalancer
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ง์ํ๋ ๋ก๋๋ฐธ๋ฐ์ ์ฅ๋น์์ ์ฌ์ฉ
๋ก๋๋ฐธ๋ฐ์์ ํ๋๋ฅผ ์ฐ๊ฒฐํ ํ ํด๋น ๋ก๋๋ฐธ๋ฐ์์ IP๋ฅผ ์ด์ฉํด ํด๋ฌ์คํฐ ์ธ๋ถ์์ ํ๋์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋กํจ
kubectl get service
๋ช ๋ น์ผ๋ก ์๋น์ค ์ํ๋ฅผ ํ์ธํ๋ฉด EXTERNAL-IP ํญ๋ชฉ์ ์ธ๋ถ์์ ํ๋์ ์ ๊ทผํ ์ ์๋ ๋ก๋๋ฐธ๋ฐ์ IP ํ์
ExternalName
- ์๋น์ค๋ฅผ .spec.externalName ํ๋์ ์ค์ ํ ๊ฐ๊ณผ ์ฐ๊ฒฐ
- ํด๋ฌ์คํฐ ์์์ ์ธ๋ถ์ ์ ๊ทผํ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ์ด ์๋น์ค๋ก ํด๋ฌ์คํฐ ์ธ๋ถ์ ์ ๊ทผํ๋ฉด ์ค์ ํด๋ CNAME๊ฐ์ ์ด์ฉํด ํด๋ฌ์คํฐ ์ธ๋ถ์ ์ ๊ทผ ๊ฐ๋ฅ
- ์ธ๋ถ์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ด๋ฏ๋ก ์ค์ ํ ๋ ์ ๋ ํฐ(.spec.selector ํ๋)๊ฐ ํ์ ์์
# ์๋น์ค ์ฌ์ฉํ๊ธฐ
# ๊ธฐ๋ณธ์ ์ธ ์ค์
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP # ์๋น์ค ํ์
์ค์ (default: ClusterIP)
clusterIP: 10.0.10.10 # ์ค์ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก IP ์ค์
selector:
app: MyApp # ์๋น์ค์ ์ฐ๊ฒฐํ ํ๋์ ์ค์ ํ .labes ํ๋ ๊ฐ ์ค์
ports: # ์๋น์ค์์ ํ๊บผ๋ฒ์ ํฌํธ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ธ๋ถ์ ์ ๊ณตํ ๋๋ ํ์์ ํ๋๊ฐ์ผ๋ก ์ค์
- protocol: TCP
port: 80
targetPort: 9376
# ๊ด๋ จ ๋ช ๋ น์ด
# ์์ธํ ์๋น์ค ์ ๋ณด ์กฐํ
$ kubectl describe service {์๋น์ค ์ด๋ฆ}
# ํ์ฌ ์คํ ์ค์ธ ํ๋๋ค์ IP ํ์ธ
$ kubectl get pods -o wide
# netshoot ์ปจํ ์ด๋ ํ์ฉํ๊ธฐ
ClusterIP๋ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์์ด์ ๊ฐ๋จํ ํ ์คํธ๋ฅผ ํ๊ธฐ์ํด์๋ ๊ฐ์ ํด๋ฌ์คํฐ ์์ ์ปจํ ์ด๋๋ฅผ ํ๋ ๋์์ผํ๋๋ฐ, ์ด๋ netshoot ์ปจํ ์ด๋๋ฅผ ํ์ฉํ์ฌ ์ฝ๊ฒ ํ ์คํธ ๊ฐ๋ฅ
# ์ปจํ ์ด๋, ํ๋ ์์ฑ ๋ฐ ์คํ $ kubectl run -it --generator=run-pod/v1 --image=nicolaka/netshoot --overrides='{"spec": {"nodeSelector": {"kubernetes.io/hostname": "{์์ปค๋ช }" }}}' netshoot - bash # ์๋น์ค ์์ฑ $ kubectl expose deployment hello-kube --type=NodePort --name=hello-kube-service
# netshoot ์ปจํ ์ด๋
- ๋คํธ์ํฌ ๋ฌธ์ ์ถ์ ์ ์ํด ํ์ํ ์ฌ๋ฌ๊ฐ์ง ๋๊ตฌ๋ฅผ ํฌํจํ ๋ณ๋์ ์ปจํ ์ด๋
# ํ์ฉ ์คํ
$ kubectl run -it --image nicolaka/netshoot testnet bash
$ curl {clusterIP} # ๋งํฌ์
์ถ๋ ฅ
# NodePort ํ์ ์๋น์ค ์ฌ์ฉ
- NodePort ํ์ ์๋น์ค๋ ClusterIP์์ ์๋น์ค ์ด๋ฆ, ํ์ ์ค์ , ์ ์ ํฌํธ ์ด์ธ์๋ ์ค์ ์ด ๊ฐ์
# LoadBalancer ํ์ ์๋น์ค ์ฌ์ฉํ๊ธฐ
- LoadBalancer ํ์ ์๋น์ค๋ ClusterIP์์ ์๋น์ค ์ด๋ฆ, ํ์ ์ค์ ์ด์ธ์๋ ์ค์ ์ด ๊ฐ์
# ExternalName ํ์ ์๋น์ค ์ฌ์ฉํ๊ธฐ
apiVersion: v1
kind: Service
metadata:
name: externalname-service
spec:
type: ExternalName # ํ๋๊ฐ ์ค์
externalName: google.com # ์ฐ๊ฒฐํ๋ ค๋ ์ธ๋ถ ๋๋ฉ์ธ ๊ฐ ์ค์
# ํค๋๋ฆฌ์ค ์๋น์ค
.spec.clusterIP
ํ๋ ๊ฐ์ None์ผ๋ก ์ค์ ํ๋ฉด ํด๋ฌ์คํฐ IP๊ฐ ์๋ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์- ๋ก๋๋ฐธ๋ฐ์ฑ ๋๋ ๋จ์ผ ์๋น์ค IP๊ฐ ํ์ ์์ ๋ ์ฌ์ฉ๊ฐ๋ฅ
- ํค๋๋ฆฌ์ค ์๋น์ค์ ์ ๋ ํฐ๋ฅผ ์ค์ ํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค API๋ก ํ์ธ ๊ฐ๋ฅํ ์๋ํฌ์ธํธ์ ์๋น์ค์ ์ฐ๊ฒฐ๋ ํ๋๋ฅผ ์ง์ ๊ฐ๋ฆฌํค๋ DNS A ๋ ์ฝ๋๊ฐ ์์ฑ๋จ
- ์ ๋ ํฐ๊ฐ ์๋๋ผ๋ DNS ์์คํ ์ ExternalName ํ์ ์ ์๋น์ค์์ ์ฌ์ฉํ CNAME ๋ ์ฝ๋๊ฐ ์์ฑ๋จ
# kube-proxy
- ์ฟ ๋ฒ๋คํฐ์ค์์ ์๋น์ค๋ฅผ ๋ง๋ค์์ ๋ ํด๋ฌ์คํฐ IP๋ ๋ ธ๋ ํฌํธ๋ก ์ ๊ทผํ ์ ์๊ฒ ๋ง๋ค์ด ์ค์ ์กฐ์ํ๋ ์ปดํฌ๋ํธ
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ ธ๋๋ง๋ค ์คํ๋๋ฉด์ ํด๋ฌ์คํฐ ๋ด๋ถ IP๋ก ์ฐ๊ฒฐํ๋ ค๋ ์์ฒญ์ ์ ์ ํ ํ๋๋ก ์ ๋ฌ
- kube-proxy๊ฐ ๋คํธ์ํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ userspace, iptables, IPVS๊ฐ ์์
# userspace ๋ชจ๋
- ํด๋ผ์ด์ธํธ์์ ์๋น์ค์ ํด๋ฌ์คํฐ IP๋ฅผ ํตํด ์ด๋ค ์์ฒญ์ ํ๋ฉด iptables์ ๊ฑฐ์ณ์ kube-proxy ์์ฒญ์ ๋ฐ๊ณ , ์๋น์ค์ ํด๋ฌ์คํฐ IP๋ ์ฐ๊ฒฐ๋์ด์ผ ํ๋ ์ ์ ํ ํ๋๋ก ์ฐ๊ฒฐํด์ค
- ์์ฒญ์ ํ๋๋ค์ ๋๋ ์ค ๋๋ ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์ ์ฌ์ฉ
# i-tables ๋ชจ๋
- userspace ๋ชจ๋์ ๋ค๋ฅธ ์ ์ kube-proxy๊ฐ iptables๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ๋ง ํ๊ณ ์ง์ ํด๋ผ์ด์ธํธ์์ ํธ๋ํฝ์ ๋ฐ์ง ์์
- ํด๋ผ์ด์ธํธ์์ ์ค๋ ๋ชจ๋ ์์ฒญ์ iptables์ ๊ฑฐ์ณ์ ํ๋๋ก ์ง์ ์ ๋ฌ(userspace ๋ชจ๋๋ณด๋ค ์์ฒญ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ์ข์)
- userspace ๋ชจ๋์์ ์ฐ๊ฒฐ ์์ฒญ์ด ์คํจํ๋ฉด ์ฌ์๋ํ์ง๋ง, i-tables ๋ชจ๋์์๋ ์์ฒญ์ด ์คํจ
- ์ปจํ ์ด๋์ readinessProbe๊ฐ ์ค์ ๋์๊ณ ๊ทธ์ ๋ฐ๋ฅธ ํฌ์ค ์ฒดํฌ๊ฐ ์ ์์ ์ผ๋ก ๋์ด์ผ ์ฐ๊ฒฐ ์์ฒญ์ด ์ด๋ฃจ์ด์ง
# IPVS(IP Virtual Server) ๋ชจ๋
- ๋ฆฌ๋ ์ค ์ปค๋์ ์๋ L4 ๋ก๋๋ฐธ๋ฐ์ฑ ๊ธฐ์
- ์ปค๋ ๊ณต๊ฐ์ ๋์ํ๊ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํด์ ํ ์ด๋ธ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ iptables ๋ชจ๋๋ณด๋ค ๋น ๋ฅด๊ณ ์ข์ ์ฑ๋ฅ์ ๋
# ๋ก๋๋ฐธ๋ฐ์ฑ ์๊ณ ๋ฆฌ์ฆ
- rr(round-robin): ํ๋ก์ธ์ค ์ฌ์ด์ ์ฐ์ ์์๋ฅผ ๋์ง ์๊ณ ์์์ ์๊ฐ ๋จ์๋ก CPU ํ ๋น
- lc(least connection): ์ ์ ๊ฐ์๊ฐ ๊ฐ์ฅ ์ ์ ์๋ฒ ์ ํ
- dh(destination hashing): ๋ชฉ์ ์ง IP ์ฃผ์๋ก ํด์๊ฐ์ ๊ณ์ฐํด ๋ถ์ฐํ ์ค์ ์๋ฒ ์ ํ
- sh(source hashing): ์ถ๋ฐ์ง IP ์ฃผ์๋ก ํด์๊ฐ์ ๊ณ์ฐํด ๋ถ์ฐํ ์ค์ ์๋ฒ ์ ํ
- sed(shorts expected deplay): ์๋ต ์๋๊ฐ ๊ฐ์ฅ ๋น ๋ฅธ ์๋ฒ ์ ํ
- nq(never queue): sed์ ๋น์ทํ์ง๋ง ํ์ฑ ์ ์ ๊ฐ์๊ฐ 0์ธ ์๋ฒ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ ํ
# Referenses
- ์ฟ ๋ฒ๋คํฐ์ค ์ ๋ฌธ - 90๊ฐ์ง ์์ ๋ก ๋ฐฐ์ฐ๋ ์ปจํ ์ด๋ ๊ด๋ฆฌ ์๋ํ ํ์ค / ๋์๋ถ์ค
โ 06์ฅ ์ปจํธ๋กค๋ฌ 08์ฅ ์ธ๊ทธ๋ ์ค โ