https://koreatstm.tistory.com/188
์ฟ ๋ฒ๋คํฐ์ค
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์์๋ณด๊ธฐ ์์, ์ค์ผ์คํธ๋ ์ด์ ๊ณผ ๊ทธ์ ๊ด๋ จํ ๊ฐ๋ ๋ค์ ์์๋ณด์!! ๊ธฐ๋ณธ๊ฐ๋ ๋ก๋๋ฐธ๋ฐ์ฑ๊ฐ๋ : ์ฌ๋ฌ ์ปจํ ์ด๋์ ์์ฒญ์ ๋ถ์ฐ์์ผ ๋ถํ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ฐฐ๋ถํ๋ ๊ฒ๋ฐฉ๋ฒ: ๋ก๋๋ฐธ๋ฐ์ฑ
koreatstm.tistory.com
์ ๋ฒ์ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๊ตฌ์กฐ์ ๋ํด์ ์์๋ดค๋ค. ์ด๋ฒ์๋ ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ๋ฏ์ด๋ณด๋๋ก ํ์
๋คํธ์ํฌ ์ฐ๊ฒฐ
๋์ปค๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ปจํ ์ด๋ ์ธ๋ถ์ ๋คํธ์ํฌ๊ฐ ๋ ๋ฆฝ์ ์ด๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ํ๋ ๋ด๋ถ์ ๋คํธ์ํฌ๋ฅผ ๊ณต์ ํ๊ธฐ์ ๊ฐ์ ํ๋์ ์ปจํ ์ด๋๋ ๋์ผ ๋คํธ์ํฌ๋ฅผ ๊ณต์ ํ๋ค.
์ด๋, ์ค์ํ ๊ฒ์ ํ๋์ ๋คํธ์ํฌ์ ๋ก์ปฌ ์ปดํจํฐ์ ๋คํธ์ํฌ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌ๋๋ค.
๋ฐ๋ผ์, ์ฟ ๋ฒ๋คํฐ์ค๋ก ํ๋์์ ์ปจํ ์ด๋(์: flask)๋ฅผ ๋์ฐ๊ณ ์์ฒญ ํ์ ๋, ์ธ๋ถ์์ ํด๋น ์ปจํ ์ด๋์์ ์๋ต์ด ์๋ ๊ฒ์ด๋ค.
์ด๋, ์ธ๋ถ์์ ํด๋น ์ปจํ ์ด๋์ ์ ์ํ๋ ค๋ฉด 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
- ํ๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ ์ ๊ทผํ๊ธฐ
- ํ๋์ ๋ด๋ถ ๋คํธ์ํฌ๋ฅผ ์ธ๋ถ์์๋ ์ ์ํ ์ ์๋๋ก ํฌํธ ํฌ์๋ฉ
ํ๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ ์ ๊ทผํ๊ธฐ
# kubectl exec -it [ํ๋๋ช
] -- bash
๋๋
# kubectl exec -it [ํ๋๋ช
] -- sh
---Pod ๋ด๋ถ---
$ curl localhost:80
์ฐธ๊ณ : mac์ 80๋ฒ ํฌํธ ์ฌ์ฉ์ sudo ๊ถํ ํ์
์ฟ ๋ฒ๋คํฐ์ค์์๋ ํ๋ ๋ด๋ถ์ ๋คํธ์ํฌ๋ฅผ ์ปจํ ์ด๋๊ฐ ๊ณต์ ํด์ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํ๋๋ก ์ ์ํด์ ์์ฒญ์ ๋ณด๋์ ๋ ์ ์์ ์ผ๋ก ์๋ต
ํฌํธํฌ์๋ฉ
# kubectl port-forward pod/[ํ๋๋ช
] [๋ก์ปฌ์์์ ํฌํธ]:[ํ๋์์์ ํฌํธ]
$ sudo kubectl port-forward pod/nginx-pod 30001:8080
์ด๋ฏธ์ง ํ ์ ์ฑ
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ yaml ํ์ผ์ ์ฝ์ด๋ค์ฌ ํ๋๋ฅผ ์์ฑํ ๋, ์ด๋ฏธ์ง๋ฅผ ์ด๋ป๊ฒ Pullํ ์ง์ ๋ํ ์ ์ฑ
- Always: ๋ฌด์กฐ๊ฑด ๋ ์ง์คํธ๋ฆฌ(ECR, DockerHub)์์ ๊ฐ์ ธ์ด
- IfNotPresent: ๋ก์ปฌ์์ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์์ ๊ฐ์ ธ์ค๊ณ , ์๋ค๋ฉด ๋ ์ง์คํธ๋ฆฌ์์ ๊ฐ์ ธ์ด
- Never: ๋ฌด์กฐ๊ฑด ๋ก์ปฌ์์ ๊ฐ์ ธ์ด
- ๋ง์ฝ Manifest์์ ์ด๋ฏธ์ง ํ ์ ์ฑ
์ ๋ช
์ ํ์ง ์์ ๊ฒฝ์ฐ
- ์ด๋ฏธ์ง ํ๊ทธ๊ฐ latest or ๋ช ์ ์ ๋จ: Always
- ์ด๋ฏธ์ง ํ๊ทธ๊ฐ latest๊ฐ ์๋ ๊ฒฝ์ฐ: IfNotPresent
์ค์ ์๋น์ค๋ฅผ ์ด์ํ๋ค๋ณด๋ฉด ํธ๋ํฝ์ด ์ฆ๊ฐํ๊ณ ์ด๋ด ๋ ์๋ฒ๋ฅผ ์ํ ํ์ฅ ํ ์ ์๋ค.
์๋ฒ๋ฅผ 3๋๋ก ๋ง๋ค์ด์ ์ค์ตํด๋ณด์
์์
- Dockerfile ์์ฑํ๊ธฐ
- Dockerfile์ ๋ฐํ์ผ๋ก ์ด๋ฏธ์ง ๋น๋ํ๊ธฐ
- ์ด๋ฏธ์ง๊ฐ ์ ์์ฑ๋๋ ์ง ํ์ธํ๊ธฐ
- ๋งค๋ํ์คํธ ํ์ผ ์์ฑํ๊ธฐ
- yamlํ์ผ์ metadata ์ด๋ฆ ์ฌ๋ฌ๊ฐํด์ ๋์ฐ๊ธฐ
- ์ด๊ฑธ ์๋์ผ๋กํ์ง๋ง๊ณ deployment๋ฅผ ์ฌ์ฉ
- ๋งค๋ํ์คํธ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋(Pod) ์์ฑํ๊ธฐ
flask-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: flask-pod-1
spec:
containers:
- name: flask-container
image: flask-server:latest # Flask ์๋ฒ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉ
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000 # Flask ๊ธฐ๋ณธ ํฌํธ
---
apiVersion: v1
kind: Pod
metadata:
name: flask-pod-2
spec:
containers:
- name: flask-container
image: flask-server:latest # Flask ์๋ฒ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉ
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000 # Flask ๊ธฐ๋ณธ ํฌํธ
---
apiVersion: v1
kind: Pod
metadata:
name: flask-pod-3
spec:
containers:
- name: flask-container
image: flask-server:latest # Flask ์๋ฒ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉ
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000 # Flask ๊ธฐ๋ณธ ํฌํธ
$ kubectl apply -f flask-pod.yaml
3๊ฐ์ Flask ์๋ฒ๋ฅผ ๋์ฐ๋ ๋ฐ ์ฑ๊ณตํ๋ค. ๋ง์ฝ ์๋ฒ๊ฐ 300๊ฐ๋ผ๋ฉด?
์ด๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๋ฉด ๋ถํธํ๋ค. ์๋ํ ํ ์ ์๋ ๋ถ๋ถ์ ์๋ํ๋ฅผ ํ๋๊ฒ์ด ์ข๋ค.
์ด๋ฅผ ์ํด Deployment๋ฅผ ์ฌ์ฉํ๋ค.
Deployment๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅธ๋ค๋ฉด ์ฐธ๊ณ
https://koreatstm.tistory.com/188#Deployments%20and%20ReplicaSets-1
์ฟ ๋ฒ๋คํฐ์ค
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์์๋ณด๊ธฐ ์์, ์ค์ผ์คํธ๋ ์ด์ ๊ณผ ๊ทธ์ ๊ด๋ จํ ๊ฐ๋ ๋ค์ ์์๋ณด์!! ๊ธฐ๋ณธ๊ฐ๋ ๋ก๋๋ฐธ๋ฐ์ฑ๊ฐ๋ : ์ฌ๋ฌ ์ปจํ ์ด๋์ ์์ฒญ์ ๋ถ์ฐ์์ผ ๋ถํ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ฐฐ๋ถํ๋ ๊ฒ๋ฐฉ๋ฒ: ๋ก๋๋ฐธ๋ฐ์ฑ
koreatstm.tistory.com
๋ค์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด
- Deployment: ํ๋๋ฅผ ๋ฌถ์ด์ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ํ๋ ๊ธฐ๋ฅ
- ์ฅ์
- ํ๋ ์ ์ง์ -> 100๊ฐ ์ง์ ํ๋ฉด 100๊ฐ ์์ฑ
- ํ๋ ์ข ๋ฃ ์ new ํ๋ ์์ฑ ํตํ ์ ํด์ง ํ๋ ์ ๋ง์ถฐ์ง
Flask-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-deployment
spec:
replicas: 3 # ํ๋ 3๊ฐ๋ก ์ค์
selector:
matchLabels:
app: flask-app # ์ฑ์ ๋ผ๋ฒจ์ ํตํด ํ๋๋ฅผ ์ ํ
template:
metadata:
labels:
app: flask-app # ๋ผ๋ฒจ์ ์ผ์น์์ผ์ ํ๋๋ฅผ ์ ํ
spec:
containers:
- name: flask-container
image: flask-server:latest # Flask ์๋ฒ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉ
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000 # Flask ๊ธฐ๋ณธ ํฌํธ
- ๋ฐฑ์๋ ์๋ฒ 3๊ฐ๋ฅผ ๊ฐ๊ฐ์ ํ๋์ ๋์ ๋ค. ์ค์ ์์ฒญ์ ๋ณด๋ผ ๋๋ ๊ฐ ์๋ฒ์ ๊ท ๋ฑํ๊ฒ ํธ๋ํฝ์ด ๋ถ๋ฐฐ๋์ด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ฉ์๋ณด๊ณ ์ฌ๋ฌ ๋ฐฑ์๋ ์๋ฒ์ ์์์ ๊ท ๋ฑํ๊ฒ ์์ฒญ์ ํ๋ผ๊ณ ์ํฌ ์๋ ์๋ค.
- ๋ฐ๋ผ์ ํ๋ ์๋จ์ ์์์ ์ฌ๋ฌ ํ๋์ ๊ท ๋ฑํ๊ฒ ์์ฒญ์ ๋ถ๋ฐฐํด์ค ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๋ค. -> Service
์๋น์ค
๊ทธ๋ ๋ค๋ฉด ์ปจํ ์ด๋์ ์ ์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ฟ ๋ฒ๋คํฐ์ค์์ ์ปจํ ์ด๋(ํ๋)์ ์ ์ํ๋ ค๋ฉด ์ง์ ์ ๊ทผํ๋ ๊ฒ์ด ์๋๋ผ ์๋น์ค๋ฅผ ํตํด ์ ์ํด์ผ ํ๋ค. ์๋น์ค๋ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ์ฌ ์ปจํ ์ด๋์ ๋ํ ์ ๊ทผ์ ๊ฐ์ ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ๋ก๋ ๋ฐธ๋ฐ์ฑ ๊ธฐ๋ฅ๋ ์ํํ๋ค.
์๋น์ค์ ์ญํ
์ญํ 1: ์ปจํ ์ด๋ ์ ์์ ์ํ ์๋ํฌ์ธํธ ์ ๊ณต
- ๋์ปค์์๋ ์ปจํ ์ด๋ ์คํ ์ ํธ์คํธ ์ปดํจํฐ์ ํฌํธ์ ์ปจํ ์ด๋์ ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ์ ์ํ๋ค.
- ํ์ง๋ง ์ฟ ๋ฒ๋คํฐ์ค์์๋ ํ๋๊ฐ ReplicaSet๊ณผ Deployment์ ์ํด ์์ฑ·์ญ์ ๋๋ฉฐ, ์คํ ์์น๋ ๋ณํ ์ ์๋ค.
- ๋ฐ๋ผ์, ์๋น์ค๋ ๊ฐ์ IP์ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ์ฌ ํ๋๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ผ์ ํ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
์ญํ 2: ๋ก๋ ๋ฐธ๋ฐ์ฑ
- ์๋น์ค๋ ์ฌ๋ฌ ๊ฐ์ ๋์ผํ ํ๋๊ฐ ์์ ๋, ํธ๋ํฝ์ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐํ์ฌ ํน์ ํ๋์ ๋ถํ๊ฐ ์ง์ค๋์ง ์๋๋ก ํ๋ค.
- ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ์ ๋์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
์๋น์ค ๊ตฌ์กฐ
์๋น์ค๋ ๊ฐ์IP์ฃผ์์ ๋คํธ์ํฌ ์ฃผ์ ๋ณํ์ ํตํด ์๋ํ๋ค.
- ๊ฐ์ IP ์ฃผ์: ์๋น์ค๊ฐ ์ ๊ณตํ๋ ๋ด๋ถ IP ์ฃผ์์ด๋ฉฐ, ํด๋ฌ์คํฐ ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ๋คํธ์ํฌ ์ฃผ์ ๋ณํ(NAT): ์๋น์ค์ ์ ์ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์ ์ ํ ํ๋๋ก ํธ๋ํฝ์ ์ ๋ฌํ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ํ ๋นํ๋ ๊ฐ์ IP๋ ๋ฌผ๋ฆฌ์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ ๋ฐ์ธ๋ฉ๋์ง ์์ผ๋ฉฐ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ๋ผ์ฐํ ๋๋ ๋ ผ๋ฆฌ์ ์ธ ์ฃผ์
- ๋ฐ๋ผ์, ํด๋ฌ์คํฐ ๋ฐ๊นฅ์์๋ ํด๋น IP๊ฐ ์ด๋๋ก ์ฐ๊ฒฐ๋๋์ง ์ ์ ์์ผ๋ฉฐ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ ๊ทธ๋ฐ์ง์?
- ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ํต์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๋ณ๊ฒฝ๋๋ ํ๋์ ์์น๋ฅผ ์๋น์ค๊ฐ ์๋์ผ๋ก ์ถ์ ํ ์ ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
- ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์ ๊ทผ์ด ํ์ํ๋ค๋ฉด, NodePort๋ LoadBalancer ๊ฐ์ ๋ค๋ฅธ ์๋น์ค ์ ํ์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ฌ์ฉ์๋ ์๋น์ค์ IP์ ํฌํธ๋ฅผ ์ด์ฉํด ์ ์ํ๋ฉด ์๋น์ค๊ฐ ์ด๋ฅผ ์ ์ ํ ํ๋๋ก ์ฐ๊ฒฐํด์ค๋ค.
์๋น์ค ์ ํ๊ณผ ํน์ง
์ ํ | ํน์ง | ์ ํฉํ ์ํฉ |
ClusterIP (default) | - ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ - ๊ฐ์ IP๋ฅผ ๋ถ์ฌํ์ฌ ๋ด๋ถ ํธ๋ํฝ์ ๋ผ์ฐํ |
๋ด๋ถ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํต์ |
NodePort | - ๊ฐ ๋
ธ๋์ ๊ณ ์ ๋ ํฌํธ๋ฅผ ํตํด ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ - ํด๋ฌ์คํฐIP + ๋ ธ๋์ IP + ์ง์ ๋ ํฌํธ ํ์์ผ๋ก ์ ์ |
์ธ๋ถ์์ ์ง์ ์ ๊ทผ์ด ํ์ํ ๊ฒฝ์ฐ (๊ฐ๋ฐ/ํ ์คํธ ํ๊ฒฝ) |
LoadBalancer | - ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์์ฑํ์ฌ ์๋น์ค ์ฐ๊ฒฐ - NodePort + ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ๊ฒฐํฉํ ํํ |
AWS, GCP, Azure ๋ฑ์ ํด๋ผ์ฐ๋์์ ์ด์ํ ๋ |
ExternalName | - ๋ด๋ถ ์๋น์ค๊ฐ ์๋ ์ธ๋ถ ์๋น์ค(๋๋ฉ์ธ)๋ก ํธ๋ํฝ์ ์ ๋ฌ | ์ธ๋ถ API ๋๋ ์ธ๋ถ ์๋น์ค์์ ์ฐ๋ |
์๋น์ค์ ์๋ ๊ณผ์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค์ ๊ฐ์ IP๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค์ kube-proxy๊ฐ ์์ฒญ์ ๊ฐ์งํ๊ณ , ๋ด๋ถ์ ์ผ๋ก NAT์ ์ํํ์ฌ ์ ์ ํ ํ๋๋ก ์ ๋ฌํ๋ค.
- ํ๋๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ฐํํ๋ค.
- ์๋น์ค๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
์ค์ต
https://koreatstm.tistory.com/277#%EB%B0%B0%ED%8F%AC-1
์ฟ ๋ฒ๋คํฐ์ค ๋ก์ปฌ ์ค์ต
Flask๋ก ๋ง๋ ์น์ฌ์ดํธ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค๋ก ๋์ด๋ณด์ Flask ๋ด์ฉhttps://koreatstm.tistory.com/category/%F0%9F%90%BC%20%EB%B0%B1%EC%95%A4%EB%93%9C/Flask '๐ผ ๋ฐฑ์ค๋/Flask' ์นดํ ๊ณ ๋ฆฌ์ ๊ธ ๋ชฉ๋ก koreatstm.tistory.com ๋ฐฐํฌ Dockerfi
koreatstm.tistory.com
์ฟ ๋ฒ๋คํฐ์ค ๋คํธ์ํฌ
ClusterIP
- ๊ธฐ๋ณธ ์๋น์ค ์ ํ์ผ๋ก, ํด๋ฌ์คํฐ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ IP๋ฅผ ํ ๋น
- NodePort ์ฌ์ฉ ๊ฐ๋ฅํ๋ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์ ๋ํด ์ง์ ๋ ํฌํธ๋ฅผ ๋ถ์ฌํ๋ฏ๋ก ํฌํธ ๋ญ๋น
- ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ณ , ์ค์ง ๊ฐ์ ํด๋ฌ์คํฐ ๋ด์ ํ๋๋ค๋ง ์ ๊ทผํ ์ ์์
- ์๋น์ค ๋ด๋ถ ํต์ ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ธ๋ถ์์ ์ฐ๊ฒฐ์ด ํ์ ์๋ ์๋น์ค๋ค(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์ ์๋ฒ ๋ฑ)์ ์ ํฉ
์ฟ ๋ฒ๋คํฐ์ค์์ ์ธ๋ถ ํธ๋ํฝ์ ๋ด๋ถ๋ก ์ฐ๊ฒฐํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ
NodePort
- ๊ฐ ๋ ธ๋์ ํน์ ํฌํธ๋ฅผ ๊ฐ๋ฐฉํ์ฌ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํจ
- ํด๋ฌ์คํฐIP:๋ ธ๋ํฌํธ ํ์์ผ๋ก ์ ๊ทผ
- EX) http://<Node IP>:<NodePort> ๋ก ์ ๊ทผ
- ๋จ์ : ํน์ ๋ ธ๋๊ฐ ๋ค์ด๋๋ฉด ์ ๊ทผ ๋ถ๊ฐ
- ํด๋ฌ์คํฐ ๋ด์ ๋ชจ๋ ๋
ธ๋์ ํน์ ํฌํธ๋ฅผ ๊ฐ๋ฐฉํ์ฌ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ค.
- ํ์ง๋ง, Auto-scailing์ด ์ผ์ด๋๋ฉด ํด๋ฌ์คํฐ ๋ด์ ๋
ธ๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ ์ธก์์ ๋์ ์ผ๋ก ๋ณํํ๋ ๋
ธ๋์ ์๋ํฌ์ธํธ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์
- ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ: ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๋ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉ
- ํ์ง๋ง ์ด๋ ์ถ๊ฐ์ ์ธ ๊ด๋ฆฌ ๋ณต์ก์ฑ์ ์ผ๊ธฐํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ๋ ธ๋๊ฐ ์ถ๊ฐ๋ ๊ฒฝ์ฐ์ ์ด๋ฅผ ์๋์ผ๋ก ์ธ์ํ๊ณ ์ ์ ํ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ด ํ์ -> LoadBalancer ์ฌ์ฉ
- ์ LoadBalancer๊ฐ ์ ํฉํ๊ฐ?
- ๋จ์ผ IP ์๋ํฌ์ธํธ ์ ๊ณต: ๋จ์ผ IP ์ฃผ์ ํตํด ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฌ ๋ ธ๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋๋ ํด๋ผ์ด์ธํธ๋ ์ด ๋จ์ผ ์๋ํฌ์ธํธ๋ง์ ์ฐธ์กฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ๋ ธ๋๋ค์ ๋คํธ์ํฌ ๋ณํ์ ๋ํ ๊ฑฑ์ ์์ด ์๋น์ค๋ฅผ ์์ ์ ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ
- ์๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ: ํด๋ฌ์คํฐ ๋ด์์ ๋ค์ํ ๋ ธ๋์ ํ๋์ ํธ๋ํฝ์ ๋ถ๋ฐฐํ๊ณ , ์คํ ์ค์ผ์ผ๋ง์ด ์ ์ฉ๋ ๊ฒฝ์ฐ์๋ ์์ ์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณต๊ฐ๋ฅ
- ํ์ง๋ง, Auto-scailing์ด ์ผ์ด๋๋ฉด ํด๋ฌ์คํฐ ๋ด์ ๋
ธ๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ ์ธก์์ ๋์ ์ผ๋ก ๋ณํํ๋ ๋
ธ๋์ ์๋ํฌ์ธํธ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์
๐ ์์ : kubectl expose deployment my-app --type=NodePort --port=80
LoadBalancer (ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ธ๋ถ ํธ๋ํฝ ์ฒ๋ฆฌ)
- ํด๋ผ์ฐ๋ ํ๊ฒฝ(AWS, GCP, Azure)์์ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์์ฑํ์ฌ ์ธํฐ๋ท์์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํจ
- NodePort ๋ฐฉ์๋ณด๋ค ๋ ์์ ์ ์ด๊ณ ๋ถํ ๋ถ์ฐ ๊ฐ๋ฅ
- ๋ณดํต ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋์์ LoadBalancer๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ์ธ๋ถ IP๊ฐ ํ ๋น๋จ
๐ ์์ : kubectl expose deployment my-app --type=LoadBalancer --port=80
Ingress (๋๋ฉ์ธ ๊ธฐ๋ฐ ํธ๋ํฝ ๊ด๋ฆฌ)
- ์ฌ๋ฌ ์๋น์ค์ ๋ํ ๋๋ฉ์ธ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ์ค์ ํ ์ ์์
- ์๋ฅผ ๋ค์ด, example.com/api๋ API ์๋น์ค๋ก, example.com/web์ ์น ์๋น์ค๋ก ๋ณด๋ผ ์ ์์
- NodePort์ LoadBalancer๋ฅผ ์ฌ์ฉํ๋ฉด ์๋น์ค๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ๋ ธ์ถํด์ผ ํ์ง๋ง, Ingress๋ ํ๋์ ์๋ํฌ์ธํธ๋ก ์ฌ๋ฌ ์๋น์ค ๊ด๋ฆฌ ๊ฐ๋ฅ
- ๋ณดํต Ingress Controller(NGINX, Traefik ๋ฑ)๊ฐ ํ์ํจ
์ ๋ฆฌํด๋ณด์
- ClusterIP: ๋ด๋ถ์์ ๋ด๋ถ (ํด๋ฌ์คํฐ ๋ด์ ๋ค๋ฅธ ์๋น์ค๋ค์ด ์ด ์๋น์ค๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ์)
- NodePort, LoadBalancer, Ingress: ์ธ๋ถ์์ ๋ด๋ถ (์ธ๋ถ์์ ํด๋ฌ์คํฐ ๋ด ์๋น์ค๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ์)
- ExternalName: ๋ด๋ถ์์ ์ธ๋ถ (ํด๋ฌ์คํฐ ๋ด์์ ์ธ๋ถ ์๋น์ค์ ์ ๊ทผํ๋ ๋ฐฉ์)
ํ๋ผ๋ฌ
๊ฐ๋
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์์ ํ๋ ๊ฐ ํต์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ
- ํ๋ ๊ฐ์ IP ๋คํธ์ํฌ๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค ๋ด์์ ํ๋๋ค์ด ์๋ก ํต์ ํ ์ ์๊ฒ ํด์ค๋ค.
Flannel๊ณผ ์๋น์ค์ ๊ด๊ณ ๋ฐ ์ฐจ์ด์
1. Flannel (ํ๋ ๊ฐ ํต์ )
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์์ ํ๋ ๊ฐ์ ๋คํธ์ํฌ ํต์ ์ ๊ด๋ฆฌ
- ๊ฐ ํ๋๋ ๊ณ ์ ์ IP ์ฃผ์๋ฅผ ๊ฐ์ง๋ฉฐ, Flannel์ ์ด IP ์ฃผ์๋ฅผ ๋คํธ์ํฌ์์ ๋ผ์ฐํ ํด ํ๋ ๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์๋ ์๋ฆฌ: ํด๋ฌ์คํฐ์์ ๊ฐ ๋
ธ๋์ Flannel DaemonSet์ ๋ฐฐํฌ
- ์ด๋ฅผ ํตํด ๊ฐ ๋ ธ๋์ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ค์ ํ์ฌ ํ๋ ๊ฐ์ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์๋น์ค๊ฐ ์ธ๋ถ๋ ๋ค๋ฅธ ํ๋์ ๋ํ ์ ๊ทผ์ ์ฒ๋ฆฌํ ๋, Flannel์ ํตํด ๊ฐ ํ๋๊ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์์ด์ผ ์์ฒญ์ ์ ๋ฌํ ์ ์๋ค.
2. ์๋น์ค (ํ๋ ์ ๊ทผ์ ์ํ ์๋ํฌ์ธํธ ์ ๊ณต)
- ์๋น์ค๋ ์ธ๋ถ๋ ํด๋ฌ์คํฐ ๋ด์์ ํ๋์ ์ ๊ทผํ ์ ์๋ ๋จ์ผ ์ง์
์ (endpoint)์ ์ ๊ณต
- ํ๋๋ ํด๋ฌ์คํฐ ๋ด์์ ๋์ ์ผ๋ก ์์ฑ๋๊ณ ์ญ์ ๋๋ฉฐ, ์ด๋ฌํ ํ๋๋ค์ ๋ํด ์๋น์ค๋ ๊ณ ์ ๋ ๊ฐ์ IP๋ฅผ ํ ๋นํ์ฌ ํ๋๋ค์ ์ฃผ์ ๋ณ๊ฒฝ์ ๊ด๊ณ์์ด ์์ ์ ์ธ ์ ๊ทผ์ ์ ๊ณตํ๋ค.
- ์๋ ์๋ฆฌ: ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค์ IP๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด kube-proxy๊ฐ ํด๋น ์์ฒญ์ ๋ฐ์ ์๋น์ค์ ๊ฐ ํ๋๋ก ๋ผ์ฐํ
- ์ด๋ ์๋น์ค๋ ๊ฐ์ IP์ ๋คํธ์ํฌ ์ฃผ์ ๋ณํ (NAT)์ ํตํด ์์ฒญ์ ์ ์ ํ ํ๋๋ก ์ ๋ฌ
- ์๋น์ค๋ Flannel์ ํตํด ํต์ ํ๋ ํ๋๋ค์ ๋ํด ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ , Flannel์ด ์ค์ ํ IP ๋คํธ์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋์ ๋ํ ์์ฒญ์ ๋ผ์ฐํ ํ๋ค.
ํต์ฌ ์ ๋ฆฌ
ํ๋ผ๋ฌ๋ก ๊ตฌ์ถํ IP ๋คํธ์ํฌ๊ฐ ์์ผ๋ฉด, ์๋น์ค๋ ์๋ํฌ์ธํธ์ ์ ์์ ๊ฐ์ ์ปดํจํฐ์ ํ๋๋ก๋ง ์ฐ๊ฒฐํ ์ ์์
์๋ฅผ ๋ค์ด, ํด๋ฌ์คํฐ์ ํ ๋ ธ๋์์ ํ๋๊ฐ ์คํ๋๊ณ , ๊ทธ ๋ ธ๋์ ์๋น์ค๊ฐ ๋ค๋ฅธ ๋ ธ๋์ ๋ค๋ฅธ ํ๋์ ์ฐ๊ฒฐํ๋ ค๊ณ ํ ๋, Flannel ๋คํธ์ํฌ๊ฐ ์์ผ๋ฉด ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฉฐ ๊ทธ ์๋น์ค๋ ๊ฐ์ ๋ ธ๋์ ์๋ ํ๋๋ค๋ง ๋์์ผ๋ก ์์ฒญ์ ์ ๋ฌํ ์ ์๋ค. ๋ค๋ฅธ ๋ ธ๋์ ์๋ ํ๋๋ก์ ์์ฒญ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ ๊ทธ๋ฐ๊ฐ?
Flannel์ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ํด๋ฌ์คํฐ ๋ด ์ฌ๋ฌ ๋ ธ๋์์ ์คํ๋๋ ํ๋๋ค์ด ์๋ก ํต์ ํ ์ ์๊ฒ ๋์์ค๋ค. Flannel ๋คํธ์ํฌ๊ฐ ์์ผ๋ฉด, ์๋น์ค๋ ํด๋ฌ์คํฐ ๋ด ํ๋๋ค์ด ์์นํ ๋์ผ ๋ ธ๋์๋ง ์ ๊ทผํ ์ ์๊ฒ ๋๊ณ , ํด๋ฌ์คํฐ ๋ด ๋ค๋ฅธ ๋ ธ๋์์ ์คํ ์ค์ธ ํ๋๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์๊ฒ ๋๋ค.
์ถ์ฒ
'๐ณ ์ธํ๋ผ > Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฟ ๋ฒ๋คํฐ์ค ๋ก์ปฌ ์ค์ต (0) | 2025.03.31 |
---|---|
์ฟ ๋ฒ๋คํฐ์ค ๋ก๋๋ฐธ๋ฐ์ฑ ๋ฐ ํฌ์ค์ฒดํฌ (0) | 2025.03.22 |
์ฟ ๋ฒ๋คํฐ์ค (1) | 2024.09.11 |