์ฟ ๋ฒ๋คํฐ์ค์์ ํ๋๋ ์๊ฒผ๋ค ์ฃฝ์๋ค๋ฅผ ๋ฐ๋ณตํ๊ณ , ์ฃฝ์ ๋๋ง๋ค IP๊ฐ ๋ฐ๋๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ป๊ฒ ํ๋๋ฅผ ์ฐพ์์ผ ํ ๊น์? IP๋ฅผ ํ๋์ฝ๋ฉํด๋๋ฉด ์ฃฝ์ ๋๋ง๋ค ์ค์ ์ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ Service์ ๋๋ค. ํ๋๋ค ์์ ๊ณ ์ ๋ ์ง์ ์ (VIP, Virtual IP)์ ๋ง๋ค์ด์, ํด๋ผ์ด์ธํธ๋ ํญ์ ๊ฐ์ ์ฃผ์๋ก ์ ๊ทผํ๊ณ Service๊ฐ ๋ค์์ ์ด์์๋ ํ๋๋ก ์ฐ๊ฒฐํด์ค๋๋ค.
๐ Service์ ์ข ๋ฅ โ ์ํฉ์ ๋ง๊ฒ ๊ณจ๋ผ ์ฐ๊ธฐ
| ํ์ | ์ ๊ทผ ๋ฒ์ | ์ฌ์ฉ ์ผ์ด์ค |
|---|---|---|
| ClusterIP | ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง | ๋ด๋ถ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํต์ |
| NodePort | ๋ชจ๋ ๋ ธ๋์ ํน์ ํฌํธ ๊ฐ๋ฐฉ | ๊ฐ๋ฐ/ํ ์คํธ ํ๊ฒฝ, ์ธ๋ถ ์ ๊ทผ |
| LoadBalancer | ํด๋ผ์ฐ๋ ๋ก๋๋ฐธ๋ฐ์ ์ฌ์ฉ | ํ๋ก๋์ ์ธ๋ถ ๋ ธ์ถ |
๐ง ClusterIP โ ๋ด๋ถ ํต์ ์ ๊ธฐ๋ณธ
# nginx-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
spec:
type: ClusterIP # ๊ธฐ๋ณธ๊ฐ
selector:
app: nginx # ์ด ๋ผ๋ฒจ์ ๊ฐ์ง ํ๋๋ฅผ ๋ฌถ์
ports:
- port: 80
targetPort: 80
kubectl apply -f nginx-clusterip.yaml
kubectl get svc
ClusterIP๋ ์ธ๋ถ์์ ์ ๊ทผ์ด ์ ๋ฉ๋๋ค. ํ ์คํธํ๋ ค๋ฉด ์์ ํ๋๋ฅผ ํด๋ฌ์คํฐ ๋ด๋ถ์ ๋์์ ํ์ธํฉ๋๋ค.
# ์์ ํ๋๋ก ๋ด๋ถ ํต์ ํ
์คํธ
kubectl run test --image=busybox --rm -it -- \
wget -qO- http://nginx-clusterip
# Nginx ๊ธฐ๋ณธ HTML์ด ์ถ๋ ฅ๋๋ฉด ์ฑ๊ณต!
๐ง NodePort โ ์ธ๋ถ์์ ์ ๊ทผํ๊ธฐ
# nginx-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 30000-32767 ๋ฒ์์์ ์ง์
kubectl apply -f nginx-nodeport.yaml
# Master ๋
ธ๋์์ curl ํ
์คํธ
curl http://192.168.56.10:30080
# ํธ์คํธ PC ๋ธ๋ผ์ฐ์ ์์๋ http://192.168.56.10:30080 ์ผ๋ก ์ ์ ๊ฐ๋ฅ
NodePort์ ์๋ฆฌ: ์ด๋ ๋
ธ๋(๋ง์คํฐ๋ ์์ปค๋ )๋ก ๋ค์ด์๋ 30080 ํฌํธ๋ก ์ค๋ฉด ๋ฐฑ์๋ ํ๋๋ก ์ฐ๊ฒฐํด์ค๋๋ค. kube-proxy๊ฐ ๊ฐ ๋
ธ๋์์ iptables ๊ท์น์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ์ ํต์ฌ โ Label Selector
์๋น์ค๊ฐ ๋ฐฑ์๋ ํ๋๋ฅผ ์ฐพ๋ ๊ธฐ์ค์ IP๊ฐ ์๋๋ผ Label์ ๋๋ค.
selector:
app: nginx # ์ด ๋ผ๋ฒจ์ด ๋ถ์ ํ๋๋ ์ ๋ถ ์๋น์ค์ ํฌํจ
ํ๋๊ฐ ์ฃฝ๊ณ ์๋ก ์๊ฒจ์ IP๊ฐ ๋ฐ๋์ด๋, ๋ผ๋ฒจ๋ง ๋์ผํ๋ฉด ์๋น์ค๋ ์๋์ผ๋ก ์ ํ๋๋ก ์ฐ๊ฒฐํฉ๋๋ค. ํ๋์ IP๋ฅผ ๋ชฐ๋ผ๋ ๋๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ ๋๋ค.
๐ ์์ปค ๋ ธ๋ ๋ ๋ฒจ์์ ์ง์ ํ์ธํ๊ธฐ
์ค์ต ์ค์ “Worker ๋ ธ๋์์ ์๊ธฐ๊ฐ ์คํ ์ค์ธ ํ๋๋ฅผ ์ด๋ป๊ฒ ๋ณด๋?” ๊ถ๊ธํด์ ธ์ ์ง์ ๋ค์ด๊ฐ๋ดค์ต๋๋ค.
# ์ปจํ
์ด๋ ๋ฐํ์(containerd) ๋ ๋ฒจ์์ ์ง์ ํ์ธ
sudo crictl ps
# Master์์ ํน์ ๋
ธ๋์ ํ๋๋ง ํํฐ๋ง
kubectl get pods -o wide --field-selector spec.nodeName=k8s-worker1
crictl ps๋ฅผ ๋ณด๋ฉด ์ฟ ๋ฒ๋คํฐ์ค ๋ ์ด์ด ๋ฐ์์ containerd๊ฐ ์ค์ ๋ก ํ๋ก์ธ์ค๋ฅผ ๋๋ฆฌ๊ณ ์๋ค๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค. ์ถ์ํ ๋ ์ด์ด ์๋๊ฐ ๊ถ๊ธํ ๋ ์ ์ฉํ ๋ช
๋ น์ด์
๋๋ค.
๐ก ์ ๋ฆฌ
ClusterIP์ NodePort๋ฅผ ์ฐ๋ฉด:
- ClusterIP โ ๋ด๋ถ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์๋ก๋ฅผ ์ฐพ๋ ์์ ์ ์ธ ๋ฐฉ๋ฒ
- NodePort โ ์ธ๋ถ ํด๋ผ์ด์ธํธ๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
๋จ, NodePort๋ IP:ํฌํธ ์กฐํฉ์ด ๋์ด๋ ์๋ก ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๋๋ค. ์๋น์ค๊ฐ 10๊ฐ๋ฉด ํฌํธ๋ 10๊ฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ์ฃ .
๋ค์ ๊ธ์์๋ ์ฌ๋ฌ ์๋น์ค๋ฅผ ํ๋์ ๋๋ฉ์ธ์ผ๋ก ํตํฉ ๊ด๋ฆฌํ๋ Ingress Controller๋ฅผ ๋ค๋ฃน๋๋ค.