์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค Deployment์™€ StatefulSet, ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ? ์™„๋ฒฝ ๋น„๊ต ๊ฐ€์ด๋“œ

๐Ÿš€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค Deployment์™€ StatefulSet, ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ? ์™„๋ฒฝ ๋น„๊ต ๊ฐ€์ด๋“œ

์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์˜ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ํ’€์–ด๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๐Ÿ‘‹ ์•ˆ๋…•! ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด Deployment์™€ StatefulSet์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ž์ฃผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ฒ˜์Œ์—” "๋‘˜ ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌํ•˜๋Š” ๊ฑฐ ์•„๋ƒ?"๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‰ฌ์›Œ. ๋งž์•„, ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋‘˜ ๋‹ค ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์•ผ. ํ•˜์ง€๋งŒ ๊ฐ์ž์˜ ํŠน์„ฑ๊ณผ ์‚ฌ์šฉ ๋ชฉ์ ์ด ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฑฐ๋“ !

๐ŸŽฏ ์ด ๊ธ€์—์„œ๋Š” Deployment์™€ StatefulSet์˜ ์ฐจ์ด์ ์„ ์‹ค๋ฌด ๊ด€์ ์—์„œ ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์•ผ. ๋‹จ์ˆœํžˆ ๊ฐœ๋…๋งŒ ์„ค๋ช…ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ•˜๋Š”์ง€, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€๊นŒ์ง€ ์นœ๊ตฌ์—๊ฒŒ ์„ค๋ช…ํ•˜๋“ฏ ์žฌ๋ฏธ์žˆ๊ฒŒ ์•Œ๋ ค์ค„๊ฒŒ!

๐Ÿ’ก ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ DevOps๋ฅผ ์‹ค์ฒœํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด ๋‘ ๊ฐ€์ง€ ๋ฆฌ์†Œ์Šค์˜ ์ฐจ์ด๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฑด ์ •๋ง ์ค‘์š”ํ•ด. ์ž˜๋ชป ์„ ํƒํ•˜๋ฉด ๋‚˜์ค‘์— ํฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๊ฑฐ๋“ !

Kubernetes Workload Controllers Deployment Stateless Applications Pod 1 Pod 2 Pod 3 Interchangeable Pods No Persistent Identity StatefulSet Stateful Applications Pod-0 Pod-1 Pod-2 PVC-0 PVC-1 PVC-2 Stable Network Identity Persistent Storage per Pod

๐Ÿ“š ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋ž€?

๋ณธ๊ฒฉ์ ์œผ๋กœ Deployment์™€ StatefulSet์„ ๋น„๊ตํ•˜๊ธฐ ์ „์—, ๋จผ์ € ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ญ”์ง€ ๊ฐ„๋‹จํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž!

์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ(Workload Controller)๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ Pod๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ์ถ”์ƒํ™” ๊ฐ์ฒด์•ผ. Pod๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹ , ์ด๋Ÿฐ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ Pod์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ด์ค˜์„œ ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜์ง€.

๋Œ€ํ‘œ์ ์ธ ์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์–ด:

๐Ÿ”น Deployment - ๋ฌด์ƒํƒœ(Stateless) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ

๐Ÿ”น StatefulSet - ์ƒํƒœ์œ ์ง€(Stateful) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ

๐Ÿ”น DaemonSet - ๋ชจ๋“  ๋…ธ๋“œ์— Pod ๋ฐฐํฌ

๐Ÿ”น Job/CronJob - ๋ฐฐ์น˜ ์ž‘์—… ์‹คํ–‰

๐Ÿ”น ReplicaSet - Pod ๋ณต์ œ๋ณธ ๊ด€๋ฆฌ (๋ณดํ†ต Deployment๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ)

์ด ์ค‘์—์„œ ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘์ ์œผ๋กœ ๋ณผ ๊ฑด Deployment์™€ StatefulSet์ด์•ผ. ์ด ๋‘˜์€ ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋ฉด์„œ๋„, ์„ ํƒ์„ ์ž˜๋ชปํ•˜๋ฉด ํฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๋…€์„๋“ค์ด๊ฑฐ๋“ !

๐ŸŽฏ Deployment: ๋ฌด์ƒํƒœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ•์ž

Deployment๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์•ผ. ์›น ์„œ๋ฒ„, API ์„œ๋ฒ„, ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ฒ˜๋Ÿผ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”(Stateless) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ ์‚ฌ์šฉํ•ด.

Deployment์˜ ํ•ต์‹ฌ ์ฒ ํ•™์€ ๊ฐ„๋‹จํ•ด: "๋ชจ๋“  Pod๋Š” ๋™์ผํ•˜๊ณ  ๊ต์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค"๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ๊ณต์žฅ์—์„œ ์ฐ์–ด๋‚ธ ๋˜‘๊ฐ™์€ ์ œํ’ˆ๋“ค์ฒ˜๋Ÿผ, ์–ด๋–ค Pod๊ฐ€ ์ฃฝ์–ด๋„ ์ƒˆ๋กœ์šด Pod๋กœ ๋ฐ”๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์ง€.

โœจ Deployment์˜ ์ฃผ์š” ํŠน์ง•

1. Pod์˜ ๋™์ผ์„ฑ (Identical Pods) ๋ชจ๋“  Pod๋Š” ์™„์ „ํžˆ ๋™์ผํ•œ ์ŠคํŽ™์œผ๋กœ ์ƒ์„ฑ๋ผ. Pod-1์ด๋“  Pod-2๋“  ๊ธฐ๋Šฅ์ ์œผ๋กœ ์ฐจ์ด๊ฐ€ ์—†์–ด. ๊ทธ๋ž˜์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์–ด๋А Pod๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋“  ์ƒ๊ด€์—†์ง€.

2. ๋ฌด์ž‘์œ„ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž
Pod ์ด๋ฆ„์ด nginx-deployment-7d8f9c6b5-x7k2m ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ๋ผ. ๋’ค์— ๋ถ™๋Š” ํ•ด์‹œ๊ฐ’์€ ๋ฌด์ž‘์œ„์•ผ. Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ์ด๋ฆ„๋„ ๋ฐ”๋€Œ์–ด.

3. ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€ ๋ถˆํ•„์š”
๊ธฐ๋ณธ์ ์œผ๋กœ Pod๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ ธ. ๋ฌผ๋ก  PersistentVolume์„ ์—ฐ๊ฒฐํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๋ชจ๋“  Pod๊ฐ€ ๊ฐ™์€ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋ผ.

4. ๋น ๋ฅธ ์Šค์ผ€์ผ๋ง
Pod๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด๋Š” ๊ฒŒ ๋งค์šฐ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•ด. ์ˆœ์„œ๋„ ์ƒ๊ด€์—†๊ณ , ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ƒ์„ฑ/์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด.

5. ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ง€์›
์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๋•Œ ๋ฌด์ค‘๋‹จ์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ Deployment์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์•ผ!

๐Ÿ’ป Deployment ์‹ค์ „ ์˜ˆ์ œ

๊ฐ„๋‹จํ•œ Nginx ์›น ์„œ๋ฒ„๋ฅผ Deployment๋กœ ๋ฐฐํฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

์ด YAML ํŒŒ์ผ์„ ์ ์šฉํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ž๋™์œผ๋กœ 3๊ฐœ์˜ Nginx Pod๋ฅผ ์ƒ์„ฑํ•ด์ค˜. ๊ฐ Pod๋Š” ์™„์ „ํžˆ ๋™์ผํ•˜๊ณ , ํ•˜๋‚˜๊ฐ€ ์ฃฝ์œผ๋ฉด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด Pod๋ฅผ ๋งŒ๋“ค์–ด์„œ 3๊ฐœ๋ฅผ ์œ ์ง€ํ•ด.

์Šค์ผ€์ผ๋ง๋„ ์—„์ฒญ ๊ฐ„๋‹จํ•ด:

kubectl scale deployment nginx-deployment --replicas=5

์ด ๋ช…๋ น์–ด ํ•˜๋‚˜๋กœ Pod ๊ฐœ์ˆ˜๋ฅผ 3๊ฐœ์—์„œ 5๊ฐœ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์–ด. ๋ฐ˜๋Œ€๋กœ ์ค„์ด๋Š” ๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๊ณ !

๐Ÿ’ก ์‹ค๋ฌด ํŒ: Deployment๋Š” HPA(Horizontal Pod Autoscaler)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ Pod ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์–ด. ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์„ ๋•Œ ์ž๋™์œผ๋กœ ์Šค์ผ€์ผ ์•„์›ƒ๋˜๊ณ , ์ ์„ ๋•Œ๋Š” ์Šค์ผ€์ผ ์ธ๋˜๋Š” ๊ฑฐ์ง€. ํด๋ผ์šฐ๋“œ ๋น„์šฉ ์ ˆ๊ฐ์—๋„ ํฐ ๋„์›€์ด ๋ผ!

๐Ÿ”„ ๋กค๋ง ์—…๋ฐ์ดํŠธ์˜ ๋งˆ๋ฒ•

Deployment์˜ ์ง„์งœ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์€ ๋กค๋ง ์—…๋ฐ์ดํŠธ(Rolling Update)์•ผ. ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๋•Œ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์ ์ง„์ ์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ .

์˜ˆ๋ฅผ ๋“ค์–ด, Nginx ๋ฒ„์ „์„ 1.21์—์„œ 1.22๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

kubectl set image deployment/nginx-deployment nginx=nginx:1.22

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•ด:

1. ์ƒˆ ๋ฒ„์ „(1.22)์˜ Pod๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑ
2. ์ƒˆ Pod๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ (Health Check)
3. ํ™•์ธ๋˜๋ฉด ๊ธฐ์กด ๋ฒ„์ „(1.21) Pod ํ•˜๋‚˜๋ฅผ ์ข…๋ฃŒ
4. ์ด ๊ณผ์ •์„ ๋ชจ๋“  Pod๊ฐ€ ๊ต์ฒด๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

์ด ๊ณผ์ •์—์„œ ํ•ญ์ƒ ์ตœ์†Œํ•œ์˜ Pod๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š์•„. ๋งŒ์•ฝ ์ƒˆ ๋ฒ„์ „์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด? ๊ฑฑ์ • ๋งˆ! ๋กค๋ฐฑ๋„ ํ•œ ์ค„์ด๋ฉด ๋ผ:

kubectl rollout undo deployment/nginx-deployment

์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ฆ‰์‹œ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ๋ฐ”๋กœ Deployment๊ฐ€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ๋ž‘๋ฐ›๋Š” ์ด์œ ์•ผ!

๐Ÿ—„๏ธ StatefulSet: ์ƒํƒœ์œ ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฌธ๊ฐ€

์ž, ์ด์ œ StatefulSet์„ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. StatefulSet์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š”(Stateful) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ์„ค๊ณ„๋์–ด.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ฉ”์‹œ์ง€ ํ, ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ ์œ ํ•œ ์ •์ฒด์„ฑ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜์ง€. Deployment์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ฒ ํ•™์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด: "๊ฐ Pod๋Š” ๊ณ ์œ ํ•˜๊ณ  ๋Œ€์ฒด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค"๋Š” ๊ฑฐ์•ผ.

โœจ StatefulSet์˜ ์ฃผ์š” ํŠน์ง•

1. ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž Pod ์ด๋ฆ„์ด mysql-0, mysql-1, mysql-2 ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ๋ผ. ์ˆœ์„œ๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง€๊ณ , Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๊ฐ™์€ ์ด๋ฆ„์„ ์œ ์ง€ํ•ด.

2. ์•ˆ์ •์ ์ธ ์Šคํ† ๋ฆฌ์ง€
๊ฐ Pod๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ PersistentVolumeClaim(PVC)์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ผ. Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๊ฐ™์€ ๋ณผ๋ฅจ์— ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜์–ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋ผ.

3. ์ˆœ์ฐจ์  ๋ฐฐํฌ ๋ฐ ์ข…๋ฃŒ
Pod๊ฐ€ 0๋ฒˆ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ๋˜๊ณ , ์‚ญ์ œํ•  ๋•Œ๋Š” ์—ญ์ˆœ์œผ๋กœ ์ง„ํ–‰๋ผ. ์ด์ „ Pod๊ฐ€ ์™„์ „ํžˆ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ Pod๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„.

4. ์•ˆ์ •์ ์ธ DNS ์ด๋ฆ„
Headless Service์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ Pod๊ฐ€ mysql-0.mysql-service.default.svc.cluster.local ๊ฐ™์€ ๊ณ ์œ ํ•œ DNS ์ด๋ฆ„์„ ๊ฐ€์ ธ.

5. ์ˆœ์„œ ๋ณด์žฅ
์Šค์ผ€์ผ๋ง์ด๋‚˜ ์—…๋ฐ์ดํŠธ ์‹œ์—๋„ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋ผ. ์ด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ™์€ ์‹œ์Šคํ…œ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•ด!

๐Ÿ’ป StatefulSet ์‹ค์ „ ์˜ˆ์ œ

MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ StatefulSet์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  clusterIP: None  # Headless Service
  selector:
    app: mysql
  ports:
  - port: 3306
    name: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql-service
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
          name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password123"
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

์ด ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ด:

1. mysql-0 Pod์™€ mysql-data-mysql-0 PVC ์ƒ์„ฑ
2. mysql-0์ด ์™„์ „ํžˆ ์ค€๋น„๋˜๋ฉด mysql-1 ์ƒ์„ฑ
3. mysql-1์ด ์ค€๋น„๋˜๋ฉด mysql-2 ์ƒ์„ฑ
4. ๊ฐ Pod๋Š” ๋…๋ฆฝ์ ์ธ 10GB ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ฐ€์ง
5. Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๊ฐ™์€ PVC์— ๋‹ค์‹œ ์—ฐ๊ฒฐ๋จ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ MySQL ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž์‹ ๋งŒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์–ด. Pod๊ฐ€ ์ฃฝ์–ด์„œ ๋‹ค์‹œ ์‹œ์ž‘๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์ง€!

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ: StatefulSet์˜ PVC๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š์•„. StatefulSet์„ ์‚ญ์ œํ•ด๋„ PVC์™€ PV๋Š” ๋‚จ์•„์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์กด๋ผ. ์ด๊ฑด ์•ˆ์ „์žฅ์น˜์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋ ค๋ฉด PVC๋„ ์ˆ˜๋™์œผ๋กœ ์ง€์›Œ์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ๊ธฐ์–ตํ•ด!

๐Ÿ”— Headless Service์™€์˜ ์กฐํ•ฉ

StatefulSet์˜ ์ง„์งœ ํŒŒ์›Œ๋Š” Headless Service์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜. Headless Service๋Š” clusterIP: None์œผ๋กœ ์„ค์ •๋œ ์„œ๋น„์Šค์ธ๋ฐ, ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ Pod๊ฐ€ ๊ณ ์œ ํ•œ DNS ์ด๋ฆ„์„ ๊ฐ€์ง€๊ฒŒ ๋ผ.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ MySQL StatefulSet์—์„œ:

โ€ข mysql-0.mysql-service.default.svc.cluster.local
โ€ข mysql-1.mysql-service.default.svc.cluster.local
โ€ข mysql-2.mysql-service.default.svc.cluster.local

์ด๋ ‡๊ฒŒ ๊ฐ Pod์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ์™œ ์ค‘์š”ํ•˜๋ƒ๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ ์„ค์ • ๊ฐ™์€ ๊ฑธ ํ•  ๋•Œ ํŠน์ • Pod๋ฅผ ์ง€์ •ํ•ด์„œ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๊ฑฐ๋“ . Master-Slave ๊ตฌ์กฐ์—์„œ Master์—๋งŒ ์“ฐ๊ธฐ๋ฅผ ํ•˜๊ณ  Slave์—์„œ ์ฝ๊ธฐ๋ฅผ ํ•˜๋Š” ์‹์œผ๋กœ ๋ง์ด์•ผ.

โš–๏ธ Deployment vs StatefulSet: ํ•ต์‹ฌ ์ฐจ์ด์  ๋น„๊ต

์ž, ์ด์ œ ๋‘ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์ž! ํ‘œ๋กœ ํ•œ๋ˆˆ์— ๋น„๊ตํ•ด๋ณผ๊ฒŒ.

๋น„๊ต ํ•ญ๋ชฉ Deployment StatefulSet
Pod ์ •์ฒด์„ฑ ๋™์ผํ•˜๊ณ  ๊ต์ฒด ๊ฐ€๋Šฅ ๊ณ ์œ ํ•˜๊ณ  ๋Œ€์ฒด ๋ถˆ๊ฐ€๋Šฅ
Pod ์ด๋ฆ„ ๋ฌด์ž‘์œ„ ํ•ด์‹œ (์˜ˆ: app-7d8f9c-x7k2m) ์ˆœ์ฐจ์  ๋ฒˆํ˜ธ (์˜ˆ: app-0, app-1)
๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž ๋ถˆ์•ˆ์ • (์žฌ์‹œ์ž‘ ์‹œ ๋ณ€๊ฒฝ) ์•ˆ์ •์  (์žฌ์‹œ์ž‘ ํ›„์—๋„ ์œ ์ง€)
์Šคํ† ๋ฆฌ์ง€ ๊ณต์œ  ๋˜๋Š” ์ž„์‹œ ๊ฐ Pod๋งˆ๋‹ค ๋…๋ฆฝ์  PVC
๋ฐฐํฌ ์ˆœ์„œ ์ˆœ์„œ ์—†์Œ (๋ณ‘๋ ฌ ์ƒ์„ฑ) ์ˆœ์ฐจ์  (0โ†’1โ†’2...)
์ข…๋ฃŒ ์ˆœ์„œ ์ˆœ์„œ ์—†์Œ (๋ณ‘๋ ฌ ์ข…๋ฃŒ) ์—ญ์ˆœ (...โ†’2โ†’1โ†’0)
์Šค์ผ€์ผ๋ง ์†๋„ ๋น ๋ฆ„ ๋А๋ฆผ (์ˆœ์ฐจ์ )
์—…๋ฐ์ดํŠธ ์ „๋žต RollingUpdate, Recreate RollingUpdate, OnDelete
DNS ์ด๋ฆ„ Service ๋ ˆ๋ฒจ๋งŒ ๊ฐ Pod๋งˆ๋‹ค ๊ณ ์œ  DNS
์‚ฌ์šฉ ์‚ฌ๋ก€ ์›น ์„œ๋ฒ„, API, ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ฉ”์‹œ์ง€ ํ, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ

๐ŸŽญ ์ƒํƒœ(State)์˜ ์˜๋ฏธ

์—ฌ๊ธฐ์„œ ์ž ๊น! "์ƒํƒœ๊ฐ€ ์žˆ๋‹ค/์—†๋‹ค"๋Š” ๊ฒŒ ์ •ํ™•ํžˆ ๋ฌด์Šจ ๋œป์ผ๊นŒ? ์ด๊ฒŒ ์ข€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์–ด์„œ ๋ช…ํ™•ํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž.

Stateless (๋ฌด์ƒํƒœ)๋ž€:

โ€ข ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด์ „ ์š”์ฒญ์˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ
โ€ข ์–ด๋–ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผ
โ€ข ์ธ์Šคํ„ด์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š” ์—†์Œ
โ€ข ์˜ˆ: ์ •์  ์›น ์„œ๋ฒ„, REST API ์„œ๋ฒ„, ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ

Stateful (์ƒํƒœ์œ ์ง€)๋ž€:

โ€ข ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ
โ€ข ํŠน์ • ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ๊ณณ์— ์—†์„ ์ˆ˜ ์žˆ์Œ
โ€ข ์ธ์Šคํ„ด์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋‚˜ ๋ณต์ œ๊ฐ€ ํ•„์š”
โ€ข ์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ฉ”์‹œ์ง€ ํ, ๋ถ„์‚ฐ ์บ์‹œ, ํŒŒ์ผ ์‹œ์Šคํ…œ

๐Ÿ’ก ์‹ค๋ฌด ์˜ˆ์‹œ: Netflix ๊ฐ™์€ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ฅผ ์ƒ๊ฐํ•ด๋ด. ๋น„๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๋Š” ์›น ์„œ๋ฒ„๋Š” Stateless์•ผ. ์–ด๋–ค ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๋“  ๊ฐ™์€ ๋น„๋””์˜ค๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•ด์ฃผ๋ฉด ๋˜๊ฑฐ๋“ . ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž์˜ ์‹œ์ฒญ ๊ธฐ๋ก์„ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Stateful์ด์•ผ. ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…ธ๋“œ๊ฐ€ ํŠน์ • ์‚ฌ์šฉ์ž๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ!

๐Ÿค” ์–ธ์ œ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ดค์œผ๋‹ˆ, ์ด์ œ ์‹ค์ „ ํŒ๋‹จ ๊ธฐ์ค€์„ ์•Œ์•„๋ณด์ž! ํ”„๋กœ์ ํŠธ์—์„œ Deployment์™€ StatefulSet ์ค‘ ๋ญ˜ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ๋  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์ด์•ผ.

โœ… Deployment๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

1. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ Node.js, Spring Boot, Django ๊ฐ™์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋งŒ๋“  API ์„œ๋ฒ„๋Š” ๋Œ€๋ถ€๋ถ„ Stateless์•ผ. ์„ธ์…˜ ์ •๋ณด๋ฅผ Redis ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•œ๋‹ค๋ฉด ์™„๋ฒฝํ•œ Deployment ํ›„๋ณด์ง€.

2. ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
React, Vue, Angular๋กœ ๋นŒ๋“œํ•œ ์ •์  ํŒŒ์ผ๋“ค์„ ์„œ๋น™ํ•˜๋Š” Nginx๋‚˜ Apache ์„œ๋ฒ„. ์ด๊ฒƒ๋„ ์™„์ „ํžˆ Stateless์•ผ.

3. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค
๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์™ธ๋ถ€ DB์— ์ €์žฅํ•œ๋‹ค๋ฉด Deployment๊ฐ€ ์ ํ•ฉํ•ด. ๋น ๋ฅธ ์Šค์ผ€์ผ๋ง๊ณผ ๋กค๋ง ์—…๋ฐ์ดํŠธ์˜ ์ด์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

4. ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์›Œ์ปค
ํ์—์„œ ์ž‘์—…์„ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋“ค. ๊ฐ ์›Œ์ปค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋ฉด Deployment๋กœ ์ถฉ๋ถ„ํ•ด.

5. ์บ์‹œ ์„œ๋ฒ„ (ํŠน์ • ๊ฒฝ์šฐ)
Redis๋ฅผ ๋‹จ์ˆœ ์บ์‹œ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๊ดœ์ฐฎ๋‹ค๋ฉด Deployment๋„ ๊ฐ€๋Šฅํ•ด. ํ•˜์ง€๋งŒ ์˜๊ตฌ ์ €์žฅ์ด ํ•„์š”ํ•˜๋ฉด StatefulSet์„ ์จ์•ผ ํ•ด!

โœ… StatefulSet์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค MySQL, PostgreSQL, MongoDB, Cassandra ๋“ฑ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” StatefulSet์œผ๋กœ ๋ฐฐํฌํ•ด์•ผ ํ•ด. ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ.

2. ๋ฉ”์‹œ์ง€ ํ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ
Kafka, RabbitMQ, NATS ๊ฐ™์€ ์‹œ์Šคํ…œ๋“ค. ๋ฉ”์‹œ์ง€ ์ˆœ์„œ์™€ ํŒŒํ‹ฐ์…˜ ํ• ๋‹น์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž๊ฐ€ ํ•„์ˆ˜์•ผ.

3. ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ
Elasticsearch, Ceph, GlusterFS ๊ฐ™์€ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ ๊ฒ€์ƒ‰ ์—”์ง„. ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์–ด.

4. ๋ถ„์‚ฐ ์ฝ”๋””๋„ค์ด์…˜ ์„œ๋น„์Šค
ZooKeeper, etcd, Consul ๊ฐ™์€ ์‹œ์Šคํ…œ. ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„์‹ญ๊ณผ ๋ฆฌ๋” ์„ ์ถœ์ด ์ค‘์š”ํ•ด์„œ ์•ˆ์ •์ ์ธ ์ •์ฒด์„ฑ์ด ํ•„์ˆ˜์•ผ.

5. ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์บ์‹œ
Redis๋‚˜ Memcached๋ฅผ ์˜๊ตฌ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋กœ ์šด์˜ํ•  ๋•Œ๋Š” StatefulSet์ด ํ•„์š”ํ•ด.

๐Ÿš€ Deployment ์„ ํƒ ์‹ ํ˜ธ

โœ“ Pod๊ฐ€ ์ฃฝ์–ด๋„ ๋ฐ์ดํ„ฐ ์†์‹ค OK
โœ“ ๋ชจ๋“  Pod๊ฐ€ ๋™์ผํ•œ ์—ญํ• 
โœ“ ๋น ๋ฅธ ์Šค์ผ€์ผ๋ง ํ•„์š”
โœ“ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ž์ฃผ ํ•จ
โœ“ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์œผ๋กœ ์ถฉ๋ถ„

๐Ÿ—„๏ธ StatefulSet ์„ ํƒ ์‹ ํ˜ธ

โœ“ ๋ฐ์ดํ„ฐ ์˜๊ตฌ ๋ณด์กด ํ•„์ˆ˜
โœ“ ๊ฐ Pod๊ฐ€ ๊ณ ์œ ํ•œ ์—ญํ• 
โœ“ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•จ
โœ“ ํŠน์ • Pod ์ง€์ • ์ ‘๊ทผ ํ•„์š”
โœ“ Master-Slave ๊ตฌ์กฐ

๐ŸŽฏ ์‹ค์ „ ์˜์‚ฌ๊ฒฐ์ • ํ”Œ๋กœ์šฐ

์•„์ง๋„ ํ—ท๊ฐˆ๋ฆฐ๋‹ค๋ฉด ์ด ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ๋“ค๋กœ ํŒ๋‹จํ•ด๋ด:

Q1: ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ์ปฌ ๋””์Šคํฌ์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋‚˜? โ†’ YES: StatefulSet ๊ณ ๋ ค
โ†’ NO: Deployment ๊ฐ€๋Šฅ

Q2: Pod๊ฐ€ ์žฌ์‹œ์ž‘๋  ๋•Œ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋‚˜?
โ†’ YES: StatefulSet ํ•„์š”
โ†’ NO: Deployment ๊ฐ€๋Šฅ

Q3: Pod๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๊ฑฐ๋‚˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€?
โ†’ YES: StatefulSet ํ•„์š”
โ†’ NO: Deployment ๊ฐ€๋Šฅ

Q4: ํŠน์ • Pod์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋‚˜?
โ†’ YES: StatefulSet ํ•„์š”
โ†’ NO: Deployment ๊ฐ€๋Šฅ

์œ„ ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ YES๋ผ๋ฉด StatefulSet์„ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•ด. ๋ฐ˜๋Œ€๋กœ ๋ชจ๋‘ NO๋ผ๋ฉด Deployment๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ด์•ผ!

๐Ÿ› ๏ธ ์‹ค๋ฌด ํ™œ์šฉ ํŒจํ„ด๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

์ด๋ก ์„ ๋„˜์–ด์„œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ์—ฌ๊ธฐ์„œ๋Š” ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ• ๊ฒŒ!

๐Ÿ“Š ํŒจํ„ด 1: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

์ „ํ˜•์ ์ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” Deployment์™€ StatefulSet์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด:

Deployment๋กœ ๊ด€๋ฆฌ: โ€ข API Gateway (Kong, Nginx)
โ€ข ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„œ๋น„์Šค๋“ค (User Service, Order Service ๋“ฑ)
โ€ข ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ€ข ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์›Œ์ปค

StatefulSet์œผ๋กœ ๊ด€๋ฆฌ:
โ€ข PostgreSQL (์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ)
โ€ข MongoDB (์‚ฌ์šฉ์ž ํ”„๋กœํ•„)
โ€ข Redis (์„ธ์…˜ ์ €์žฅ์†Œ)
โ€ข Kafka (์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ)

์ด๋ ‡๊ฒŒ ์—ญํ• ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์„ฑ์— ๋งž๋Š” ์ตœ์ ์˜ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด!

๐Ÿ”„ ํŒจํ„ด 2: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ

๋•Œ๋กœ๋Š” ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด WordPress ๊ฐ™์€ CMS๋ฅผ ๋ฐฐํฌํ•œ๋‹ค๋ฉด:

# WordPress ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (Deployment)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:latest
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql-0.mysql-service
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
---
# MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (StatefulSet)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql-service
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 20Gi

WordPress ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด๋Š” Stateless์ด๋‹ˆ๊นŒ Deployment๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ๋„์›Œ์„œ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๊ณ , MySQL์€ StatefulSet์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜๋Š” ๊ฑฐ์ง€!

โšก ํŒจํ„ด 3: ์ฝ๊ธฐ ์ „์šฉ ๋ณต์ œ๋ณธ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด์•ผ:

Master (StatefulSet): ์“ฐ๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” Primary ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค. 1๊ฐœ์˜ Pod๋กœ ์šด์˜.

Read Replicas (Deployment):
์ฝ๊ธฐ ์ „์šฉ ๋ณต์ œ๋ณธ๋“ค. Master์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œ๋ฐ›์•„์„œ ์ฝ๊ธฐ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌ. ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์Šค์ผ€์ผ ๊ฐ€๋Šฅ.

์ด ํŒจํ„ด์˜ ์žฅ์ ์€ ์ฝ๊ธฐ ๋ณต์ œ๋ณธ์„ Deployment๋กœ ๊ด€๋ฆฌํ•ด์„œ ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ ๋น ๋ฅด๊ฒŒ ์Šค์ผ€์ผ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์•ผ. ์ฝ๊ธฐ ๋ณต์ œ๋ณธ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋‹ˆ๊นŒ Stateless์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ !

๐ŸŽจ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

1. ๋ฆฌ์†Œ์Šค ์ œํ•œ ์„ค์ • Deployment๋“  StatefulSet์ด๋“  ํ•ญ์ƒ resources.requests์™€ resources.limits๋ฅผ ์„ค์ •ํ•ด. ํŠนํžˆ StatefulSet์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ ์ค‘์š”ํ•œ ์›Œํฌ๋กœ๋“œ๋‹ˆ๊นŒ ๋”์šฑ ์‹ ๊ฒฝ ์จ์•ผ ํ•ด.

2. Health Check ๊ตฌ์„ฑ
livenessProbe์™€ readinessProbe๋ฅผ ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด. ํŠนํžˆ StatefulSet์—์„œ๋Š” Pod๊ฐ€ ์™„์ „ํžˆ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ Pod๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋‹ˆ๊นŒ readinessProbe๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•ด!

3. PodDisruptionBudget ์‚ฌ์šฉ
ํด๋Ÿฌ์Šคํ„ฐ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์—๋„ ์ตœ์†Œํ•œ์˜ Pod๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ด์ค˜. ํŠนํžˆ StatefulSet์—์„œ ์ค‘์š”ํ•ด.

4. ๋ฐฑ์—… ์ „๋žต
StatefulSet์˜ PVC๋Š” ์ž๋™์œผ๋กœ ๋ฐฑ์—…๋˜์ง€ ์•Š์•„. Velero ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ •๊ธฐ์ ์ธ ๋ฐฑ์—…์„ ์„ค์ •ํ•ด์•ผ ํ•ด.

5. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ
Prometheus์™€ Grafana๋กœ Pod ์ƒํƒœ, ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰, ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด. ํŠนํžˆ StatefulSet์˜ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๊ผญ ์ฒดํฌํ•ด์•ผ ํ•ด!

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํ™œ์šฉ ํŒ: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด๋‚˜ Deployment/StatefulSet ์„ค์ •์ด ์–ด๋ ต๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ DevOps ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ์ „๋ฌธ๊ฐ€๋“ค์ด ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด!

โš ๏ธ ํ”ํ•œ ์‹ค์ˆ˜์™€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ์ด๋Ÿฐ ํ•จ์ •๋“ค์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด!

โŒ ์‹ค์ˆ˜ 1: StatefulSet์ด ํ•„์š”ํ•œ๋ฐ Deployment ์‚ฌ์šฉ

์ฆ์ƒ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ Deployment๋กœ ๋ฐฐํฌํ–ˆ๋”๋‹ˆ Pod๊ฐ€ ์žฌ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ Pod๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ๋™์‹œ ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ ์†์ƒ์ด ๋ฐœ์ƒ.

์›์ธ:
Deployment๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ฐ Pod์— ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š์•„. PVC๋ฅผ ์—ฐ๊ฒฐํ•ด๋„ ๋ชจ๋“  Pod๊ฐ€ ๊ฐ™์€ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋ผ.

ํ•ด๊ฒฐ:
StatefulSet์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  volumeClaimTemplates๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ Pod๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ PVC๋ฅผ ์ƒ์„ฑํ•ด.

โŒ ์‹ค์ˆ˜ 2: StatefulSet ์Šค์ผ€์ผ๋ง ์‹œ ์ˆœ์„œ ๋ฌด์‹œ

์ฆ์ƒ: StatefulSet์„ ๊ธ‰ํ•˜๊ฒŒ ์Šค์ผ€์ผ ๋‹ค์šดํ–ˆ๋”๋‹ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊นจ์ง€๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ.

์›์ธ:
StatefulSet์€ ์—ญ์ˆœ์œผ๋กœ Pod๋ฅผ ์ข…๋ฃŒํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์„ ๋ฌด์‹œํ•˜๊ณ  ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๊ฐ€ ๋ง๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด.

ํ•ด๊ฒฐ:
StatefulSet ์Šค์ผ€์ผ๋ง์€ ์ฒœ์ฒœํžˆ ํ•˜๋‚˜์”ฉ ์ง„ํ–‰ํ•ด. ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์Šค์ผ€์ผ ๋‹ค์šด ์ „์— ๋ฐ์ดํ„ฐ ๋ณต์ œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ด.

โŒ ์‹ค์ˆ˜ 3: Headless Service ์—†์ด StatefulSet ์‚ฌ์šฉ

์ฆ์ƒ: StatefulSet์˜ ๊ฐ Pod์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์„œ Master-Slave ๊ตฌ์„ฑ์ด๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ •์ด ๋ถˆ๊ฐ€๋Šฅ.

์›์ธ:
StatefulSet์€ Headless Service์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ๊ฐ Pod๊ฐ€ ๊ณ ์œ ํ•œ DNS ์ด๋ฆ„์„ ๊ฐ€์ ธ. ์ผ๋ฐ˜ Service๋งŒ ์žˆ์œผ๋ฉด ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ๋งŒ ๋˜๊ณ  ๊ฐœ๋ณ„ Pod ์ ‘๊ทผ์ด ์•ˆ ๋ผ.

ํ•ด๊ฒฐ:
clusterIP: None์œผ๋กœ ์„ค์ •๋œ Headless Service๋ฅผ ๋งŒ๋“ค๊ณ , StatefulSet์˜ serviceName์— ์—ฐ๊ฒฐํ•ด.

โŒ ์‹ค์ˆ˜ 4: PVC ์‚ญ์ œ ์ •์ฑ… ์˜คํ•ด

์ฆ์ƒ: StatefulSet์„ ์‚ญ์ œํ–ˆ๋Š”๋ฐ PVC๊ฐ€ ๋‚จ์•„์žˆ์–ด์„œ ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฉ์ด ๊ณ„์† ์ฒญ๊ตฌ๋˜๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ ์‹ค์ˆ˜๋กœ PVC๋ฅผ ์‚ญ์ œํ•ด์„œ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆผ.

์›์ธ:
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ StatefulSet์„ ์‚ญ์ œํ•ด๋„ PVC๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์•„. ์ด๊ฑด ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ์•ˆ์ „์žฅ์น˜์•ผ.

ํ•ด๊ฒฐ:
StatefulSet ์‚ญ์ œ ์ „์— ๋ฐ์ดํ„ฐ ๋ฐฑ์—…์„ ํ™•์ธํ•˜๊ณ , ๋” ์ด์ƒ ํ•„์š” ์—†๋‹ค๋ฉด PVC๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ด. ์ž๋™ํ™”ํ•˜๋ ค๋ฉด Helm Chart๋‚˜ Operator๋ฅผ ์‚ฌ์šฉํ•ด.

โŒ ์‹ค์ˆ˜ 5: ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ค‘ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜

์ฆ์ƒ: StatefulSet์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋™์•ˆ ์ผ๋ถ€ Pod๋Š” ์ƒˆ ๋ฒ„์ „, ์ผ๋ถ€๋Š” ๊ตฌ ๋ฒ„์ „์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ.

์›์ธ:
StatefulSet์˜ ๋กค๋ง ์—…๋ฐ์ดํŠธ๋Š” ์ˆœ์ฐจ์ ์ด์ง€๋งŒ, ์—…๋ฐ์ดํŠธ ์ค‘์—๋Š” ์—ฌ๋Ÿฌ ๋ฒ„์ „์ด ๊ณต์กดํ•  ์ˆ˜ ์žˆ์–ด. ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ผ.

ํ•ด๊ฒฐ:
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ„ํšํ•ด. ๊ฐ€๋Šฅํ•˜๋ฉด ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๋จผ์ € ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๋ฐ์ดํŠธ๋Š” ๋‚˜์ค‘์— ํ•ด. ๋˜๋Š” OnDelete ์—…๋ฐ์ดํŠธ ์ „๋žต์„ ์‚ฌ์šฉํ•ด์„œ ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•ด.

๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ํ™•์ธํ•  ์‚ฌํ•ญ๋“ค:

1. Pod ์ƒํƒœ ํ™•์ธ

kubectl get pods -l app=your-app
kubectl describe pod your-pod-name
kubectl logs your-pod-name

2. PVC ์ƒํƒœ ํ™•์ธ

kubectl get pvc
kubectl describe pvc your-pvc-name

3. ์ด๋ฒคํŠธ ๋กœ๊ทธ ํ™•์ธ

kubectl get events --sort-by='.lastTimestamp'

4. ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

kubectl top pods
kubectl top nodes

5. Service ์—ฐ๊ฒฐ ํ™•์ธ

kubectl get svc
kubectl describe svc your-service-name

๐Ÿš€ ๊ณ ๊ธ‰ ํ™œ์šฉ: Operator ํŒจํ„ด

StatefulSet์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ๋ณต์žกํ•˜๋‹ค๋ฉด, Operator ํŒจํ„ด์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด. Operator๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํ™•์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐํฌ์™€ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์•ผ.

๐Ÿค– Operator๊ฐ€ ๋ญ์•ผ?

Operator๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ํ™•์žฅํ•ด์„œ ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„๋ฉ”์ธ ์ง€์‹์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, MySQL Operator๋Š” MySQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ , ๋ฐฑ์—…ํ•˜๊ณ , ๋ณต๊ตฌํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜.

Operator๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ StatefulSet์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ ์œ„์— ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด:

โ€ข ์ž๋™ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ
โ€ข ํด๋Ÿฌ์Šคํ„ฐ ํ™•์žฅ ๋ฐ ์ถ•์†Œ
โ€ข ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ
โ€ข ์žฅ์•  ๋ณต๊ตฌ (Self-healing)
โ€ข ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ
โ€ข ์„ฑ๋Šฅ ํŠœ๋‹

๐Ÿ“ฆ ์ธ๊ธฐ ์žˆ๋Š” Operator๋“ค

1. Prometheus Operator ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํƒ์„ ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌ. ServiceMonitor ๊ฐ™์€ CRD๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์ƒ์„ ์„ ์–ธ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด.

2. MySQL Operator (Oracle, Percona, Vitess ๋“ฑ)
MySQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ๋ฐฑ์—…/๋ณต๊ตฌ, ํŽ˜์ผ์˜ค๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค˜.

3. PostgreSQL Operator (Zalando, Crunchy Data ๋“ฑ)
PostgreSQL ๊ณ ๊ฐ€์šฉ์„ฑ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌ. ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„์™€ ๋ฐฑ์—…์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด.

4. MongoDB Operator
MongoDB ๋ ˆํ”Œ๋ฆฌ์นด์…‹๊ณผ ์ƒค๋”ฉ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ.

5. Kafka Operator (Strimzi)
Kafka ํด๋Ÿฌ์Šคํ„ฐ์™€ ZooKeeper๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌ. ํ† ํ”ฝ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ๋„ CRD๋กœ ๊ฐ€๋Šฅ.

6. Elasticsearch Operator (Elastic Cloud on Kubernetes)
Elasticsearch ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์Šค์ผ€์ผ๋ง, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ž๋™ํ™”.

๐Ÿ’ก Operator ์‚ฌ์šฉ ์˜ˆ์ œ

Strimzi Kafka Operator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ Kafka ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด:

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 3.3.1
    replicas: 3
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    storage:
      type: persistent-claim
      size: 100Gi
      deleteClaim: false
  zookeeper:
    replicas: 3
    storage:
      type: persistent-claim
      size: 10Gi
      deleteClaim: false
  entityOperator:
    topicOperator: {}
    userOperator: {}

์ด YAML ํ•˜๋‚˜๋กœ Kafka 3๊ฐœ, ZooKeeper 3๊ฐœ, ๊ทธ๋ฆฌ๊ณ  Topic/User ๊ด€๋ฆฌ Operator๊นŒ์ง€ ๋ชจ๋‘ ๋ฐฐํฌ๋ผ. ์ง์ ‘ StatefulSet์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•˜์ง€!

๐Ÿ’ก Operator vs ์ง์ ‘ StatefulSet ๊ด€๋ฆฌ: ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋‚˜ ํ•™์Šต ๋ชฉ์ ์ด๋ผ๋ฉด ์ง์ ‘ StatefulSet์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„. ํ•˜์ง€๋งŒ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ณต์žกํ•œ ์ƒํƒœ์œ ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์˜ํ•œ๋‹ค๋ฉด Operator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ด์•ผ. ํŠนํžˆ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•œ๋‹ค๋ฉด, ์•ˆ์ •์„ฑ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ˆ๊นŒ Operator ๋„์ž…์„ ์ ๊ทน ๊ณ ๋ คํ•ด๋ด!

๐Ÿ“ˆ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

Deployment์™€ StatefulSet์˜ ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ณด์ž!

โšก Deployment ์ตœ์ ํ™”

1. HPA (Horizontal Pod Autoscaler) ํ™œ์šฉ
CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ Pod ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•ด. ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์ด ๋ณ€๋™์ด ์‹ฌํ•œ ์„œ๋น„์Šค์— ํŠนํžˆ ์œ ์šฉํ•ด.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

2. ๋ฆฌ์†Œ์Šค ์š”์ฒญ/์ œํ•œ ์ตœ์ ํ™”
๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์„ค์ •ํ•˜๋ฉด OOMKilled๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๋„ˆ๋ฌด ๋†’๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„์•ผ. ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์„œ ์ ์ ˆํ•œ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•ด.

3. ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ „๋žต ์กฐ์ •
maxSurge์™€ maxUnavailable์„ ์กฐ์ •ํ•ด์„œ ์—…๋ฐ์ดํŠธ ์†๋„์™€ ์•ˆ์ •์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถฐ.

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # ๋™์‹œ์— ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ Pod ์ˆ˜
      maxUnavailable: 0  # ์—…๋ฐ์ดํŠธ ์ค‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ Pod ์ˆ˜

4. Readiness Probe ์ตœ์ ํ™”
๋„ˆ๋ฌด ์งง์œผ๋ฉด Pod๊ฐ€ ์ค€๋น„๋˜๊ธฐ ์ „์— ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๊ณ , ๋„ˆ๋ฌด ๊ธธ๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋А๋ ค์ ธ. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ณ ๋ คํ•ด์„œ ์„ค์ •ํ•ด.

๐Ÿ—„๏ธ StatefulSet ์ตœ์ ํ™”

1. ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค ์„ ํƒ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ I/O ์ง‘์•ฝ์ ์ธ ์›Œํฌ๋กœ๋“œ๋Š” SSD ๊ธฐ๋ฐ˜์˜ ๊ณ ์„ฑ๋Šฅ ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด. AWS EBS gp3, Azure Premium SSD, GCP SSD Persistent Disk ๋“ฑ.

2. Pod Management Policy
๊ธฐ๋ณธ๊ฐ’์€ OrderedReady์ธ๋ฐ, ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด Parallel๋กœ ์„ค์ •ํ•ด์„œ ๋ฐฐํฌ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์–ด.

spec:
  podManagementPolicy: Parallel  # ๋˜๋Š” OrderedReady (๊ธฐ๋ณธ๊ฐ’)

3. ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉ
๋„คํŠธ์›Œํฌ ์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค ๋กœ์ปฌ SSD๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด์ง€๋งŒ, ๋…ธ๋“œ ์žฅ์•  ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜์ด ์žˆ์–ด. ๋ณต์ œ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋Š” ์‹œ์Šคํ…œ(Cassandra, Elasticsearch ๋“ฑ)์—์„œ ๊ณ ๋ คํ•ด๋ณผ ๋งŒํ•ด.

4. Anti-Affinity ์„ค์ •
StatefulSet์˜ Pod๋“ค์„ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ถ„์‚ฐ์‹œ์ผœ์„œ ๋‹จ์ผ ๋…ธ๋“œ ์žฅ์• ์— ๋Œ€๋น„ํ•ด.

spec:
  template:
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - mysql
            topologyKey: kubernetes.io/hostname

5. ๋ฐฑ์—… ์ž๋™ํ™”
Velero๋‚˜ Kasten K10 ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ •๊ธฐ์ ์ธ ๋ฐฑ์—…์„ ์ž๋™ํ™”ํ•ด. StatefulSet์˜ PVC๋Š” ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ ๋ฐฑ์—…์ด ํ•„์ˆ˜์•ผ!

๐ŸŽฏ ๊ณตํ†ต ์ตœ์ ํ™”

1. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ถ„๋ฆฌ ํ™˜๊ฒฝ๋ณ„(dev, staging, prod)๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ResourceQuota๋กœ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ œํ•œํ•ด.

2. ๋„คํŠธ์›Œํฌ ์ •์ฑ…
๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•ด์„œ ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ํ–ฅ์ƒ์‹œ์ผœ.

3. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ , ๋ ˆ์ด์–ด ์บ์‹ฑ์„ ํ™œ์šฉํ•ด์„œ ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์—ฌ.

4. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ
Prometheus + Grafana๋กœ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , Alertmanager๋กœ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ์•Œ๋ฆผ๋ฐ›์•„.

๐ŸŒ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋ณ„ ๊ณ ๋ ค์‚ฌํ•ญ

AWS, Azure, GCP ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ Deployment์™€ StatefulSet์„ ์‚ฌ์šฉํ•  ๋•Œ ์•Œ์•„์•ผ ํ•  ํŠน์ง•๋“ค์„ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ!

โ˜๏ธ AWS EKS

์Šคํ† ๋ฆฌ์ง€: โ€ข EBS CSI Driver๋ฅผ ์‚ฌ์šฉํ•ด์„œ gp3 ๋ณผ๋ฅจ ์ถ”์ฒœ (gp2๋ณด๋‹ค ์„ฑ๋Šฅ ์ข‹๊ณ  ์ €๋ ด)
โ€ข EFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ Pod๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ (ReadWriteMany)
โ€ข ๊ณ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋ฉด io2 Block Express ๊ณ ๋ ค

๋„คํŠธ์›Œํ‚น:
โ€ข VPC CNI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod๊ฐ€ VPC IP๋ฅผ ์ง์ ‘ ๋ฐ›์Œ
โ€ข Security Group for Pods๋กœ ์„ธ๋ฐ€ํ•œ ๋„คํŠธ์›Œํฌ ์ œ์–ด ๊ฐ€๋Šฅ

๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ:
โ€ข ALB Ingress Controller๋กœ Application Load Balancer ์ž๋™ ์ƒ์„ฑ
โ€ข NLB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ ์„ฑ๋Šฅ TCP/UDP ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ฐ€๋Šฅ

โ˜๏ธ Azure AKS

์Šคํ† ๋ฆฌ์ง€: โ€ข Azure Disk (Premium SSD, Standard SSD, Standard HDD)
โ€ข Azure Files๋กœ ReadWriteMany ์ง€์›
โ€ข Ultra Disk๋กœ ์ดˆ๊ณ ์„ฑ๋Šฅ I/O ๊ฐ€๋Šฅ

๋„คํŠธ์›Œํ‚น:
โ€ข Azure CNI๋กœ Pod๊ฐ€ VNet IP ์ง์ ‘ ํ• ๋‹น
โ€ข Kubenet์€ NAT๋ฅผ ์‚ฌ์šฉํ•ด์„œ IP ์ ˆ์•ฝ

ํ†ตํ•ฉ ์„œ๋น„์Šค:
โ€ข Azure Monitor๋กœ ํ†ตํ•ฉ ๋ชจ๋‹ˆํ„ฐ๋ง
โ€ข Azure Key Vault๋กœ ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌ
โ€ข Azure AD๋กœ ์ธ์ฆ/์ธ๊ฐ€

โ˜๏ธ Google GKE

์Šคํ† ๋ฆฌ์ง€: โ€ข Persistent Disk (SSD, Standard)
โ€ข Filestore๋กœ NFS ๊ธฐ๋ฐ˜ ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€
โ€ข Local SSD๋กœ ์ดˆ๊ณ ์† ์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€

๋„คํŠธ์›Œํ‚น:
โ€ข VPC-native ํด๋Ÿฌ์Šคํ„ฐ๋กœ Pod๊ฐ€ VPC IP ์‚ฌ์šฉ
โ€ข Private GKE๋กœ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

์ž๋™ํ™”:
โ€ข GKE Autopilot์œผ๋กœ ๋…ธ๋“œ ๊ด€๋ฆฌ ์ž๋™ํ™”
โ€ข Workload Identity๋กœ ์•ˆ์ „ํ•œ GCP ์„œ๋น„์Šค ์ ‘๊ทผ

๐Ÿ’ก ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ์ „๋žต: ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ‘œ์ค€ํ™”ํ•˜๊ณ , Helm Chart๋กœ ํ™˜๊ฒฝ๋ณ„ ์„ค์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„. ์žฌ๋Šฅ๋„ท์—์„œ ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…์ฒ˜ ์ „๋ฌธ๊ฐ€์˜ ์ปจ์„คํŒ…์„ ๋ฐ›์œผ๋ฉด ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ์ „๋žต์„ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿ”ฎ ๋ฏธ๋ž˜ ํŠธ๋ Œ๋“œ์™€ ๋ฐœ์ „ ๋ฐฉํ–ฅ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ƒํƒœ๊ณ„๋Š” ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด. Deployment์™€ StatefulSet์˜ ๋ฏธ๋ž˜๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๐Ÿš€ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ํŠธ๋ Œ๋“œ

1. GitOps์˜ ๋ถ€์ƒ ArgoCD, Flux ๊ฐ™์€ GitOps ๋„๊ตฌ๋“ค์ด ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ์–ด. Git ์ €์žฅ์†Œ๊ฐ€ ์ง„์‹ค์˜ ์›์ฒœ(Source of Truth)์ด ๋˜์–ด์„œ, ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด Git์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ผ.

2. Serverless ์ปจํ…Œ์ด๋„ˆ
AWS Fargate, Azure Container Instances, Google Cloud Run ๊ฐ™์€ ์„œ๋น„์Šค๋“ค์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ, ๋…ธ๋“œ ๊ด€๋ฆฌ ์—†์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ํ•˜์ง€๋งŒ StatefulSet ๊ฐ™์€ ๋ณต์žกํ•œ ์›Œํฌ๋กœ๋“œ๋Š” ์•„์ง ์ „ํ†ต์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋” ์ ํ•ฉํ•ด.

3. Service Mesh ํ†ตํ•ฉ
Istio, Linkerd ๊ฐ™์€ Service Mesh๊ฐ€ Deployment์™€ ํ†ตํ•ฉ๋˜์–ด์„œ, ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ, ๋ณด์•ˆ, ๊ด€์ฐฐ์„ฑ์ด ๋”์šฑ ๊ฐ•ํ™”๋˜๊ณ  ์žˆ์–ด.

4. AI/ML ์›Œํฌ๋กœ๋“œ ์ง€์›
Kubeflow, MLflow ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ, ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ•™์Šต๊ณผ ์„œ๋น™์„ ์œ„ํ•œ ํŠนํ™”๋œ ์›Œํฌ๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์–ด.

5. Edge Computing
K3s, MicroK8s ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐฐํฌํŒ์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ, IoT ๋””๋ฐ”์ด์Šค๋‚˜ ์—ฃ์ง€ ํ™˜๊ฒฝ์—์„œ๋„ Deployment์™€ StatefulSet์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด.

๐Ÿ”ง ๊ฐœ์„ ๋˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค

1. ๋” ๋น ๋ฅธ ์Šค์ผ€์ผ๋ง StatefulSet์˜ ์ˆœ์ฐจ์  ๋ฐฐํฌ๊ฐ€ ๋ณ‘๋ ฌํ™”๋˜๋Š” ์˜ต์…˜๋“ค์ด ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์–ด. ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐฐํฌ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์ง€.

2. ํ–ฅ์ƒ๋œ ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ
CSI (Container Storage Interface)๊ฐ€ ๊ณ„์† ๋ฐœ์ „ํ•˜๋ฉด์„œ, ์Šค๋ƒ…์ƒท, ํด๋ก , ๋ณผ๋ฅจ ํ™•์žฅ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์ด ํ‘œ์ค€ํ™”๋˜๊ณ  ์žˆ์–ด.

3. ๋ณด์•ˆ ๊ฐ•ํ™”
Pod Security Standards, Network Policies, RBAC ๋“ฑ์ด ๋”์šฑ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ  ์žˆ์–ด.

4. ๊ด€์ฐฐ์„ฑ ๊ฐœ์„ 
OpenTelemetry ๊ฐ™์€ ํ‘œ์ค€์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ, ํŠธ๋ ˆ์ด์‹ฑ, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๊ฐ€ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์–ด.

๐Ÿ“š ํ•™์Šต ๋ฆฌ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ

๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๋ฆฌ์†Œ์Šค๋“ค์„ ํ™œ์šฉํ•ด๋ด!

๐Ÿ“– ๊ณต์‹ ๋ฌธ์„œ

โ€ข Kubernetes ๊ณต์‹ ๋ฌธ์„œ: kubernetes.io/docs
โ€ข Deployment ๊ฐ€์ด๋“œ: kubernetes.io/docs/concepts/workloads/controllers/deployment
โ€ข StatefulSet ๊ฐ€์ด๋“œ: kubernetes.io/docs/concepts/workloads/controllers/statefulset
โ€ข Best Practices: kubernetes.io/docs/concepts/configuration/overview

๐ŸŽ“ ์˜จ๋ผ์ธ ๊ฐ•์˜

โ€ข Kubernetes ๊ณต์‹ ํŠธ๋ ˆ์ด๋‹: CKAD, CKA ์ž๊ฒฉ์ฆ ์ค€๋น„
โ€ข Udemy, Coursera: ๋‹ค์–‘ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ฐ•์˜
โ€ข Linux Foundation: ๋ฌด๋ฃŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ ๊ณผ์ •
โ€ข YouTube: TechWorld with Nana, Just me and Opensource ๋“ฑ

๐Ÿ‘ฅ ์ปค๋ฎค๋‹ˆํ‹ฐ

โ€ข Kubernetes Slack: kubernetes.slack.com
โ€ข Reddit: r/kubernetes
โ€ข Stack Overflow: kubernetes ํƒœ๊ทธ
โ€ข CNCF ๋ฐ‹์—…: ์ „ ์„ธ๊ณ„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‚ฌ์šฉ์ž ๋ชจ์ž„
โ€ข ํ•œ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ•œ๊ตญ ์‚ฌ์šฉ์ž ๋ชจ์ž„, DevOps Korea

๐Ÿ› ๏ธ ์‹ค์Šต ํ™˜๊ฒฝ

โ€ข Minikube: ๋กœ์ปฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ
โ€ข Kind: Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹คํ–‰
โ€ข K3s: ๊ฒฝ๋Ÿ‰ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐฐํฌํŒ
โ€ข Play with Kubernetes: ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฌด๋ฃŒ๋กœ ์‹ค์Šต
โ€ข ํด๋ผ์šฐ๋“œ ๋ฌด๋ฃŒ ํ‹ฐ์–ด: GKE, EKS, AKS ๋ฌด๋ฃŒ ํฌ๋ ˆ๋”ง ํ™œ์šฉ

๐Ÿ’ก ์‹ค์ „ ๊ฒฝํ—˜์˜ ์ค‘์š”์„ฑ: ์ด๋ก ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด. ์ง์ ‘ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด๋Š” ๊ฒฝํ—˜์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ด. ์žฌ๋Šฅ๋„ท์—์„œ ์‹ค์ „ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ฑฐ๋‚˜, ๋ฉ˜ํ† ๋ง์„ ๋ฐ›์œผ๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์–ด!

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ: ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ด ์„ฑ๊ณต์˜ ์—ด์‡ 

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ Deployment์™€ StatefulSet์˜ ๋ชจ๋“  ๊ฒƒ์„ ์‚ดํŽด๋ดค์–ด! ๊ธด ๊ธ€์ด์—ˆ์ง€๋งŒ, ์ด ๋‘ ๊ฐ€์ง€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฐจ์ด๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋Š” ๊ฑด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋ฐ ์ •๋ง ์ค‘์š”ํ•œ ๋‹จ๊ณ„์•ผ.

ํ•ต์‹ฌ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜๋ฉด:

๐Ÿš€ Deployment๋Š”: โ€ข ๋ฌด์ƒํƒœ(Stateless) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ตœ์ 
โ€ข ๋น ๋ฅธ ์Šค์ผ€์ผ๋ง๊ณผ ๋กค๋ง ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ•์ 
โ€ข ์›น ์„œ๋ฒ„, API, ํ”„๋ก ํŠธ์—”๋“œ์— ์‚ฌ์šฉ
โ€ข Pod๊ฐ€ ๋™์ผํ•˜๊ณ  ๊ต์ฒด ๊ฐ€๋Šฅ

๐Ÿ—„๏ธ StatefulSet์€:
โ€ข ์ƒํƒœ์œ ์ง€(Stateful) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์ˆ˜
โ€ข ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž์™€ ์Šคํ† ๋ฆฌ์ง€ ์ œ๊ณต
โ€ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ฉ”์‹œ์ง€ ํ, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ
โ€ข ๊ฐ Pod๊ฐ€ ๊ณ ์œ ํ•˜๊ณ  ๋Œ€์ฒด ๋ถˆ๊ฐ€๋Šฅ

๐Ÿ’ก ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด์•ผ. "์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋‚˜?", "Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋‚˜?", "๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณ ์œ ํ•œ ์ •์ฒด์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•˜๋‚˜?" ๊ฐ™์€ ์งˆ๋ฌธ๋“ค์— ๋‹ตํ•˜๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ์–ด.

๐ŸŽ“ ์ฒ˜์Œ์—” ์–ด๋ ต๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง์ ‘ ์‹ค์Šตํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“๋‹ค ๋ณด๋ฉด ์ ์  ์ต์ˆ™ํ•ด์งˆ ๊ฑฐ์•ผ. ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ ์ฐจ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ํ™•์žฅํ•ด๋‚˜๊ฐ€๋Š” ๊ฒŒ ์ข‹์•„.

๐Ÿค ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋„์›€์„ ๋ฐ›๊ฑฐ๋‚˜, ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋ฉ˜ํ† ๋ง์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ DevOps ์—”์ง€๋‹ˆ์–ด๋“ค์ด ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๊ณ , ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ๋„์™€์ค„ ์ˆ˜ ์žˆ๊ฑฐ๋“ !

๐Ÿš€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ๊ณ , ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ƒํƒœ๊ณ„๋Š” ๋”์šฑ ํ’๋ถ€ํ•ด์ง€๊ณ  ์žˆ์–ด. Deployment์™€ StatefulSet์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํ˜„๋Œ€์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์™€ ์šด์˜์—์„œ ํฐ ๊ฒฝ์Ÿ๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ!

๐Ÿ’ช ์ด์ œ ๋‹น์‹ ๋„ Deployment์™€ StatefulSet์˜ ์ฐจ์ด๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ์ž์‹ ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์‹ค์ „์— ์ ์šฉํ•ด๋ด. ์ฒ˜์Œ์—” ์‹ค์ˆ˜๋„ ํ•˜๊ณ  ์‹œํ–‰์ฐฉ์˜ค๋„ ๊ฒช๊ฒ ์ง€๋งŒ, ๊ทธ๊ฒŒ ๋ฐ”๋กœ ์„ฑ์žฅ์˜ ๊ณผ์ •์ด์•ผ. ํ™”์ดํŒ…!

๐ŸŽ‰ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!

Deployment์™€ StatefulSet์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋งˆ์Šคํ„ฐํ–ˆ์Šต๋‹ˆ๋‹ค!
์ด์ œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์›Œํฌ๋กœ๋“œ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š”
DevOps ์ „๋ฌธ๊ฐ€๋กœ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ”์–ด์š”.

๊ณ„์†ํ•ด์„œ ๋ฐฐ์šฐ๊ณ , ์‹คํ—˜ํ•˜๊ณ , ์„ฑ์žฅํ•˜์„ธ์š”! ๐Ÿš€

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.