[Kubernetes] ์๋น์ค(Service)
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ ์ฟ ๋ฒ๋คํฐ์ค ๋คํธ์ํน์ ํต์ฌ์ธ ์๋น์ค(Service)๋ฅผ ์ ๋ฆฌํ๋ค. ํ๋๋ ์ฌ์์ฑ๋ ๋๋ง๋ค IP๊ฐ ๋ฐ๋๋๋ฐ, ์๋น์ค๋ ๊ณ ์ ๋ ์ ์ ์ ์ ๊ณตํด ์์ ์ ์ธ ํต์ ์ ๋ณด์ฅํ๋ค. ์ข ๋ฅ(ClusterIPยทNodePortยทLoadBalancerยทExternalName)์ ๋์ ๋ฐฉ์์ ์ดํด๋ณธ๋ค.
Service๋? ์ฌ๋ฌ ํ๋์ ๋ํ ๋คํธ์ํฌ ์ ์์ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ถ์ ๊ฐ์ฒด. ํ๋ IP๋ ๋ณํ ์ ์์ง๋ง, ์๋น์ค๋ ๊ณ ์ IP + DNS ์ด๋ฆ์ ์ ๊ณตํ๊ณ , ํธ๋ํฝ์ ํ๋์ ๋ถํ ๋ถ์ฐํ๋ค.
1. ์ ์๋น์ค๊ฐ ํ์ํ๊ฐ
ํ๋์ IP๋ ์ฌ์์ฑ ์ ๋ฐ๋๋ค. ํ๋ IP๋ฅผ ์ง์ ์ฐธ์กฐํ๋ฉด ํต์ ์ด ๋๊ธด๋ค. ์๋น์ค๊ฐ ๊ทธ ์์์ ๊ณ ์ ์ ์ ์ญํ ์ ํ๋ค.
flowchart LR
Client(("ํด๋ผ์ด์ธํธ"))
SVC["๐ Service<br/>(๊ณ ์ IPยทDNS)"]
P1["๐ฆ Pod"]
P2["๐ฆ Pod"]
P3["๐ฆ Pod"]
Client --> SVC
SVC --> P1 & P2 & P3
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ๊ณ ์ IP/DNS | ํ๋ IP๊ฐ ๋ณํด๋ ์๋น์ค๋ ๊ทธ๋๋ก |
| ๋ถํ ๋ถ์ฐ | ์ฌ๋ฌ ํ๋์ ํธ๋ํฝ ๋ถ์ฐ |
| ์๋ DNS ๋ฑ๋ก | ์๋น์ค ์ด๋ฆ์ผ๋ก ์ ๊ทผ |
2. ์๋น์ค ์ข ๋ฅ
๋ ธ์ถ ๋ฒ์์ ๋ฐ๋ผ 4๊ฐ์ง๋ก ๋๋๋ค. NodePort๋ ClusterIP๋ฅผ, LoadBalancer๋ NodePort๋ฅผ ํฌํจํ๋ ๋์ ๊ตฌ์กฐ๋ค.
| ์ข ๋ฅ | ๋ ธ์ถ ๋ฒ์ | ์ฉ๋ |
|---|---|---|
| ClusterIP | ํด๋ฌ์คํฐ ๋ด๋ถ๋ง(๊ธฐ๋ณธ๊ฐ) | ํ๋ ๊ฐ ๋ด๋ถ ํต์ |
| NodePort | ๋ ธ๋ IP:ํฌํธ๋ก ์ธ๋ถ | ๊ฐ๋จํ ์ธ๋ถ ๋ ธ์ถ |
| LoadBalancer | ํด๋ผ์ฐ๋ ์ธ๋ถ IP | ์ค์๋น์ค ์ธ๋ถ ๋ ธ์ถ |
| ExternalName | ์ธ๋ถ ๋๋ฉ์ธ ๋ณ์นญ | ์ธ๋ถ ์๋น์ค ์ฐธ์กฐ |
ClusterIP (๊ธฐ๋ณธ)
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
name: my-clusterip-svc
spec:
selector:
app: myapp
ports:
- port: 80 # Service ํฌํธ
targetPort: 8080 # Pod ์ปจํ
์ด๋ ํฌํธ
type: ClusterIP
NodePort
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-svc
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
nodePort: 30000 # ์ธ๋ถ ์ ๊ทผ ํฌํธ(30000~32767)
type: NodePort
LoadBalancer
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-svc
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
๐ก ๋์ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ตํ์. NodePort๋ ๋ด๋ถ์ ์ผ๋ก ClusterIP๋ฅผ ๊ฐ๊ณ , LoadBalancer๋ NodePort๋ฅผ ๊ฐ๋๋ค. ์ฆ LoadBalancer๋ฅผ ๋ง๋ค๋ฉด ClusterIPยทNodePort ๊ธฐ๋ฅ๋ ํจ๊ป ๋ธ๋ ค์จ๋ค. ์ธ๋ถ ๋ ธ์ถ์ ํด๋ผ์ฐ๋๋ฉด LoadBalancer, ์จํ๋ ๋ฏธ์ค ํ ์คํธ๋ฉด NodePort๊ฐ ์ผ๋ฐ์ ์ด๋ค.
3. ์ค์ต โ ๋ช ๋ น์ด๋ก ์๋น์ค ์์ฑ
kubectl expose๋ก ๊ฐ๋จํ ๋ง๋ค ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ํ๋ ์์ฑ
kubectl run mypod --image=nginx --port=80
# ClusterIP (๋ด๋ถ)
kubectl expose pod mypod --name=mypod-svc --type=ClusterIP --port=80
# NodePort (์ธ๋ถ: ๋
ธ๋IP:30001)
kubectl expose pod mypod --name=mypod-svc-nodeport --type=NodePort \
--port=80 --target-port=80 --node-port=30001
curl <๋
ธ๋ IP>:30001
# LoadBalancer (ํด๋ผ์ฐ๋ ์ธ๋ถ IP)
kubectl expose pod mypod --name=mypod-svc-lb --type=LoadBalancer --port=80 --target-port=80
kubectl get svc mypod-svc-lb
4. ์๋น์ค ๋์ ์๋ฆฌ โ kube-proxy
์๋น์ค๋ ๋ด๋ถ์ ์ผ๋ก ๊ฐ ๋ ธ๋์ kube-proxy๊ฐ ์ฒ๋ฆฌํ๋ค. kube-proxy๋ iptablesยทIPVS ๊ท์น์ผ๋ก ์๋น์ค์ ClusterIP๋ก ์จ ํธ๋ํฝ์ ์ ์ ํ ํ๋๋ก ๋ผ์ฐํ ํ๋ค.
๐ก ์๋น์ค๋ ์ค์ฒด๊ฐ ์๋ ํ๋ก์ ์๋ฒ๊ฐ ์๋๋ค. ClusterIP๋ ๊ฐ์ IP์ด๊ณ , ์ค์ ๋ผ์ฐํ ์ ๊ฐ ๋ ธ๋์ kube-proxy๊ฐ ๋ง๋ iptables ๊ท์น์ด ๋ด๋นํ๋ค. ๊ทธ๋์ ํ๋๊ฐ ๋๊ฑฐ๋ ์ค์ด๋ kube-proxy๊ฐ ๊ท์น์ ๊ฐฑ์ ํด ์๋์ผ๋ก ๋ฐ์๋๋ค.
๐ ์ ๋ฆฌ
1
2
3
4
5
์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค
โโ ์ด์ ํ๋ IP ๋ณ๋ โ ๊ณ ์ ์ ์ ํ์
โโ ์ข
๋ฅ ClusterIP(๋ด๋ถ) โ NodePort(๋
ธ๋ํฌํธ) โ LoadBalancer(์ธ๋ถIP)
โโ ๋ถํ๋ถ์ฐ selector๋ก ํ๋ ๊ทธ๋ฃน์ ๋ถ์ฐ
โโ ์๋ฆฌ kube-proxy + iptables/IPVS
| ์ข ๋ฅ | ํ ์ค ์ ์ |
|---|---|
| ClusterIP | ๋ด๋ถ ์ ์ฉ ๊ณ ์ IP |
| NodePort | ๋ ธ๋ ํฌํธ๋ก ์ธ๋ถ ๋ ธ์ถ |
| LoadBalancer | ํด๋ผ์ฐ๋ ์ธ๋ถ IP |
์๋น์ค์ ํต์ฌ์ ๋ณํ๋ ํ๋ IP ์์ ๊ณ ์ ์ ์ ์ ๋๊ณ ๋ถํ๋ฅผ ๋ถ์ฐํ๋ ๊ฒ์ด๋ค. ๋ ธ์ถ ๋ฒ์์ ๋ฐ๋ผ ClusterIP โ NodePort โ LoadBalancer๋ก ํ์ฅ๋๋ฉฐ, ์ค์ ๋์์ kube-proxy๊ฐ ๋ด๋นํ๋ค.
Comments powered by Disqus.