[Kubernetes] 3. Controller๋ก ๋ ๋์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ
์ฐ๋ฆฌ๋ ์ฟ ๋ฒ๋คํฐ์ค์ 4๊ฐ ๊ฐ์ฒด๋ค์ ์ญํ ๊ณผ ๊ทธ๋ค์ ๋ชจ์์ผ๋ก ํ ์๋น์ค๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์ํ๋ ๋ฐ ์์ด ๊ธฐ๋ณธ์ ์ธ ์์๋ผ๋ ๊ฒ์ ์์์ต๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ์๋น์ค์ ํธ๋ํฝ์ ๋ฐ๋ผ ์ปจํ ์ด๋๋ฅผ ์๋์ผ๋ก ์ฆ๊ฐ์์ผ์ฃผ๋ ์ค์ผ์ผ ์ /์์, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ batch ์์ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ , ๋ฐฐํฌ์ ๋์ฑ ๋น์ ๋ฐํํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Controller
์ฟ ๋ฒ๋คํฐ์ค์ ์ปจํธ๋กค๋ฌ๋ ์ด์ ์ ์ค๋ช ํ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐํฌํ ์๋น์ค๋ค์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐ์์ผ์ฃผ๋ ์กด์ฌ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ์ ์๋น์ค๋ ์ฌ์ฉ์๊ฐ ๋ง์ ์์ฒญ ์๊ฐ ๋ง์ ๊ฒ์ด๋ฏ๋ก Namespace์ ๋ถ์ฌ๋ ๋ฆฌ์์ค ํ์ฉ๋์ ํํ์ฌ ํธ๋ํฝ๋์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑ/์ญ์ ํ๋ ์คํ ์ค์ผ์ผ๋ง ๊ธฐ๋ฅ, ๋ด ์๋น์ค ์๋จ์ ๋ก๊ทธ๋ฅผ ์์งํ๊ฑฐ๋ ๋ฐ๋ชฌ์ ์ง์์ ์ผ๋ก ๋์์์ผ์ฃผ๋ DaemonSet ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ด ์กด์ฌํฉ๋๋ค.
- Replication Controller / Set
- DaemonSet
- Job
- StatefulSet
- Deployment
์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ๋ณธ ๊ฐ์ฒด๋ก๋ ์๋น์ค๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ๋ ํฐ ๋ฌด๋ฆฌ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ Controller๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ๋ ์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๊ณ , ์๊ฐ์ ์ค์ผ ์ ์๋๋ฐ์. ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ์ฃ .
Replication Controller / Set
Replication Controller์ ReplicationSet์ ์ง์ ๋ ์ ๋งํผ Pod๋ฅผ ๊ฐ๋์ํค๊ณ , ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด ์ปจํธ๋กค๋ฌ๊ฐ ๊ด๋ฆฌํ๋ ์ฃผ ๋๋ชฉ์๋ 3๊ฐ์ง๊ฐ ์๋๋ฐ, ๊ทธ ๋๋ชฉ์ ์๋์ ๊ฐ์ต๋๋ค.
- Replica์ ์
- Pod Selector
- Pod Template
Replica์ ์๋ Docker Swarm์์๋ ์ ๊ณตํ๋ Replica์ฒ๋ผ ์ปจํ ์ด๋์ ์, ์ฆ Pod์ ์๋ฅผ ๋งํฉ๋๋ค. ๋ด๊ฐ ์ง์ ํ ๊ฐฏ์๋งํผ Pod์ ๋์ฐ๊ฒ ๋๋ฉฐ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ๋์ฐ๊ฒ ๋ฉ๋๋ค.
Pod Selector๋ label selector์ ๋์ผํฉ๋๋ค. label์ ๊ธฐ๋ฐ์ผ๋กํ์ฌ Replication Controller๊ฐ ๊ด๋ฆฌํ Pod์ ๊ฐ์ ธ์ค๋ ์ญํ ์ ํฉ๋๋ค. Replication Controll๊ฐ ๋ฌธ์์ด์ equal ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐํ์ฌ label์ ์ ํํ๋ค๋ฉด, ReplicationSet์ Set์ ๊ธฐ๋ฐ์ผ๋ก label์ ์ ํํ๋๋ฐ, Replication Controller์ Replication Set์ ์ด ์ ๋ง ์ ์ธํ๋ค๋ฉด ๊ฑฐ์ ๋์ผํ ์ญํ ์ ํฉ๋๋ค.
Pod Template์ Pod์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ธ ์๋ ๊ณณ์ผ๋ก Pod์ ์ถ๊ฐ๋ก ๊ธฐ๋ํ์์ ๋ ์ด๋ป๊ฒ Pod์ ๋ง๋ค์ง,(์๋น์คํ ํฌํธ ์ฃผ์๋ IP ์ฃผ์์ ์ค์ ๋ฑ) Pod์ ๋ํ ์ ๋ณด (๋์ปค ์ด๋ฏธ์ง, ํฌํธ ์ฃผ์, ๋ผ๋ฒจ ๋ฑ)๋ฅผ ๋ด๊ฒจ๋๋ ๊ณณ์ ๋๋ค. ์ด๋ Replication Controller๊ฐ Pod์ ์ฌ์์ ํน์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ ์ฉ๋์ด๋ฏ๋ก ๋งค์ฐ ์ค์ํ ๊ฒ์ ๋๋ค.
Replication Controller๊ฐ ๋์ํ๋ ํํ๋ ๋์ถฉ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค. Replication Controller๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด 3๊ฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์๋์ ํ๋ค๋ฉด ์ด๋ฏธ์ง์ ์ฃผ์์์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ Pull ํ ํ, Pod ์ ๋ณด์ ๊ธฐ๋ฐํ์ฌ ์๋ก์ด Pod์ ์์ฑํฉ๋๋ค.
๋ง์ฝ, ๊ธฐ์กด์ ์ด๋ฏธ label์ด app:nk-app์ผ๋ก ๋์ด์ง Pod์ด ์ด๋ฏธ ์กด์ฌํ ์ํ๋ก Replication Controller์ ์์ฑํ๋ฉด, label์ด app:nk-app์ธ Pod๋ค์ ์ด ์๊ฐ๋ถํฐ Replication Controller์ ํ๋ถ์ ์ํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ์ด ๋๋ถํด Pod๋ค์ด Replication Controller์ ์ํด ์ ์ด๋๋ฉฐ, ๋ง์ฝ ์ด ์ปจํธ๋กค๋ฌ์ ์ค์ ๋ Replica์ ์๋ณด๋ค Pod์ ์๊ฐ ์ ์ผ๋ฉด ์๋กญ๊ฒ Pod์ ํ๋์ฉ ์์ฑํฉ๋๋ค. (๊ทธ๋ฌ๋ Pod์ ์๊ฐ ๋ง๋ค๊ณ ํ์ฌ ๊ธฐ์กด์ ๋์๋ Pod์ด ์ญ์ ๋์ง ์์ต๋๋ค.)
apiVersion: v1
kind: ReplicationController
metadata:
name: nk-app-controller
spec:
replicas: 3
selector:
app: nk-app
template:
metadata:
name: nk-app
labels:
app: nk-app
spec:
containers:
- name: nk-app
image: http://[docker-registry-address]/nk-app:latest
ports:
- containerPort: 80
apiVersion: v1
kind: ReplicationSet
metadata:
name: nk-app-controller
spec:
replicas: 3
selector:
app: nk-app
template:
metadata:
name: nk-app
labels:
app: nk-app
spec:
containers:
- name: nk-app
image: http://[docker-registry-address]/nk-app:latest
ports:
- containerPort: 80
์ด๋ฅผ YAML๋ก ์ ์ํด๋ณด๋ฉด ์์ ๊ฐ์ต๋๋ค. kind๋ ReplicationController ํน์ ReplicationSet์ผ๋ก ๋ง์ถ๊ณ , ์ด ์ปจํธ๋กค๋ฌ์ ์ด๋ฆ์ nk-app-controller๋ผ๊ณ ์ ์ํ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก Pod์ ๊ฐฏ์๋ฅผ 3๊ฐ๋ก ๊ณ ์ ํ๊ณ , app selector๋ฅผ ์ด์ฉํ์ฌ label์ด app: nk-app์ธ Pod๋ง์ ๊ณจ๋์ผ๋ฉฐ Pod์ ์์ฑํ ๊ฒฝ์ฐ, label์ name: nk-app์ผ๋ก ์ก๊ณ , ๊ทธ์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ spec: containers์ ์ ์ํ์์ต๋๋ค.
Docker ์ด๋ฏธ์ง๋ ๊ธฐ์กด์ Docker๋ฅผ ์ฌ์ฉํ๋ ๊ทธ๋๋ก Docker engine์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๋ง๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ด๊ฐ ์ฌ์ฉํ๋ ๋์ปค ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ ฅํ ๋ค, ์ด๋ฏธ์ง ์ด๋ฆ์ ์ ๋ ฅํ๋ฉด ๋๊ณ , Dockerhub์ ์ ์ฅ๋์ด ์๋ ์ ๋ช ๋์ปค ์ด๋ฏธ์ง(ubuntu, nginx, postgres)๋ฅผ ์ด์ฉํ ๋๋ ๋์ปค ๋ ์ง์คํธ๋ฆฌ ์ฃผ์๋ฅผ ์๋ตํ๊ณ , ์ด๋ฏธ์ง ์ด๋ฆ๋ง์ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ์์ผ๋ก ๊ธฐ์กด์ ์ฐ๋ฆฌ๊ฐ Pod์ ํ๋ ์์ฑํ๊ธฐ ์ํด Pod์ ํ๋์ฉ ๋ง๋ค์๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ Replication Controller๋ฅผ ์ด์ฉํด์ ์ข ๋ ํธํ๊ฒ Pod์ ์์ฑํ ์ ์์ต๋๋ค.
Deployment
๊ทธ๋ฐ๋ฐ, Replication Controller์ด๋ Set์ ๋จ์ํ Pod์ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ง๋์นฉ๋๋ค. ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ๋ถ๋ก ์๋น์คํ๋ ค๋ฉด ์๋น์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ ํ ํ๋ ๋ ๋ง๋ค์ด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ฃ .
Deployment๋ Replica Controller๋ Replica Set๋ณด๋ค ์ข ๋ ์ถ์ํ๋ ๊ฐ๋ ์ ๋๋ค. ์ค์ ์ด์ ๋ ๋ฒจ์์๋ Deployment๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ฉฐ ์ ๋ํ ํ ํ์ฌ์์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
Replica Controller๋ฅผ ์ด์ฉํ์ฌ ์๋์ผ๋ก Pod๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ํํ๋ฅผ ๋ง๋ ๋ค์ Service์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ด ํ์ฌ๋ก์จ๋ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ฐ์ดํธ ๋์ด ์๋ก ๋ฐฐํฌํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ ์ ๊ฒฝ์ฐ, Docker Swarm์ ์ด์ฉํ์ฌ Blue-Green ๋ฐฐํฌ ๋ฐฉ์์ ์ด์ฉํ์ฌ ์๋ก ์ ๋ฐ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋ค, ์ฐจ๋ก๋ก ์ฌ๋ ค์ ธ ์๋ ์ปจํ ์ด๋๋ฅผ ์๋ฉธ์ํค๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ์์ต๋๋ค. ์ด ๋, ๊ธฐ์กด์ ๋ฐ์ํ๋ ํธ๋ํฝ์ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ก ์ด๋ํด์ค์ผ ํ๋ ์์ ์ด ํ์ํ๋๋ฐ, docker-compose์์ ์ง์ํ๋ deploy key๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์์ต๋๋ค.
์ ๊ทธ๋ฆผ์ ์ฟ ๋ฒ๋คํฐ์ค์์ Blue-Green ๋ฐฐํฌ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ดํธํ ๋์ ๋ชจ์ต์ ๋๋ค. Rancher ๋๊ตฌ๋ฅผ ์ค์นํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ด์ฉํด๋ณด์ ๋ถ์ด๋ผ๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๋๊ฒ ์ง๋ง ์ฒ์ ๋ณด์๋ ๋ถ๋ค์ด๋ผ๋ฉด ์์ํ ์๋ ์์ต๋๋ค.
์๋ก์ด Pod์ ์๋ก์ด ์ปจํ ์ด๋๊ฐ ์ํํ ํ์ฑํ ๋์์ ๋ ๊ธฐ์กด์ Pod์ด ์๋ฉธ๋๋ฉฐ ๋ง์ฝ, ์๋ก์ด Pod์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํ์ฑํ ํ์ง ๋ชปํ์ ๊ฒฝ์ฐ ์ด์ ์ Pod๋ ๊ทธ๋๋ก ์ด์ฉ๋๊ธฐ ๋๋ฌธ์ ์์ ํ๊ฒ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ๊ทธ๋ ์ด๋ ๋ฐฉ์์ ์ฐ๋ฆฌ๋ ๋กค๋ง ์ ๊ทธ๋ ์ด๋(Rolling-upgrade)๋ผ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ฟ ๋ฒ๋คํฐ์ค์์ ์ด๋ฌํ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํด์ Replica Controller ๋ด์ง Set๊ณผ ๋๋ถ์ด Service ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ธฐ์๋ ๋ง์ ์๊ฐ์ด ์๋ชจ๋ฉ๋๋ค. ๊ฒ๋ค๊ฐ ๋กค๋ฆฝ ์ ๊ทธ๋ ์ด๋ ๋ฐฉ์์ kubectl ๋ช ๋ น์ด๋ฅผ ํตํด์ ํด๋ผ์ด์ธํธ๊ฐ ์๋์ผ๋ก ๋ฐ์์ํค๋ ๊ณผ์ ์ธ๋ฐ, ์ค๊ฐ์ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ ๋ฑ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ก ์ธํ ๋กค๋ฐฑ ์์ ๋ํ ์๋์ผ๋ก ํด์ค์ผ ํ๋ ํฌ๋ฆฌํฐ์ปฌํ ์ํฉ์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค.
์ด๋ฌํ ์์ ์ ์๋ํํ๊ณ ์ถ์ํํ ๊ฐ๋ ์ด ๋ฐ๋ก Deployment ์ ๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nk-deployment
namespace: nk-api
spec:
replicas: 3
selector:
matchLabels:
app: nk-app
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
spec:
containers:
- image: nk-app:latest
imagePullPolicy: Always
name: nk-app
ports:
- containerPort: 80
name: default
protocol: TCP
restartPolicy: Always
Deployment ํ๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ Replica์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ฒฐ์ ํ๊ณ , ์๋น์คํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌํธ ์ฃผ์๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋์ ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ Deployment ์์ฒด๊ฐ Replication Controller ์ญํ ์ ๋์ฒด ์๋จ์ด ์๋ Deployment ๊ฐ์ฒด ์์ Replication Controller๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ ๊ทธ ์ค์์๋ ReplicaSet์ ์ฌ์ฉํ๋ค๋ ์ ์ ๋๋ค.
apiVersion: v1
kind: Service
metadata:
name: nk-service
spec:
selector:
app: nk-deployment
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
type: LoadBalancer
๊ทธ ๋ค, Service ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ label selector๋ก ์ฐ๊ฒฐํ๋ฉด Deployment ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ์๋น์ค ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค.
Job
Job์ ์ฌ๋ฌ๋ถ๋ค์ด ๋ค๋ค ์์ค ๋ฒํ ์ผ๋ จ์ ์์ฝ๋ ์์ ์ ์ด์ผ๊ธฐ ํฉ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์๋ ์๋ฒ ๊ด๋ฆฌ ๋ชฉ์ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ ๋ฑ์ ๋ชฉ์ ์ผ๋ก ๋จ ํ ๋ฒ์ ๋ฐ๋ณต๋ ํํ์ ์์ ์ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ์ด ์ค๋ธ์ ํธ๊ฐ ๋ฐ๋ก Job์ ๋๋ค.
์ ํด์ง job์ด ๋๋๋ฉด Pod์ ์๋ฉธ๋๋ค๋ ๊ฒ์ด Replica Controller์์ ์ฐจ์ด์ ๋๋ค. ๋ฐ๋ผ์ ์๋น์ค๊ฐ ์๋ ์์ ์ ์ํด ์กด์ฌํ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
apiVersion: batch/v1
kind: Job
metadata:
name: nk-job
spec:
template:
spec:
containers:
- name: nk-job
image: repo/nk-job
command: ["python", "nk-job.py"]
restartPolicy: Never
backoffLimit: 4
๊ทธ๋ฐ๋ฐ, Job์๋ restartPolicy ์ต์ ์ด ์๋๋ฐ์. ์ด๊ฑด ์ ์กด์ฌํ ๊น์? ๋ง์ฝ ์์ ์งํ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ์ผํ ํ ๋ฐ ๋ฐ๋ก ์๋ฉธ๋๋ฒ๋ฆฌ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ด๋ ์ถ์ ์ด ํ๋ค๊ฒ ์ฃ ? ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ, OnFailure๋ก ์ค์ ํ๋ฉด ์์ ์ ๋ค์ ์์ํ ์ ์๋๋ก Pod์ ์ฌ์์ฑํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ ์ ๋ค์ ์์ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ETLํ๋ ํฐ ์์ ์ ์์ด์๋ ๊ฝค ๋นํจ์จ์ ์ด๊ฒ ๊ตฐ์? ๋ง์ต๋๋ค. ๋ค์ ์๋ก์ด Pod๊ฐ ์์ฑ๋๋ฉด์ ์๋กญ๊ฒ ๋ค์ ์์ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ETL ํ ๋ด์ญ๋ค์ Persistence Volume ๋ฑ์ ์ด์ฉํด์ ์์๋ก ์ ์ฅํ๋ ๋ฑ์ ์๋จ์ ๊ฐ๋ณ์ ์ผ๋ก ๋ง๋ จํด์ผ ํ๋ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ์์ ์ Pod ๋จ์๋ก ์ชผ๊ฐ์ด ์์๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์์ฉํ ์ ์์ต๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์ Job์ ๊ฐ์ ์์ ์ ๋ฐ๋ณตํ ์ ์๋๋ก ์ ์ํ ์ ์๋ ์ต์ ์ด ์์ต๋๋ค.
apiVersion: batch/v1
kind: Job
metadata:
name: nk-job
spec:
completions: 3
template:
spec:
containers:
- name: nk-job
image: repo/nk-job
command: ["python", "nk-job.py"]
restartPolicy: Never
backoffLimit: 4
completions ์ต์ ์ ํด๋น ์์ ์ 3๋ฒ ๋ฐ๋ณตํ๋ฉฐ 3๋ฒ์ด ๋ชจ๋ ์ฑ๊ณต์ผ๋ก ๋์ด์ผ๋ง Pod์ด ์ ์์ ์ผ๋ก ์๋ฉธ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ฒ๋ผ ๋ฐ์ดํฐ๊ฐ ํฐ ETL์ ๊ฐ์ ์์ ์ผ๋ก ์ชผ๊ฐ์ด ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ด์ฐจํผ ETL ํ ๋ค ๋ณํ๋ ๋ฐ์ดํฐ์ ์์กดํ์ง ์๋๋ค๋ฉด ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ ๋ ์ข๊ฒ ์ฃ ? 3๋ฒ ๋ฐ๋ณตํด์ผ ํ๋ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
apiVersion: batch/v1
kind: Job
metadata:
name: nk-job
spec:
completions: 3
parallelism: 3
template:
spec:
containers:
- name: nk-job
image: repo/nk-job
command: ["python", "nk-job.py"]
restartPolicy: Never
backoffLimit: 4
parallelism ์ต์ ์ผ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ์์ฑํ Pod ๊ฐฏ์๋ฅผ ์ ํด์ฃผ๋ฉด ๋์์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Cron Job
Cron์ ์์๋ ๋ถ๋ค์ด๋ผ๋ฉด ๋ฒ์จ ์์์ฑ๊ฒ ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์ ์ ์์ฝ๋ ์ค์ผ์ค๋ง์ผ๋ก ๋์์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ปจํธ๋กค๋ฌ ์ ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ETL ํ ๋, ์ค์๊ฐ์ผ๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ๋ํด์ ๋ช ๋ถ์ ํ ๋ฒ, ๋ช ์๊ฐ์ ํ ๋ฒ ์์ ์ ๋๋ฆฌ๊ณ ์ถ์ ๋๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ค์ ์ ํ๋ ๋ฐฉ๋ฒ์ Job + Unix Cron์ ํฉ์น ํํ๋ก ์ฝ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: nk-cron-jobs
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: nk-cron-job
image: busybox
args:
- /bin/sh
- -c
- date; echo hello kubernetes
restartPolicy: OnFailure
Job ์ค์ ์์ spec ํญ๋ชฉ์ schedule ์ค์ ๊ฐ์ Unix Cron์์ ์ฌ์ฉํ ๊ฒ๊ณผ ๋๊ฐ์ด ๋ฐ๋ณต ํ์๋ฅผ ์ง์ ํ๋ฉด ํด๋น ํ์๋งํผ ๊ณ์ ๋ฐ๋ณตํฉ๋๋ค.
StatefulSet
StatefulSet์ ์ฟ ๋ฒ๋คํฐ์ค 1.9์์ ์๋ก์ด ๋ฑ์ฅํ ์ปจํธ๋กค๋ฌ์ ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์ Pod๋ Docker ์ปจํ ์ด๋์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๊ฑฐ๋ ๋น์ ์์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ด๋ถ์ ์ ์ฅ๋ ๋ชจ๋ ์คํ ๋ฆฌ์ง์ ์ํ๊น์ง ์๋ฉธ๋๋ ํํ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ, SQL Server์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ์ ์ฅ์ด ์๊ตฌ์ ์ด์ด์ผ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ์๋ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ๋ฌผ๋ก Persistence Storage ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ์ ์๊ตฌ์ ์ธ ์ ์ฅ์ ์ ๋ํ ์๋ ์์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์คํ ํ๋ ๋ฑ์ ์์ ์ ์กฐ๊ธ ์ด๋ ต์ต๋๋ค.
์ด์ฒ๋ผ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ด ๋ฐ๋ก StatefulSet ์ปจํธ๋กค๋ฌ์ ๋๋ค. ๊ธฐ์กด์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ์ ์์๋ก ์ฌ์์์ด ๋๋ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋๋ ๋ด์ฉ๋ค์ด ์๊ณ , ์๋ก ๋ฌผ๋ ค ์๋ ์๋น์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ Stateless์ ๊ฐ๊น์ ๊ณ , ReplicaSet ๋ฑ์ ์ด๋ฐ ์ฉ๋์ ์ ํฉํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ด ์ด์คํ๊ฐ ํ์ํ๊ณ , ๋ง์คํฐ ๋ ธ๋๋ถํฐ ์์ฐจ์ ์ผ๋ก ์์ฑํด์ผ ํ๋ Stateful Application์๋ ์ด ์ฉ๋๊ฐ ์ ํฉํ์ง ์์ต๋๋ค. ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ธฐ ์ํด ReplicaSet์ ์๋ 3๊ฐ์ง ํน์ง์ ์ ๋ฆฌํด๋ดค์ต๋๋ค.
- Pod ์ด๋ฆ์ ๋ถ๊ท์นํ ์ด๋ฆ ์์ฑ ์๊ณ ๋ฆฌ์ฆ
- ์์ ์๋ Pod ์์ฑ
- Persistence Volume๊ณผ Pod 1:1 ํ๊ณ
Pod์ด ์ฌ์์ฑ๋ ๋๋ง๋ค ๋ถ๊ท์นํ ์ด๋ฆ์ ์์ฑํ๋ ๊ฒ์ ๊ธฐ์กด์ Pod์ด ๋ง์คํฐ ๋ ธ๋์๋์ง, ์ฌ๋ ์ด๋ธ ๋ ธ๋์๋์ง ๊ตฌ๋ถํ ์ ์๋ ๋งค์ฒด๊ฐ ๋ฌด์๋ฏธํด์ง๋ ์กฐ๊ฑด์ด ๋ฉ๋๋ค. ์์ ์๋ Pod ์์ฑ์ผ๋ก ์ธํ์ฌ ๋ง์คํฐ ๋ ธ๋๋ณด๋ค ์ฌ๋ ์ด๋ธ ๋ ธ๋๊ฐ ๋จผ์ ์์ฑ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ์๊ตฌ์ ๋ณผ๋ฅจ ์คํ ๋ฆฌ์ง๊ฐ Pod ํ๋์ ์ฐ๊ฒฐ๋๋ฉด ๋ค๋ฅธ Pod์๋ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒ์ ๊ฐ ๋ ธ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ก ๋๊ธฐํ ํ ์ ์๋ ๋ฌธ์ ์ ์ด ์กด์ฌํ๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๋ง์ฝ ReplicaSet์ผ๋ก ์ด๋ค์ ๊ตฌ์ฑํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์์ ๊ฐ์ด ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๊ฐ Pod๋ณ๋ก ๋ง์คํฐ/์ฌ๋ ์ด๋ธ๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ง์คํฐ, ์ฌ๋ ์ด๋ธ ๋ง๋ค ReplicaSet์ ๊ทธ ๊ฐฏ์๋งํผ ์์ฑํด์ผํ์ง์.
StatefulSet์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ด๋ค์ Pod๊ณผ Volume์ ์ ์ฒด์ ์ผ๋ก ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ ReplicaSet์ ์ฌ์ฉํด์ ๊ฐ๋ณ์ ์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ ๋ถํธํจ์ ๋์ด์ค ์ ์์ต๋๋ค.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
serviceName: "postgres"
replicas: 3
template:
metadata:
labels:
app: postgres
spec:
terminationGracePeriodSeconds: 10
containers:
- name: postgres
image: postgres:10.1
ports:
- containerPort: 5432
name: postgres-data
volumeMounts:
- name: postgrs-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 4Gi
volumeClaimTeplates๋ฅผ ์ด์ฉํด์ ๊ฐ Pod๋ง๋ค Volume Claim๊ณผ Volume์ ์์ฑํ๋๋ก ํ๋ฉด ๋ฉ๋๋ค. StatefulSet์ ๊ธฐ๋ณธ์ ์ผ๋ก Pod์ ์์ฐจ์ ์ผ๋ก ๊ธฐ๋ํ๋ฉฐ ์ญ์ ๋ ์์ฐจ์ ์ผ๋ก ์ญ์ ํฉ๋๋ค.
์ด ์ต์ ์ podManagementPolicy๋ผ๋ ์ต์ ์ ํตํด ์ค์ ํ ์ ์๋๋ฐ, ์ ํ์ผ์์๋ ๋ณ๋๋ก ์ค์ ์ด ๋์ด ์์ง ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก OrderedReady๋ก ์ค์ ๋์ด ๋์ํฉ๋๋ค. ๋ง์ฝ ์์ฐจ์ ์ด์ง ์๊ณ ๋์์ ๊ฐ๋๋๋๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๊ฐ์ด pararell๋ก ๋ณ๊ฒฝํ๋ฉด ํ๊บผ๋ฒ์ ๊ฐ๋๊ณผ ์ญ์ ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
serviceName: "postgres"
podManagementPolicy: Parallel
replicas: 3
template:
metadata:
labels:
app: postgres
spec:
terminationGracePeriodSeconds: 10
containers:
- name: postgres
image: postgres:10.1
ports:
- containerPort: 5432
name: postgres-data
volumeMounts:
- name: postgrs-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 4Gi
StatefulSet์ Pod ์ด๋ฆ์ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๊ท์น์ ์ด๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ๋ค๋ฅธ Pod์ด ์ญ์ ๋๋๋ผ๋ Volume Claim๊ณผ Volume์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ํด๋น Pod์ ์์ฑํ ๊ฒฝ์ฐ, ๊ธฐ์กด์ ์ฌ์ฉํ๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ค์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ด์์๋ Volume Claim๊ณผ Volume์ผ๋ก ์ฐ๊ฒฐ๋์ด ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง ์ฟ ๋ฒ๋คํฐ์ค์ ์ปจํธ๋กค๋ฌ์ ๋ํด์ ์ค๋ช ํด๋ดค์ต๋๋ค. Controller๋ฅผ ํ ์ค๋ก ์์ฝํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค์์ ๋ฆฌ์์ค(์ปจํ ์ด๋, ๋ณผ๋ฅจ, ๋ณผ๋ฅจ ์ค์ , ์ฌ์ฉ์, ์ฌ์ฉ์ ์ค์ )๋ฅผ ์ ์ดํ๊ธฐ ์ํ ์๋จ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค๋ ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ์ฝ๋๋ก ์ฌ์ฉํ ์ ์๋๋ก object๋ฅผ ์ ๊ณตํ๋ฉฐ ์ปค์คํ ํ ์๋ ์์ต๋๋ค.
๋ ๋์๊ฐ์ ์ด Controller๋ ์ฌ๋ฌ๋ถ๋ค์ด ์ํ๋ Controller๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค๋ Go ์ธ์ด๋ก ๋์ด ์๊ณ , ์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ ํ์ฌ์ ์๋น์ค๊ฐ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ ๊ณตํ๋ Replication Controller๋ง์ผ๋ก๋ ๋ญ๊ฐ ๋ถ์กฑํ๋ค ์๊ฐํ๋ค๋ฉด ์ด๋ฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค ์๋ ์๊ณ , ๋คํธ์ํฌ๋ฅผ ์ํ ์ค๋ธ์ ํธ๋ ๋ง๋ค ์ ์์ต๋๋ค.
์ค์ ์ด๋ฌํ ๋น์ทํ ์ฌ๋ก๋ฅผ ๊ฐ์ง ํ์ฌ ์ค์ ์นด์นด์ค์ DKOS๊ฐ ์์ต๋๋ค. ์นด์นด์ค์ DKOS๋ ์์ฌ์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค๋ฅผ ์ธ๋ถ๋ก ๋ฐฐํฌํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์ปจํธ๋กค๋ฌ๋ก ์๋ ค์ ธ ์๊ณ , ํ์ฌ๋ ์ฌ์ฉ ์ค์ ์๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
์ด์ฒ๋ผ ์ฌ๋ฌ๋ถ๋ค์ด ์ด์ํ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์๋ ์ฌ๋ฌ๋ถ๋ง์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ด์ ํ๊ฒฝ์ ๋ง๋ค ์ ์๋๋ก ์ปจํธ๋กค๋ฌ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋๋ฐ, ๋ํ์ ์ผ๋ก Operator SDK์ KubeBuilder๊ฐ ์์ต๋๋ค. ์ฐจํ ๊ธฐํ๊ฐ ๋๋ค๋ฉด ์ด ๋ถ๋ถ๋ ๋ณ๋๋ก ๊ธ์ ์์ฑํด๋ณด๊ณ ์ถ๋ค์.
'Infrastructure > Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kubernetes] 4. Minikube๋ก ์์ํ๋ kubernetes (0) | 2020.11.21 |
---|---|
[Kubernetes] 2. Kubernetes ๊ธฐ๋ณธ ๊ตฌ์ฑ๊ณผ ๊ฐ์ฒด(object) (0) | 2020.11.14 |
[Kubernetes] 1. Container Deployment์ Kubernetes (0) | 2020.11.07 |