[Kubernetes] 3. Controller๋กœ ๋” ๋‚˜์•„๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

๋ฐ˜์‘ํ˜•

์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ 4๊ฐœ ๊ฐ์ฒด๋“ค์˜ ์—ญํ• ๊ณผ ๊ทธ๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํ•œ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ๋ฐ ์žˆ์–ด ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

 

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์„œ๋น„์Šค์˜ ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๋Š” ์Šค์ผ€์ผ ์—…/์•„์›ƒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ batch ์ž‘์—… ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •, ๋ฐฐํฌ์— ๋”์šฑ ๋น›์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Controller

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด์ „์— ์„ค๋ช…ํ•œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐํฌํ•œ ์„œ๋น„์Šค๋“ค์— ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€์‹œ์ผœ์ฃผ๋Š” ์กด์žฌ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„ ์š”์ฒญ ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒƒ์ด๋ฏ€๋กœ Namespace์— ๋ถ€์—ฌ๋œ ๋ฆฌ์†Œ์Šค ํ—ˆ์šฉ๋Ÿ‰์— ํ•œํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ/์‚ญ์ œํ•˜๋Š” ์˜คํ†  ์Šค์ผ€์ผ๋ง ๊ธฐ๋Šฅ, ๋‚ด ์„œ๋น„์Šค ์•ž๋‹จ์— ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜ ๋ฐ๋ชฌ์„ ์ง€์†์ ์œผ๋กœ ๋™์ž‘์‹œ์ผœ์ฃผ๋Š” DaemonSet ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

  • Replication Controller / Set
  • DaemonSet
  • Job
  • StatefulSet
  • Deployment

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ธฐ๋ณธ ๊ฐ์ฒด๋กœ๋„ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ๋Š” ํฐ ๋ฌด๋ฆฌ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Controller๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข€ ๋” ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ฃ .

 

 

Replication Controller / Set

Replication Controller์™€ ReplicationSet์€ ์ง€์ •๋œ ์ˆ˜ ๋งŒํผ Pod๋ฅผ ๊ฐ€๋™์‹œํ‚ค๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ ๋Œ€๋ชฉ์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ ๋Œ€๋ชฉ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  1. Replica์˜ ์ˆ˜
  2. Pod Selector
  3. 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๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจํ›„ ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„๋„ ๋ณ„๋„๋กœ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๊ณ  ์‹ถ๋„ค์š”.

 

 

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments