[k8s] statefulset

[์›๋ณธ ๋งํฌ]

statefulset์€ ํŒŒ๋“œ๋“ค์˜ ์ƒํƒœ(state) ๊ด€๋ฆฌ์— ์น˜์ค‘๋œ ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์œ„๋‹ค.
deployment์˜ ํŠน์ˆ˜ํ™”๋œ ๋ณ€์ข…์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.




Deployment์˜ ๋ฌธ์ œ

deployment๋Š” ์ƒํƒœ๊ฐ€ ์—†๋Š” ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ตฌ์กฐ๋ผ์„œ, ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ DB ๋“ฑ์˜ ์ผ€์ด์Šค์— ์ ์šฉํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ชจ๋กœ ์ข€ ์ด์ƒํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š๊ณ  deployment ๊ฐ™์€ ํŒŒ๋“œ ๊ทธ๋ฃน์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹์„ ํ•˜๋ฉด, ํŒŒ๋“œ๊ฐ€ ๋œจ๋Š” ์ˆœ์„œ๋Š” ๋ฌด์ž‘์œ„๋‹ค. ๋‘๋ฒˆ์งธ ํŒŒ๋“œ๊ฐ€ ๋จผ์ € ๋œฐ ์ˆ˜๋„ ์žˆ๊ณ , ์ฒซ๋ฒˆ์งธ ํŒŒ๋“œ๊ฐ€ ๋จผ์ € ๋œฐ ์ˆ˜๋„ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฐ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ Replicationํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด master/slave ๊ตฌ์กฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด, master ๋…ธ๋“œ๊ฐ€ ๋จผ์ € ๋œจ๊ณ  ๊ทธ ์ดํ›„์— slave ๋…ธ๋“œ๊ฐ€ ๊ฑฐ๊ธฐ์— ์—ฐ๋™๋˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค. ๋‹น์—ฐํžˆ master๊ฐ€ ๋จผ์ € ๋– ์•ผํ•  ๊ฒƒ์ธ๋ฐ, slave๊ฐ€ ๋จผ์ € ๋œฌ๋‹ค๋ฉด ์ฐธ ๊ณค๋ž€ํ•œ ์ƒํ™ฉ์— ์ฒ˜ํ•  ๊ฒƒ์ด๋‹ค.

master/slave๊ฐ€ ์•„๋‹ˆ๋ผ raft ๊ฐ™์€ ํ‰๋“ฑํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง€์ง„ ์•Š๋Š”๋‹ค. ์ˆœ์„œ์— ๋Œ€ํ•œ ์ค‘์š”์„ฑ์€ ๋‚ฎ์•„์ง€์ง€๋งŒ ๋„คํŠธ์›Œํฌ ์ˆ˜์ค€ ์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด, raft๋Š” ๋„คํŠธ์›Œํฌ ํ”ผ์–ด(๋…ธ๋“œ) ๋‹จ์œ„๋กœ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•ฉ์˜๋ฅผ ํ•˜๊ณ  ๊ทธ๊ฑธ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ, Pod๊ฐ€ ๊ต์ฒด๋˜๋ฉด์„œ ๋„คํŠธ์›Œํฌ๊ฐ€ ๊ต์ฒด๋œ๋‹ค๋ฉด ๊ทธ ๊ฐ€์ •์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ํ›ผ์†๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ถ„์‚ฐ์‹œ์Šคํ…œ์˜ ๊ตฌํ˜„ ํŒจํ„ด์— ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜๋Š” ์žˆ๋Š”๋ฐ, ์•„๋ฌดํŠผ ๋ฌธ์ œ๋Š” ์ด๋Ÿฐ deployment์˜ ์œ ์—ฐํ•œ ๋™์ž‘ ํŒจํ„ด์ด ๋ถ„์‚ฐ์‹œ์Šคํ…œ ๊ตฌํ˜„์ฒด๋“ค๊ณผ ์ž˜ ๋งž์ง€ ์•Š๋Š” ๋ถ€๋ถ„๋“ค์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.




StatefulSet์˜ ๊ธฐ๋Šฅ

๊ทธ๋ž˜์„œ Statefulset์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  1. Pod๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. Pod๋งˆ๋‹ค ๊ณ ์œ ํ•œ DNS๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. Pod๋งˆ๋‹ค ๊ณ ์œ ํ•œ PV(๋ณผ๋ฅจ)์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. 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/