1. ๊ฐ์
Kubernetes์์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๊ณ ์ด์ํ๋ ค๋ฉด Deployment์ Service ํ์ผ์ด ํ์์์. ๊ทธ๋์ ์ด๋ฒ์๋ deployment.yaml
๊ณผ service.yaml
์ ์์ธํ ์ค๋ช
ํ๊ณ , ๊ฐ ์๊ท๋จผํธ๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ ๋ฆฌํด๋ณผ๊ฒ์.
2. Deployment ํ์ผ (deployment.yaml
)
Deployment๋ Kubernetes์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ์ค์ํ ๋ฆฌ์์ค ์ค ํ๋์์.
๊ธฐ๋ณธ ์์ (deployment.yaml
)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
labels:
app: my-app
spec:
replicas: 3 # ์คํํ Pod ๊ฐ์
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: nginx:latest # ์ฌ์ฉํ ์ปจํ
์ด๋ ์ด๋ฏธ์ง
ports:
- containerPort: 80 # ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋
ธ์ถํ ํฌํธ
์ฃผ์ ์๊ท๋จผํธ ์ค๋ช
ํ๋ | ์ค๋ช |
apiVersion | ์ฌ์ฉํ Kubernetes API ๋ฒ์ (apps/v1) |
kind |
์์ฑํ ๋ฆฌ์์ค ํ์
(Deployment ) |
metadata |
์ด๋ฆ, ๋ผ๋ฒจ ๋ฑ ๋ฉํ๋ฐ์ดํฐ ์ค์ |
spec.replicas |
์์ฑํ Pod ๊ฐ์ (3๊ฐ) |
spec.selector.matchLabels |
์ด๋ค ๋ผ๋ฒจ์ ๊ฐ์ง Pod๋ฅผ ๊ด๋ฆฌํ ๊ฒ์ธ์ง ์ค์ |
spec.template |
Pod์ ํ ํ๋ฆฟ ์ ์ (์ค์ ์คํ๋ ์ปจํ ์ด๋ ์ค์ ) |
spec.template.spec.containers |
๋ฐฐํฌํ ์ปจํ ์ด๋ ์ ์ |
image |
์ฌ์ฉํ ์ปจํ
์ด๋ ์ด๋ฏธ์ง (์ฌ๊ธฐ์๋ nginx:latest ) |
ports.containerPort |
์ปจํ ์ด๋ ๋ด๋ถ์์ ์ด์ด๋ ํฌํธ (80๋ฒ) |
์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์ต์
1๏ธโฃ Rolling Update ์ค์
๋ฐฐํฌ ์ค ๋ฌด์ค๋จ ์
๋ฐ์ดํธ๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด strategy
๋ฅผ ์ถ๊ฐํ ์ ์์ด์.
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # ํ ๋ฒ์ ๋ช ๊ฐ์ Pod๊ฐ ์ค๋จ๋ ์ ์๋์ง
maxSurge: 1 # ์ถ๊ฐ๋ก ๋ช ๊ฐ์ Pod๋ฅผ ๋ง๋ค ์ ์๋์ง
2๏ธโฃ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ
env:
- name: ENV_VAR_NAME
value: "my-value"
3๏ธโฃ ์์ ์ ํ ๋ฐ ์์ฒญ ์ค์
resources:
requests:
cpu: "500m" # ์ต์ 0.5 CPU ํ์
memory: "256Mi" # ์ต์ 256MB ๋ฉ๋ชจ๋ฆฌ ํ์
limits:
cpu: "1" # ์ต๋ 1 CPU ์ฌ์ฉ ๊ฐ๋ฅ
memory: "512Mi" # ์ต๋ 512MB ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅ
3. Service ํ์ผ (service.yaml
)
Service๋ Kubernetes ํด๋ฌ์คํฐ ๋ด๋ถ์์ Pod์ ๋ํ ๋คํธ์ํฌ ์ ๊ทผ์ ๊ด๋ฆฌํด์.
๊ธฐ๋ณธ ์์ (service.yaml
)
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app # ์ฐ๊ฒฐํ Pod์ ๋ผ๋ฒจ ์ง์
ports:
- protocol: TCP
port: 80 # ์๋น์ค๊ฐ ํด๋ฌ์คํฐ ๋ด์์ ๋
ธ์ถํ๋ ํฌํธ
targetPort: 80 # ์ค์ ์ปจํ
์ด๋ ๋ด๋ถ์ ํฌํธ
type: ClusterIP # ๊ธฐ๋ณธ๊ฐ (ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ)
์ฃผ์ ์๊ท๋จผํธ ์ค๋ช
ํ๋ | ์ค๋ช |
apiVersion |
์ฌ์ฉํ Kubernetes API ๋ฒ์ (v1 ) |
kind |
์์ฑํ ๋ฆฌ์์ค ํ์
(Service ) |
metadata |
์ด๋ฆ, ๋ผ๋ฒจ ๋ฑ ๋ฉํ๋ฐ์ดํฐ ์ค์ |
spec.selector |
์ฐ๊ฒฐํ Pod๋ฅผ ์๋ณํ๋ ๋ผ๋ฒจ (app: my-app ) |
spec.ports |
์๋น์ค์์ ์ฌ์ฉํ ํฌํธ ์ค์ |
port |
์๋น์ค๊ฐ ์ธ๋ถ์ ๋ ธ์ถํ๋ ํฌํธ (80) |
targetPort |
์ค์ ์ปจํ ์ด๋๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ํฌํธ (80) |
type |
์๋น์ค ํ์
(๊ธฐ๋ณธ๊ฐ: ClusterIP ) |
Service ํ์ ์ข ๋ฅ
ํ์ | ์ค๋ช |
ClusterIP |
๊ธฐ๋ณธ๊ฐ, ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ (์ธ๋ถ ์ ๊ทผ ๋ถ๊ฐ) |
NodePort |
๋ ธ๋์ ํน์ ํฌํธ๋ฅผ ์ด์ด ์ธ๋ถ์์๋ ์ ๊ทผ ๊ฐ๋ฅ (30000-32767 ๋ฒ์) |
LoadBalancer |
ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ํตํด ์ ๊ทผ ๊ฐ๋ฅ |
ExternalName |
DNS ์ฃผ์๋ฅผ ๋ฐํํ์ฌ ์ธ๋ถ ์๋น์ค์ ์ฐ๊ฒฐ |
NodePort ์ฌ์ฉ ์์
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080 # ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ (30000-32767 ๋ฒ์ ๋ด์์ ์ค์ ๊ฐ๋ฅ)
4. Deployment์ Service ์ ์ฉ ๋ฐฉ๋ฒ
1๏ธโฃ Deployment ๋ฐ Service ์์ฑ
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
2๏ธโฃ ๋ฐฐํฌ ์ํ ํ์ธ
kubectl get pods
kubectl get services
3๏ธโฃ Service๋ฅผ ํตํด ์ ๊ทผํ๊ธฐ
ClusterIP
ํ์ : ํด๋ฌ์คํฐ ๋ด๋ถ์์curl http://my-app-service:80
์ฌ์ฉNodePort
ํ์ :http://<๋ ธ๋ IP>:30080
๋ก ์ ์ ๊ฐ๋ฅLoadBalancer
ํ์ : ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ํผ๋ธ๋ฆญ IP ํ ๋น ํ ์ ์
- Deployment๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค๋ก,
replicas
,image
,rollingUpdate
๋ฑ์ ์ค์ ์ด ์ค์ํด์. - Service๋ Pod์ ๋ํ ๋คํธ์ํฌ ์ ๊ทผ์ ์ ๊ณตํ๋ฉฐ,
ClusterIP
,NodePort
,LoadBalancer
๋ฑ์ ํ์ ์ ์ ํํ ์ ์์ด์. - ์ค๋ฌด์์๋ Deployment์ Service๋ฅผ ํจ๊ป ์ฌ์ฉํ์ฌ AI ๋ชจ๋ธ ์๋น, ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๋ฑ์ ์์ ์ ์ํํด์.
์ด ๊ธ์ ํตํด deployment.yaml
๊ณผ service.yaml
์ ๊ตฌ์กฐ์ ์๊ท๋จผํธ๋ฅผ ์ดํดํ๊ณ , Kubernetes ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์ ๋ฐฐํฌํ๋ ๋ฐ ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.