Controller

  • pod๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• , pod์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๋ณด์žฅํ•ด์คŒ
  • API, etcd,scheduler, cotroller ๊ฐ€ ํ•จ๊ป˜ ํ˜‘์—…ํ•˜๋ฉด์„œ pod์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด์žฅ
    • ์š”์ฒญํ•˜์—ฌ ๋ณด์žฅํ•ด๋†“์€ pod ์ค‘ ํ•˜๋‚˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ๋˜๋ฉด
    • controller๊ฐ€ API์—๊ฒŒ pod ํ•˜๋‚˜๋ฅผ ๋” ๋งŒ๋“ค๋„๋ก ์š”์ฒญ
    • scheduler๋ฅผ ํ†ตํ•˜์—ฌ pod๋ฅผ ๋ฐฐ์น˜ํ•˜๋„๋ก ํ•˜์—ฌ ์š”์ฒญ๋œ pod์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด์žฅ

์ปจํŠธ๋กค๋Ÿฌ์˜ ์ข…๋ฅ˜

png

1. Replication Controller(RC)

  • ์š”๊ตฌํ•˜๋Š” pod์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ ํŒŒ๋“œ ์ง‘ํ•ฉ์˜ ์‹คํ–‰์„ ํ•ญ์ƒ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ
    • ์š”๊ตฌํ•˜๋Š” pod์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด template๋ฅผ ์ด์šฉํ•ด์„œ pod ์ถ”๊ฐ€
    • ์š”๊ตฌํ•˜๋Š” pod ์ˆ˜ ๋ณด๋‹ค ๋งŽ์œผ๋ฉด ์ตœ๊ทผ์— ์ƒ์„ฑ๋œ pod๋ฅผ ์‚ญ์ œ
  • ๊ธฐ๋ณธ ๊ตฌ์„ฑ
    • selector : RC๊ฐ€ ๊ด€๋ฆฌํ•  Pod๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ
    • replicas : RC์— ์˜ํ•ด์„œ ๊ด€๋ฆฌ๋˜๋Š” Pod์˜ ์ˆ˜์ธ๋ฐ, ๊ทธ ์ˆซ์ž๋งŒํผ Pod์˜ ์ˆ˜๋ฅผ ์œ ์ง€
    • template : Pod๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ ์–ด๋–ค Pod๋ฅผ ๋งŒ๋“ค์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ๋ฐ (๋„์ปค ์ด๋ฏธ์ง€, ํฌํŠธ, ๋ผ๋ฒจ ๋“ฑ) ์ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ •์˜ํ•œ ํ…œํ”Œ๋ฆฟ

png

๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์˜ˆ์ œ1

$ cat rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3 # ๋ฐฐํฌ ๊ฐฏ์ˆ˜
  selector:
    app: webui # key:value ์ด๋Ÿฐ key, value๋ฅผ ๊ฐ€์ง€๋Š” pod๋ฅผ replicas ์ˆ˜ ๋งŒํผ ์šด์˜ํ•ด์ค˜
  template: # ์ถ”๊ฐ€๋กœ pod๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ pod template๋ฅผ ๋ณด๊ณ  ์ƒ์„ฑ 
    metadata:
      name: nginx-pod
      labels:
        app: webui # selector์— ์žˆ๋Š” key, value๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ผ๋ฒจ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
 
$ kubectl create -f rc-nginx.yaml
  • ํ˜„์žฌ ๋™์ž‘์ค‘์ธ pod ์ˆ˜
    $ watch kubectl get pods -o wide
    
  • rc์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ(2๊ฐ€์ง€ ๋ฐฉ๋ฒ•)
    $ kubectl get replicationcontrollers
    $ kubectl get rc
    
  • rc์˜ ์ •๋ณด๋ฅผ ์ž์„ธํ•˜๊ฒŒ ์ถœ๋ ฅ
    $ kubectl describe rc rc-nginx
    
  • ํŒŒ๋“œ ์‚ญ์ œ ์‹œ replication controller๊ฐ€ ํ•˜๋Š” ์ผ์€?
    $ kubectl get pods
    $ kubectl delete pod rc-nginx-XXXX
    

๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์˜ˆ์ œ2

  • yaml ํŒŒ์ผ ์ˆ˜์ •ํ•˜์—ฌ pod scale out/down
$ cat edit rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3 
  selector:
    app: webui # key:value ์ด๋Ÿฐ key, value๋ฅผ ๊ฐ€์ง€๋Š” pod๋ฅผ replicas ์ˆ˜ ๋งŒํผ ์šด์˜ํ•ด์ค˜
  template: # ์ถ”๊ฐ€๋กœ pod๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ pod template๋ฅผ ๋ณด๊ณ  ์ƒ์„ฑ 
    metadata:
      name: nginx-pod
      labels:
        app: webui # selector์— ์žˆ๋Š” key, value๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ผ๋ฒจ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
 
  • command๋กœ pod scale out/down
$ kubectl scale rc rc-nginx --relicas=3

๋ฒ„์ „ ๋ณ€๊ฒฝ

  • ์„œ๋น„์Šค ๋™์ž‘ ์ค‘์— ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” pod์˜ ๋ฒ„์ „ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(Rolling Update)
  • ๊ธฐ์กด pod์— ์˜ํ–ฅ์€ ์—†์Œ
$ cat edit rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3 
  selector:
    app: webui # key:value ์ด๋Ÿฐ key, value๋ฅผ ๊ฐ€์ง€๋Š” pod๋ฅผ replicas ์ˆ˜ ๋งŒํผ ์šด์˜ํ•ด์ค˜
  template: # ์ถ”๊ฐ€๋กœ pod๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ pod template๋ฅผ ๋ณด๊ณ  ์ƒ์„ฑ 
    metadata:
      name: nginx-pod
      labels:
        app: webui # selector์— ์žˆ๋Š” key, value๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ผ๋ฒจ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.15 # ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” 
 
  • ๋™์ž‘์ค‘์ธ pod ํ™•์ธ
$ kubectl describe pod rc rc-nginx-XXX
  • pod ์‚ญ์ œ(rc ์‚ญ์ œํ•˜๋ฉด pod๊นŒ์ง€ ๋‹ค ์‚ญ์ œ)
$ kubectl delete pod rc rc-nginx-XXX
  • pod ์‚ญ์ œ๋กœ ์ƒ์„ฑ๋œ ์ƒˆ๋กœ์šด pod ํ™•์ธ
$ kubectl describe pod rc rc-nginx-YYY

2. ReplicaSet

  • replication controller์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ
  • replication controller ๋ณด๋‹ค ๋” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ selector ์ง€์›
selector:
    matchLabels:
        component: redis
    matchExpressions: # ๋‹ค์–‘๋‹ค์–‘
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: Notln, values: [dev]}
  • matchExpressions ์—ฐ์‚ฐ์ž
    • In : key์™€ values๋ฅผ ์ง€์ •ํ•˜์—ฌ key,value๊ฐ€ ์ผ์น˜ํ•˜๋Š” pod๋งŒ ์—ฐ๊ฒฐ
    • Notln : key๋Š” ์ผ์น˜ํ•˜๊ณ  value๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” pod์— ์—ฐ๊ฒฐ
    • Exists : key์— ๋งž๋Š” label์˜ pod๋ฅผ ์—ฐ๊ฒฐ
    • DoesNotExist : key์™€ ๋‹ค๋ฅธ label์˜ pod๋ฅผ ์—ฐ๊ฒฐ
$cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui 
  template: 
    metadata:
      name: nginx-pod
      labels:
        app: webui 
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
$ kubectl create -f rs-nginx.yaml
  • ๋™์ž‘์ค‘์ธ pod ์ˆ˜ ํ™•์ธ
$ watch kubectl get pods -o wide
  • rs์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ(2๊ฐ€์ง€ ๋ฐฉ๋ฒ•)
$ kubectl get replicasets
$ kubectl get rs
$ kubectl describe rs rs-nginx
  • ํŒŒ๋“œ ์‚ญ์ œ์‹œ rc๊ฐ€ ํ•˜๋Š” ์ผ์€? ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ pod ์ˆ˜ ๊ณ„์† ์œ ์ง€
$ kubectl get pods
$ kubectl delete pod rs-nginx-XXXX
  • pod๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋งŒ ์‚ญ์ œ
$ kubectl delete rs rs-nginx --cacade=false # ์—ฐ์‡„ ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ์˜ต์…˜
$ kubectl get rs
$ kubectl get pods
$ kubectl delete pod --all

# 3. Deployment

  • ReplicaSet์„ ์ œ์–ดํ•ด์ฃผ๋Š” ๋ถ€๋ชจ ์—ญํ• , ReplicaSet์„ ์ปจํŠธ๋กคํ•ด์„œ pod ์ˆ˜ ์กฐ์ ˆ
  • ๋ชฉ์  : Rolling Update & Rolling Back
    • Rolling Update
      • ํŒŒ๋“œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ deployment update๊ฐ€ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    • Rolling Back : ์ด์ „ ๋ฒ„์ „์œผ๋กœ

์˜ˆ์ œ

$cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui 
  template: 
    metadata:
      name: nginx-pod
      labels:
        app: webui 
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
$ kubectl create -f deploy-nginx.yaml
  • ๋™์ž‘์ค‘์ธ pod ์ˆ˜ ํ™•์ธ
$ watch kubectl get pods -o wide
  • rs๋ฅผ ์ง€์›Œ๋„ deployment๊ฐ€ rs๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์—ฌ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ(deploy๊ฐ€ ์ตœ์ƒ์œ„ ๊ฐœ๋…)
$ kubectl delete rs deploy-nginx-XXX
$ kubectl get deployments
$ kubectl get replicasets
$ kubectl get pods
$ kubectl delete deployment deploy-nginx

Rolling Update & Rolling Back

  • Rolling Update
$ kubectl set image deployment <deploy_name> <container_name> = <new_version image>
  • Rolling Back
$ kubectl rollout history deployment <deploy_name>
$ kubectl rollout undo deploy <deploy_name>

doploy ์˜ˆ์ œ1

$cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui 
  template: 
    metadata:
      name: nginx-pod
      labels:
        app: webui 
    spec:
      containers:
      - image: nginx:1.14
        name: web
        ports :
        - containerPort: 80
$ kubectl create -f deployment-exam.ymal --record
$ kubectl get deployment,rs,pod,svc

# Rolling Update
$ kubectl set image deploy app-deploy web=nginx:1.15 --record # record์˜ต์…˜: ์—…๋ฐ์ดํŠธ ๊ณผ์ •์„ history๋กœ ๊ธฐ๋ก
$ kubectl set image deploy app-deploy web=nginx:1.16 --record
$ kubectl set image deploy app-deploy web=nginx:1.17 --record

# controlling Rolling Update
$ kubectl rollout pause deploy app-deploy # ์—…๋ฐ์ดํŠธ ์ผ์‹œ์ •์ง€
$ kubectl rollout resume deploy app-deploy # ์—…๋ฐ์ดํŠธ ์žฌ์‹œ์ž‘
$ kubectl rollout status deploy app-deploy # ์—…๋ฐ์ดํŠธ ์ƒํƒœ 
$ kubectl rollout history deployment app-deploy # deploy ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ
$ kubectl rollout undo deployment app-deploy # ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ
$ kubectl rollout undo deployment app-deploy --to-revision=3 # revision=3์œผ๋กœ ๋กค๋ฐฑ
 

doploy ์˜ˆ์ œ2

  • yaml ํŒŒ์ผ๋กœ ์ˆ˜์ •
$cat deployment-exam2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  annotations: 
    kubernetes.io/change-cause: version 1.14
spec:
  progressDeadlineSeconds:600
  revisionHistoryLimit: 10
  strategy:
    rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
    type: RollingUpdate

  replicas: 3
  selector:
    matchLabels:
      app: webui 
  template: 
    metadata:
      name: nginx-pod
      labels:
        app: webui 
    spec:
      containers:
      - image: nginx:1.14
        name: web
        ports :
        - containerPort: 80
$ kubectl apply -f deployment-exam2.yaml 
$ kubectl get deployment,rs,pod,svc

# ์ด๋ฏธ์ง€ ์—…๋ฐ์ดํŠธ
$ vi deployment-exam2.yaml
->  annotations: 
    kubernetes.io/change-cause: version 1.15
    ...
    spec:
    containers:
    - image: nginx:1.15
    name: web

#apply
$ kubectl apply -f deployment-exam2.yaml 

# ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ & ์ด๋ฏธ์ง€ ๋กค๋ฐฑ
$ kubectl rollout history deployment app-deploy 
$ kubectl rollout undo deployment app-deploy 

4. DaemonSet

  • ์ „์ฒด ๋…ธ๋“œ์—์„œ pod๊ฐ€ ๋…ธ๋“œ๋‹น ํ•œ ๊ฐœ์”ฉ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅ
    • ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” pod๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ ์‚ญ์ œ ๋œ ํ›„ ๋…ธ๋“œ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์—ญํ• 
  • ๋กœ๊ทธ ์ˆ˜์ž…๊ธฐ, ๋ชจ๋‹ˆํ„ฐ๋ง ์—์ด์ „ํŠธ์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ์ ์šฉ
$cat daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui 
  template: 
    metadata:
      name: nginx-pod
      labels:
        app: webui 
    spec:
      containers:
      - image: nginx:1.14
        name: nginx-container
$ kubectl create -f daemonset-nginx.yaml

$ kubectl get daemonset
$ kubectl get pods

# daemonset์œผ๋กœ ๋™์ž‘์ค‘์ธ pod ์‚ญ์ œํ•˜๋ฉด?
$ kubectl delete daemonset-nginx-XXX # daemonset rolling update - ์‹คํ–‰๋˜๊ณ  ์žˆ๋˜ ์ปจํ…Œ์ด๋„ˆ ๋ฒ„์ „ ์ˆ˜์ • ๋ณ€๊ฒฝ
$ kubectl edit ds daemonset-nginx

...

->       containers:
      - image: nginx:1.15 # rolling back
      
$ kubectl rollout undo daemonset daemonset-nginx # ์‚ญ์ œ
$ kubectl delete daemonsets.apps daemonset-nginx

5. statefulset

  • pod์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ
    • pod ์ด๋ฆ„
      • ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์„œ pod ์‚ญ์ œ ๋ฐ ์žฌ์ƒ์„ฑํ•  ๊ฒฝ์šฐ pod์˜ ์ด๋ฆ„์ด ๋ณด์žฅ๋˜์ง€ ์•Š๊ณ  ์ƒ์„ฑ๋จ
      • statefulset ์œผ๋กœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ, ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์ƒ์„ฑ๋จ
      • ์ƒ์„ฑ ์ˆœ์„œ์— ๋”ฐ๋ฅธ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด pod ์ด๋ฆ„์ด ๋ณด์žฅ
    • pod ๋ณผ๋ฅจ(์Šคํ† ๋ฆฌ์ง€)
$cat statefulset-exam.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sf-nginx
spec:
  replicas: 3
  serviceName: sf-service
  podManagementPolicy: Parallel
  selector:
    matchLabels:
      app: webui 
  template: 
    metadata:
      name: nginx-pod
      labels:
        app: webui 
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

$ kubectl create -f statefulset-exam.yaml 
$ kubectl get statefulsets,pod # ๋™์ž‘์ค‘์ธ ๋‘๋ฒˆ์งธ pod ์‚ญ์ œ -> 1๋ฒˆ์ด ์™„์ „ํžˆ ์‚ญ์ œ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ 1๋ฒˆ์„ ์ƒ์„ฑํ•จ

$ kubectl delete pod sf-nginx-1

# scale down / up
$ kubectl scale statefulset sf-nginx --replicas=2 # 2๋ฒˆ pod ์‚ญ์ œ
$ kubectl scale statefulset sf-nginx --replicas=4 # 3๋ฒˆ pod ์ƒ์„ฑ

# rolling update / rolling back
$ kubectl edit statefulsets.apps sf-nginx 
$ kubectl rollout undo statefulsets.apps sf-nginx 

6. JOB

  • Kubernetessms pod๋ฅผ running์ค‘์ธ ์ƒํƒœ๋กœ ์œ ์ง€
  • Batch ์ฒ˜๋ฆฌํ•˜๋Š” pod๋Š” ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ข…๋ฃŒ๋จ
  • Batch ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ pod์˜ ์„ฑ๊ณต์ ์ธ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅ
    • ๋น„์ •์ƒ ์ข…๋ฃŒ ์‹œ ๋‹ค์‹œ ์‹คํ–‰
    • ์ •์ƒ ์ข…๋ฃŒ์‹œ ์™„๋ฃŒ
$cat job-exam.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: centos-job
spec:
  # completions: 5 # ์‹คํ–‰ํ•ด์•ผ ํ•  job์˜ ์ˆ˜๊ฐ€ ๋ช‡๊ฐœ์ธ์ง€ ์ง€์ •
  # parallelism: 2 # ๋ณ‘๋ ฌ์„ฑ. ๋™์‹œ running๋˜๋Š” pod ์ˆ˜
  # activeDeadlineSecons: 15 # ์ง€์ • ์‹œ๊ฐ„ ๋‚ด์— job์„ ์™„๋ฃŒ, ์ง€์ • ์‹œ๊ฐ„์•ˆ์— ๋๋‚˜์ง€ ์•Š์œผ๋ฉด ๊ฐ•์ œ ์™„๋ฃŒ
  template: 
    spec:
      containers:
      - name: centos-container
        image: centos:7
        command: ["bash"]
        args:
        - "-c"
        - "echo 'Hello World'; sleep 50; echo 'Bye'"
      restartPolicy: Never # ๋น„์ •์ƒ ์ข…๋ฃŒ์‹œ pod๋งŒ restart
      # restartPolicy: OnFailure  # ๋น„์ •์ƒ ์ข…๋ฃŒ์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ restart
      # backoffLimit : 3 # restart limit ๊นŒ์ง€ restart ๋˜๊ณ  ๊ทธ๋ž˜๋„ ์•ˆ๋˜๋ฉด ์ž‘์—…์ž์ฒด๋ฅผ ์‚ญ์ œ


  • 50์ดˆ ๋™์•ˆ ์‹คํ–‰
    • 50์ดˆ ์ด๋‚ด์— ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜๋ฉด -> ๋‹ค์‹œ pod ์ƒ์„ฑํ•˜์—ฌ ์žฌ์ˆ˜ํ–‰
    • 50์ดˆ ํ›„ ์ •์ƒ ์ข…๋ฃŒ๋˜๋ฉด ๋(๋”์ด์ƒ์˜ ์‹คํ–‰ x)
$ kubectl create -f job-exam.yaml
$ kubectl get job,pods
$ kubectl get pods
$ kubectl delete jobs.apps centos-job

7. CronJob

  • CronJob์•ˆ์— job์˜ ์ปจํŠธ๋กค ๊ธฐ๋Šฅ ํฌํ•จ, job ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์‹คํ–‰ํ•  application pod๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ์‹คํ–‰
  • Linux์˜ cronjob์˜ ์Šค์ผ€์ค„๋ง ๊ธฐ๋Šฅ์„ job controller์— ์ถ”๊ฐ€ํ•œ API(์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์‚ฌ๊ฐ„์— job ์‹คํ–‰ ์˜ˆ์•ฝ ์ง€์›)
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” job์„ ์šด์˜ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ
    • Data Backup
    • Send email
    • Cleaning tasks
  • Cronjob Schedule: โ€œ0 3 1 * * โ€œ
    • Minutes (from 0 to 59)
    • Hours (from 0 to 23)
    • Day (from 1 to 31)
    • Month (from 1 to 12)
    • Day of the week (from 0 to 6)

png png png png png

$cat cronjob-exam.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-exam
spec:
  schedule: "* * * * *"
  startingDeadlineSeconds: 500  
  # successfulJobHistoryLimit: 3 # ์„ฑ๊ณตํ•œ job์— ๋Œ€ํ•ด์„œ history 3๊ฐœ๊นŒ์ง€๋งŒ ๋‚จ๊ธฐ๊ฒ ์–ด
  concurrencyPolicy: Forbid  # ํ•œ๋ฒˆ์— ํ•˜๋‚˜์”ฉ๋งŒ running
# concurrencyPolicy: ALLOW # ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ job์ด running ์ค‘์ด์–ด๋„ ๋จ
  jobTemplate: 
    spec:
      template:
        spec:
          containers:
      - name: hello
        image: busybox
        args:
        - /bin/sh
        - -c
        - "echo 'Hello World'; sleep 10; echo 'Bye'"
      restartPolicy: Never

$ kubectl create -f cronjob-exam.yaml
$ kubectl get cronjob
$ kubectl get pods
$ kubectl delete cronjob cronjob-exam