[k8s] statefulset
statefulset์ ํ๋๋ค์ ์ํ(state) ๊ด๋ฆฌ์ ์น์ค๋ ์ปจํธ๋กค๋ฌ ๋จ์๋ค.
deployment์ ํน์ํ๋ ๋ณ์ข
์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ๋ค.
Deployment์ ๋ฌธ์
deployment๋ ์ํ๊ฐ ์๋ ์๋ฒ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ตฌ์กฐ๋ผ์, ์ํ๊ฐ ํ์ํ DB ๋ฑ์ ์ผ์ด์ค์ ์ ์ฉํ๋ค๋ฉด ์ฌ๋ฌ๋ชจ๋ก ์ข ์ด์ํด์ง ์ ์๋ค.
๋ณ๋ค๋ฅธ ์ค์ ์ ํ์ง ์๊ณ deployment ๊ฐ์ ํ๋ ๊ทธ๋ฃน์ผ๋ก ํ๋ก๋น์ ๋์ ํ๋ฉด, ํ๋๊ฐ ๋จ๋ ์์๋ ๋ฌด์์๋ค. ๋๋ฒ์งธ ํ๋๊ฐ ๋จผ์ ๋ฐ ์๋ ์๊ณ , ์ฒซ๋ฒ์งธ ํ๋๊ฐ ๋จผ์ ๋ฐ ์๋ ์๋ค.
์ผ๋ฐ์ ์ธ ์๋ฒ ํ๊ฒฝ์์๋ ์ด๋ฐ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋ถ์ฐ์์คํ
์ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํ๊ฑฐ๋ Replicationํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์๋ฅผ ๋ค์ด master/slave ๊ตฌ์กฐ์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ค๋ฉด, master ๋
ธ๋๊ฐ ๋จผ์ ๋จ๊ณ ๊ทธ ์ดํ์ slave ๋
ธ๋๊ฐ ๊ฑฐ๊ธฐ์ ์ฐ๋๋๋ ํํ๊ฐ ๋๋ค. ๋น์ฐํ master๊ฐ ๋จผ์ ๋ ์ผํ ๊ฒ์ธ๋ฐ, slave๊ฐ ๋จผ์ ๋ฌ๋ค๋ฉด ์ฐธ ๊ณค๋ํ ์ํฉ์ ์ฒํ ๊ฒ์ด๋ค.
master/slave๊ฐ ์๋๋ผ raft ๊ฐ์ ํ๋ฑํ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋๋ผ๋ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง์ง ์๋๋ค. ์์์ ๋ํ ์ค์์ฑ์ ๋ฎ์์ง์ง๋ง ๋คํธ์ํฌ ์์ค ์์ ์ฑ์ด ์ค์ํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค๋ฉด, raft๋ ๋คํธ์ํฌ ํผ์ด(๋
ธ๋) ๋จ์๋ก ์ค์๊ฐ์ผ๋ก ํฉ์๋ฅผ ํ๊ณ ๊ทธ๊ฑธ ๋์คํฌ์ ์ ์ฅํ๋ฉด์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋๋ฐ, Pod๊ฐ ๊ต์ฒด๋๋ฉด์ ๋คํธ์ํฌ๊ฐ ๊ต์ฒด๋๋ค๋ฉด ๊ทธ ๊ฐ์ ์ด ์ฌ๊ฐํ๊ฒ ํผ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ถ์ฐ์์คํ ์ ๊ตฌํ ํจํด์ ๋ฐ๋ผ์ ๋ฌธ์ ๊ฐ ๋๋ฌ๋๋ ํํ๊ฐ ๋ฌ๋ผ์ง ์๋ ์๋๋ฐ, ์๋ฌดํผ ๋ฌธ์ ๋ ์ด๋ฐ deployment์ ์ ์ฐํ ๋์ ํจํด์ด ๋ถ์ฐ์์คํ ๊ตฌํ์ฒด๋ค๊ณผ ์ ๋ง์ง ์๋ ๋ถ๋ถ๋ค์ด ๋ง๋ค๋ ๊ฒ์ด๋ค.
StatefulSet์ ๊ธฐ๋ฅ
๊ทธ๋์ Statefulset์ ๋ค์๊ณผ ๊ฐ์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- Pod๋ง๋ค ๊ณ ์ ํ ์ด๋ฆ์ ๋ถ์ฌํ ์ ์๋ค.
- Pod๋ง๋ค ๊ณ ์ ํ DNS๋ฅผ ๋ถ์ฌํ ์ ์๋ค.
- Pod๋ง๋ค ๊ณ ์ ํ PV(๋ณผ๋ฅจ)์ ๋ถ์ฌํ ์ ์๋ค.
- Pod๋ค์ ์์ฑ/์ข ๋ฃ ์์๋ฅผ index ๋ฒํธ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ๋ก ์ง๋ ฌํํ๋ค.
์ฌ์ฉํด๋ณด๊ธฐ - MySQL Statefulset ๋ง๋ค์ด๋ณด๊ธฐ
MySQL DB๋ฅผ ๋์ฐ๋ ๊ฐ๋จํ ์์ ๋ฅผ ๋๋ ค๋ณด์.
Statefulset์ ์ ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ Service๊ฐ ํ์ํ๋ค.
๊ทธ๋์ผ ๊ณ ์ ๋ DNS ์ด๋ฆ์ ์์ฑํ ์ ์๊ณ , peer ์ฐ๊ฒฐ ๋ฑ์ ์ ๋๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
์ ๋นํ ๋ง๋ค์ด์ฃผ๊ณ
๊ฑฐ๊ธฐ์ ๋ง์ถฐ์ statefulset์ ์ ์ํด์ฃผ๋ฉด ๋๋ค.
๋น์ฐํ service selector์ ๋์ผํ selector๋ฅผ spec์ ๋ฃ์ด์ค์ผ ํ๋ค.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ ์ค ํ๋๋ volumeClaimTemplates๋ค.
์ด๊ฒ PVC์ ๋ํ ์์ฒญ๊ฐ์ด๋ค.
์ด๊ฑธ ์ ์ ํ ์ค์ ํด๋์ผ๋ฉด, PV ๊ด๋ฆฌ์๊ฐ ๋ฐ์์ Pod๋ง๋ค ํ๋์ฉ ํ ๋นํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ฒ ์คํํด๋ณด์.

๊ทธ๋ฌ๋ฉด ์ค์ ๋ก Pod๋ค์ด
0๋ฒ
1๋ฒ

2๋ฒ ์์ผ๋ก ์ฒ์ฒํ ์์ฑ๋ ๊ฒ์ด๋ค.
statefulset์ ์ด์ Pod๊ฐ ์์ฑ๋์ด์ผ ๊ทธ ๋ค์ Pod๋ฅผ ์คํํ๋ ๋๊ธํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
๋ ์ ํํ ๋งํ๋ฉด podManagementPolicy๊ฐ OrderedReady๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์ญ์ ๋๊ฑฐ๋ replica ๊ฐ์๊ฐ ์ถ์๋๋ค๋ฉด, ๊ทธ ์ญ์์ผ๋ก ์ ๊ฑฐํด๋๊ฐ๋ค.
pvc๋ Pod๋ง๋ค ํ๋์ฉ ํ ๋น์ด ๋์ด์์ ๊ฒ์ด๋ค.

๋ด ๊ฒฝ์ฐ์๋ k3s๋ผ์ local-path๋ก ์๋์ผ๋ก pvc๊ฐ ํ ๋น๋์๋๋ฐ, ์ด๊ฑด pv ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์ฐธ์กฐ
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/