controller

๊ธฐ๋Šฅ

  1. auto healing ํŠน์ • ๋…ธ๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๊ทธ ๋…ธ๋“œ ๋‚ด์˜ ํŒŒ๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค.

  2. auto scaling ํ•œ ํŒŒ๋“œ๊ฐ€ ๋ชจ๋“  ์ž์›์„ limit์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„๋•Œ ์ด๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ํŒŒ๋“œ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด ์คŒ์œผ๋กœ์จ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ ์‹œ์ผœ์ค€๋‹ค.

  3. software update ํŒŒ๋“œ๋“ค์˜ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ฃผ๊ณ  ๋ฌธ์ œ๋ฐœ์ƒ์‹œ ๋กค๋ฐฑ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค.

  4. job ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž‘์—…์„ ์ดํ–‰ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์Šค์ผ€์ค„๋ง๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.

1. Replication Controller / ReplicaSet

Replication Controller๋Š” Deprecated๋˜์—ˆ๊ณ  ๊ทธ ํ›„์— ๋‚˜์˜จ ๊ฒƒ์ด ReplicaSet์ด๋‹ค.

1) Template / Replicas

selector๋ฅผ ํ†ตํ•ด์„œ label๋กœ ์ปจํŠธ๋กค๋Ÿฌ์™€ ํŒŒ๋“œ๋ฅผ ์—ฐ๊ฒฐ ํ•˜๊ฒŒ ๋˜๊ณ  template๋กœ ํŠน์ • ํŒŒ๋“œ์˜ ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งŒ์ผ ํŠน์ • ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋˜๋ฉด ๋‹ค์‹œ ์žฌ์ƒ์„ฑํ•˜๋ ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ template์— ํŒŒ๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด๋†“๊ณ  ๊ธฐ์กด์˜ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•ด์ฃผ๋ฉด ํŒŒ๋“œ๋ฅผ ์žฌ์ƒ์„ฑํ•ด์ฃผ๋ ค๋Š” ํŠน์„ฑ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ๋ฒ„์ „์—…๊ทธ๋ ˆ์ด๋“œ๋œ ํŒŒ๋“œ๋ฅผ ์žฌ์ƒ์„ฑ ํ•˜๊ฒŒ ๋œ๋‹ค.

replicas๋Š” ์ตœ๋Œ€ ์ƒ์„ฑํ•˜๋Š” ํŒŒ๋“œ์˜ ์ˆ˜๋กœ ์ด replicas๋ฅผ ๋Š˜๋ ค์ฃผ๊ฒŒ๋˜๋ฉด scale out์ด ๋˜๊ฒŒ ๋˜๊ณ  ์ค„์—ฌ์ฃผ๋ฉด scale in์ด ๋œ๋‹ค.

์ด๋Š” Replication Controller์™€ ReplicaSet๋ชจ๋‘ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํŠน์„ฑ์ด๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ๋“ค๋•Œ๋ฌธ์— ํŠน์ • ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ•œ๊ฐœ๋งŒ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  lavels:
    type: web
spec:
  containers:
    - name: container
  image: tmkube/app:v1
apiVersion: v1
kind: ReplicationController
metadata:
  name: replication-1
spec:
  replicas: 1
  selector:
    type: web
  template:
    metadata:
      name: pod-1
      labels:
        type: web
      spec:
        containers:
          - name: container
        image: tmkube/app:v2

2) Selector

์ด๋Š” ReplicaSet์—๋งŒ ์žˆ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ReplicaSet์—๋Š” Replication Contorller์™€ ๋‹ฌ๋ฆฌ matchLabels, matchExpressions์†์„ฑ์ด ์ถ”๊ฐ€๋กœ ์กด์žฌํ•œ๋‹ค. Replication Controller์—์„œ ํŒŒ๋“œ๋ฅผ ์—ฐ๊ฒฐํ• ๋•Œ๋Š” ๋ผ๋ฒจ์˜ key/value๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ํŒŒ๋“œ๋งŒ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ReplicaSet์—์„œ๋Š” matchLabels์ด ๋™์ผํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด๋•Œ, matchExpressions์€ key/value๋ฅผ ์กฐ๊ธˆ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ์–ด value๋Š” ๋‹ฌ๋ผ๋„ key๋งŒ ๊ฐ™์€ ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica-1
spec:
  replicas: 3
  selector:
    matchLabels:
      type: web
    matchExprssions:
      - { key: ver, operator: Exists }
  template:
    metadata:
      name: pod-1
      labels:
        type: web
      spec:
        containers:
          - name: container
        image: tmkube/app:v2

๋‹ค๋ฅธ Operator๋“ค

  1. Exists : ํŠน์ • key๊ฐ€ ์ผ์น˜ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ์„ ํƒ

  2. DoesNotExist : ํŠน์ • key๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ํŒŒ๋“œ๋ฅผ ์„ ํƒ

  3. In : ์„ค์ •ํ•œ key์™€ ์ผ์น˜ํ•˜๊ณ  values๊ฐ€ ํฌํ•จ๋œ ํŒŒ๋“œ๋“ค์„ ์„ ํƒ

  4. NotIn : ์„ค์ •ํ•œ key์™€ ์ผ์น˜ํ•˜๊ณ  values๋“ค์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ํŒŒ๋“œ๋“ค์„ ์„ ํƒ

2. Deployment

ํ˜„์žฌ ํ•œ ์„œ๋น„์Šค๊ฐ€ ์šด์˜์ค‘์ผ๋•Œ ์ด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ๋˜์„œ ์žฌ๋ฐฐํฌ๋ฅผ ํ•ด์•ผํ• ๋•Œ ๋„์›€์ด ๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ

1) ReCreate

Deployment๊ฐ€ ๊ธฐ์กด์˜ pod๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ž์›์‚ฌ์šฉ๋Ÿ‰์ด ์—†์–ด์ง€๊ฒŒ ๋˜๊ณ  ์ƒˆ๋กœ pod๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ค‘๊ฐ„ downtime์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Deployment์—์„œ๋„ Controller์™€ ๋™์ผํ•˜๊ฒŒ selector/replicas/template๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š”๋ฐ ์ด๋Š” controller์™€ ๊ฐ™์ด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑ/๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ deployment๊ฐ€ ์ƒ์„ฑํ•˜๋Š” controller์— ์†์„ฑ๋“ค์˜ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์ด๋‹ค.

deployment์˜ template์„ updateํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด์˜ replicaSet์˜ replicas๋Š” 0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ƒˆ๋กœ์šด replicaSet์„ ์ƒ์„ฑํ•œ๋‹ค.

apiVersion: app/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  selector:
    matchLabels:
      type: app
  replicas: 2
  strategy:
    type: Recreate
  revisionHistoryLimit: 1
  template:
    metadata:
      labels:
        type: app
    spec:
      continers:
        - name: container
          image: tmkube/app:v1

revisionHistoryLimit์€ repliacas๊ฐ€ 0์ธ controller๋ฅผ ๋‚จ๊ฒจ๋†“๋Š” ์ˆซ์ž๋กœ default๋Š” 10์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ธฐ์กด์˜ controller๋ฅผ ๋‚จ๊ฒจ๋†“๋Š” ์ด์œ ๋Š” ์ด์ „ ๋ฒ„์ „์œผ๋กœ rollback์„ ์œ„ํ•จ์ด๋‹ค.

kubectl rollout undo deployment deployment-1 --to-revision=2 #deployment-1์˜ deployment์˜ vision์„ 2๋กœ roll back
kubectl rollout history deployment deployment-1 #deployment-1์ด๋ผ๋Š” ์ด๋ฆ„์˜ deployment์˜ revision ๊ธฐ๋ก

2) Rolling update

Deployment๊ฐ€ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ pod๋ฅผ ํ•œ๊ฐœ ๋งŒ๋“ค์–ด ์ค€ ํ›„ ์š”์ฒญ์„ ์ƒˆ๋กœ์šด pod๋„ ๋”ํ•ด์„œ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•ด์ค€ ํ›„ ํ•œ๊ฐœ์˜ ๊ธฐ์กด๋ฒ„์ „ pod๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŒŒ๋“œ๋“ค์„ ์ฐจ๋ก€๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ ์ด๋Š” downtime์ด ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ์ถ”๊ฐ€ ์ž์›์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  selector:
    matchLabels:
      type: app2
  replicas: 2
  strategy:
    type: RollingUpdate
  minReadySeconds: 10
  template:
    metadata:
      labels:
        type: app2
    spec:
      containers:
        - name: container
          image: kubetm/app:v1
      minReadySeconds: 10

minReadySeconds ์˜ต์…˜์€ ์ƒˆ๋กœ์šดํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด์˜ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์‚ฌ์ด์˜ ํ…€์„ ์ •์˜ํ•ด์ฃผ๋Š” ๊ฐ’์ด๋‹ค.

์ด๋•Œ ์˜๋ฌธ์œผ๋กœ ์ƒˆ๋กœ์ƒ์„ฑ๋œ ReplicaSet์€ ๋ผ๋ฒจ์„ ๊ฐ€์ง€๊ณ  ํŒŒ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ๊ธฐ์กด์˜ ํŒŒ๋“œ๋“ค๊ณผ๋„ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” replicaSet์ด ์ƒ์„ฑ๋ ๋•Œ ์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค ํŠน์ •ํ•œ ๋ผ๋ฒจ์ด ๋ถ™๊ฒŒ๋˜๊ณ  ์ด ๋ผ๋ฒจ์„ ์ด์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค๋•Œ ์ถ”๊ฐ€์ ์ธ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ํŒŒ๋“œ๋“ค๊ณผ๋Š” ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

3) Blue/Green

Deployment๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ReplicaSet๊ณผ ๊ฐ™์ด replicas๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” controller๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋“ค๊ณผ ์—ฐ๊ฒฐ๋œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋†”๋‘๊ณ  ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋“ค์„ ๊ฐ€์ง„ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋“ค๋กœ ์ƒˆ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹

์ˆœ๊ฐ„์ ์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— downtime์€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ ๋ฒ„์ „์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์„์‹œ service์˜ ๋ผ๋ฒจ๋งŒ ๊ธฐ์กด๋ฒ„์ „์œผ๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋กค๋ฐฑ์ด ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์กด์žฌํ•˜์ง€๋งŒ ์ž์›์ด ๋‘๋ฐฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 2
  selector:
    matchLabels:
      ver: v1
  template:
    metadata:
      name: pod1
      labels:
        ver: v1
    spec:
      containers:
        - name: container
          image: kubetm/app:v1
      terminationGracePeriodSeconds: 0

4) Canary

์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ๊ธฐ์กด๋ฒ„์ „์˜ ํŒŒ๋“œ๋“ค๊ณผ ๊ฐ™์ด ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ์‹œ์ผœ ์ƒˆ๋กœ์šด ๋ฒ„์ „์— ๋Œ€ํ•ด ํ…Œ์ŠคํŒ…์„ ํ•˜๋Š” ์‹์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์˜ replicas๋ฅผ 0์œผ๋กœ ๋ฐ”๊ฟ”์คŒ์œผ๋กœ์จ ์—ฐ๊ฒฐ์„ ๋Š์„ ์ˆ˜ ์žˆ๋‹ค.

์„œ๋น„์Šค์— ๊ธฐ์กด์˜ ๋ผ๋ฒจ์„ ์ด์šฉํ•˜์—ฌ ๋ถ™์—ฌ์„œ ํ…Œ์ŠคํŒ…์„ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํŠน์ • ๋‹ค์ˆ˜๋ฅผ ๋Œ€์ƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ , ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ผ๋ฒจ์„ ๊ฐ€์ง„ ์„œ๋น„์Šค๋ฅผ ํ•œ๊ฐœ ๋”๋งŒ๋“ค๊ณ  Ingress Controller๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๊ธฐ์กด์˜ ์„œ๋น„์Šค์™€ ์ƒˆ๋กœ์šด๋ฒ„์ „์˜ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ํŠน์ •์กฐ๊ฑด์— ๋Œ€ํ•œ ์š”์ฒญ๋งŒ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋กœ ๋งตํ•‘๋˜๋„๋กํ•ด ํŠน์ •๋œ ๋‹ค์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ…Œ์ŠคํŒ…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ํ…Œ์ŠคํŒ… ํ›„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฒ„์ „์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ donwtime์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€์ž์›์€ ์ •์˜ํ•œ ํŒŒ๋“œ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์ƒ์ดํ•  ์ˆ˜ ์žˆ๋‹ค.

3. DeamonSet / Job / CronJob

1) DeamonSet

์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์—๋Š” ์„ฑ๋Šฅ ์ˆ˜์ง‘(๋ชจ๋‹ˆํ„ฐ๋ง), ๋กœ๊ทธ ์ˆ˜์ง‘, ๋…ธ๋“œ๋“ค์„ storage๋กœ์จ ๋„คํŠธ์›Œํฌ ํŒŒ์ผ์‹œ์Šคํ…œ์œผ๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๊ณ , ๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ๋กœ์จ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

selctor์™€ template๊ฐ€ ์กด์žฌํ•˜์—ฌ ๋ผ๋ฒจ์„ ์ด์šฉํ•ด ๋ชจ๋“  ๋…ธ๋“œ์— ํ…œํ”Œ๋ฆฟ์œผ๋กœ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ผ๋ฒจ๋กœ ํŒŒ๋“œ๋“ค๊ณผ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค.

๋งŒ์•ฝ์— ๋…ธ๋“œ๋“ค์ด os๊ฐ€ ๋‹ฌ๋ผ์„œ ํŠน์ • ํŒŒ๋“œ๊ฐ€ ํŠน์ • os์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์•„ ํŠน์ • ๋…ธ๋“œ์—๋Š” ์ƒ์„ฑ์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด template์˜ ํŒŒ๋“œ์„ค์ •์œผ๋กœ nodeSelector(os:centos)์™€ ๊ฐ™์ด ํŠน์ • ์˜ต์…˜์„ ์ด์šฉํ•ด์„œ ํŠน์ • ์กฐ๊ฑด์—๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ hostPort์— ๋Œ€ํ•ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ํŠน์ • port๋กœ ํŒŒ๋“œ๋“ค์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-1
spec:
  selector:
    matchLabels:
      type: app
  template:
    metadata:
      labels:
        type: app
    spec:
      containers:
        - name: container
          image: kubetm/app
          ports:
            - containerPort: 8080
              hostPort: 18080

2) Job

์ผ๋ฐ˜ Pod์ƒ์„ฑ์„ ํ†ตํ•ด ์ƒ์„ฑํ•œ Pod๋Š” ๋…ธ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„๋•Œ ๊ฐ™์ด ์‚ญ์ œ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๊ณ  controller์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ํŒŒ๋“œ๋Š” ๋…ธ๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์— ์ƒˆ๋กœ ์ƒ์„ฑ์ด๋˜๋ฉฐ, ํŒŒ๋“œ๊ฐ€ ์ผ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๋“œ๋ฅผ restart์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์Šจ์ผ์ด ์žˆ์–ด๋„ ์„œ๋น„์Šค๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

Job์€ controller์ฒ˜๋Ÿผ ๋…ธ๋“œ์— ๋ฌธ์žฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ƒˆ๋กœ์šด๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š”์ ์—์„œ๋Š” ๊ฐ™์ง€๋งŒ ์ผ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๊ฐ€๋˜๊ณ  ์‚ญ์ œ๋Š” ์•„๋‹ˆ๊ณ  ์ž์›์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํŠน์ • ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋“œ์— ๋“ค์–ด๊ฐ€์„œ ๋กœ๊ทธ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

template์™€ selector๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ selector๋Š” ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ๋งŒ๋“ค์–ด์ค€๋‹ค. completions ์˜ต์…˜์„ ์ฃผ๋ฉด ์˜ต์…˜๋งŒํผ์˜ ํŒŒ๋“œ๋“ค์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ๋ชจ๋‘ ์ข…๋ฃŒ๋˜์–ด์•ผ job๋„ ์ข…๋ฃŒ๊ฐ€ ๋œ๋‹ค.

parallelism ์˜ต์…˜์€ ์˜ต์…˜๋งŒํผ ํŒŒ๋“œ๊ฐ€ ๊ฐ™์ด ์ƒ์„ฑ์ด๋˜๊ณ  activeDeadlineSeconds์˜ต์…˜์„ ์ด์šฉํ•˜๋ฉด ํŠน์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด job์ด ์‚ญ์ œ๋˜๊ณ  job์— ์†ํ•˜๋Š” pod๋“ค๋„ ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” job์˜ ๋งˆ๊ฐ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž์›์„ ๋ฌดํ•œํžˆ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

apiVersion: batch/v1
kind: Job
metadata:
  name: job-1
spec:
  completions: 6
  parallelism: 2
  activeDeadlineSeconds: 30
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: container
          image: kubetm/init
          command: ['sh', '-c', "echo 'job start';sleep 20; echo 'job end'"]
      terminationGracePeriodSeconds: 0

3) CronJob

Job๋“ค์„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ์„œ ์ƒ์„ฑํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์ผ์ข…์˜ ์Šค์ผ€์ค„๋ง๊ฐ™์€ ๊ฐœ๋…

๋ฐฑ์—… / ์—…๋ฐ์ดํŠธ ์ฒดํฌ / ๋ฉ”์ผ/sms (message)์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

schedule๊ณผ jobTemplate์ด ์กด์žฌํ•˜๋ฉฐ schedule์€ cron format์ด๊ณ  jobTemplate์— job์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

concurrencyPolicy๋„ ์กด์žฌํ•˜๋Š”๋ฐ allow์˜ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ job์ด ์‹คํ–‰๋˜๊ณ  ์ด์ „ job์˜ ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ job์„ ์ด์–ด๊ฐ€๊ณ  forbid์˜ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด์˜ job์ด ๋๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด job์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  skip์ด ๋˜๊ณ  ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„๋•Œ ๊ทธ ์‹œ์ ์˜ job์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ๋‹ค. replace๋Š” ๊ธฐ์กด์˜ job์ด ์‚ญ์ œ๋˜๊ณ  ์ƒˆ๋กœ์šด job์„ ๋งŒ๋“ค์–ด job์„ ์‹คํ–‰ํ•œ๋‹ค.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron-job
spec:
  schedule: '*/1 * * * *'
  concurrencyPolicy: Replace
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: container
              image: kubetm/init
              command: ['sh', '-c', "echo 'job start';sleep 20; echo 'job end'"]
          terminationGracePeriodSeconds: 0
kubectl create job --from=cronjob/cron-job cron-job-manual-001 #cron-job-manual-001์ด๋ผ๋Š” ์ด๋ฆ„์˜ job์„ cron-job์˜ template์„ ์ด์šฉํ•ด์„œ jobํ•œ๊ฐœ๋ฅผ ์ƒ์„ฑ

kubectl patch cronjobs cron-job -p '{"spec" : {"suspend" : false }}' #suspend๋ฅผ true๋กœ ์ˆ˜์ •

suspend๊ฐ€ true๊ฐ€ ๋˜๋ฉด cronJob์€ job์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

4. StatefulSet

![stateful ](/devops/kubernetes/image/stateful .PNG)

Apache, nginx์™€ ๊ฐ™์€ web server๋Š” stateless application์ด๋ฉฐ mongodb, mariaDb, redis์™€ ๊ฐ™์€ db๋Š” Stateful Application์ด๋‹ค. Stateless๋Š” ์•ฑ์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋ฐฐํฌ๋˜๋”๋ผ๋„ ๋‹ค ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  Stateful์€ Primary/Secondary/Arbiter๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ Primary๊ฐ€ main DB๋กœ ์ด๊ฒƒ์ด ์ฃฝ๊ฒŒ๋˜๋ฉด Arbiter๊ฐ€ ๊ฐ์ง€ํ•ด์„œ Secondary๊ฐ€ primary์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

Stateless๋Š” ์•ฑ์ด ํ•˜๋‚˜์ฃฝ๋”๋ผ๋„ ๋‹ค๋ฅธ์ด๋ฆ„์˜ ์•ฑ์ด ํ•˜๋‚˜ ์žฌ์ƒ์„ฑ๋˜์ง€๋งŒ Stateful์€ ์ฃฝ์€ ์—ญํ• ๊ณผ ๊ฐ™์€ ์—ญํ• ์˜ ์•ฑ์ด ์žฌ์ƒ์„ฑ์ด ๋˜๊ณ  ์ด๋ฆ„๋˜ํ•œ ํ•˜๋‚˜์˜ identity๋กœ ๋˜‘๊ฐ™์€ ์ด๋ฆ„์ด ์ƒ์„ฑ๋œ๋‹ค. Stateful์€ ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ๋‹ค๋ฅธ ๋งŒํผ volume๋„ ๊ฐ๊ฐ ํ• ๋‹น์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ถ”๊ฐ€)

kubectl delete replicationcontrollers replication1 --cascade=false : replicationController๋ฅผ ์‚ญ์ œํ•˜๋”๋ผ๋„ ์ด์™€ ์—ฐ๊ฒฐ๋œ ํŒŒ๋“œ๋“ค์„ ์‚ญ์ œํ•˜์ง€ ์•Š์€ ์˜ต์…˜์œผ๋กœ ์ด๋ฅผ ์ด์šฉํ•ด์„œ replicationContoller๋ฅผ replicationSet์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


Reference

์ธํ”„๋Ÿฐ-๊น€ํƒœ๋ฏผ๋‹˜ ๊ฐ•์˜

Last updated