Featured image of post 4์žฅ - replicaset

4์žฅ - replicaset

Liveness Probe & replicaset, daemonset, job

Liveness probe ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ํŒŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๋ฆฌ์†Œ์Šค๋“ค์„ ์•Œ์•„๋ณด์ž

์ปจํ…Œ์ด๋„ˆ์˜ ์ฃผ ํ”„๋กœ์„ธ์Šค์— crash๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด kubelet์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์— ํŠน๋ณ„ํ•œ ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์‹คํ–‰ ์ค‘์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฌดํ•œ ๋ฃจํ”„๋‚˜ ๊ต์ฐฉ ์ƒํƒœ์— ๋น ์ ธ ์‘๋‹ต์„ ๋ฉˆ์ถ”๋Š” ์ƒํ™ฉ์—๋Š” ์–ด๋–จ๊นŒ? Crash ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ๋˜์ง€๋งŒ ๋ฌดํ•œ๋ฃจํ”„๋‚˜ ๊ต์ฐฉ ์ƒํƒœ๋ผ๋ฉด ์•„๋ฌด๋„ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ k8s์—์„œ๋Š” ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ด์•„์žˆ๋Š” ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

Liveness Probe

๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๋ฅผ ์ง€์ •ํ•ด k8s๊ฐ€ ๋” ์ด์ƒ ์ •์ƒ์ ์ด์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ์ฆ‰์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„์ง ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. k8s๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์ง„๋‹จ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ตฌํ˜„ํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ kubelet์ด ํ˜ธ์ถœํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค.

img.png

์šด์˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ์˜ ๊ฒฝ์šฐ, ํ•ญ์ƒ ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด k8s๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„์ง ์‚ด์•„ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

k8์—๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๊ฐ€ ์žˆ๋‹ค.

HTTP Request

HTTP GET ํ”„๋กœ๋ธŒ๋Š” ์ง€์ •ํ•œ IP ์ฃผ์†Œ, ํฌํŠธ, ๊ฒฝ๋กœ์— HTTP GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์‘๋‹ต์ด ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด ํ”„๋กœ๋ธŒ๋Š” ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:  # HTTP Get์„ ์ˆ˜ํ–‰ํ•  ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ
        path: /healthz # ๋„คํŠธ์›Œํฌ ํฌํŠธ HTTP ์š”์ฒญ์—์„œ ์š”์ฒญํ•  ๊ฒฝ๋กœ
        port: 8080 # ํ”„๋กœ๋ธŒ๊ฐ€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํฌํŠธ
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3 # ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ํ•˜๊ณ  3์ดˆ ํ›„ ํ”„๋กœ๋ธŒ ์‹œ์ž‘
      periodSeconds: 3 # 3์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ ์‹คํ–‰

์ •์˜๋œ ํ”„๋กœ๋ธŒ๋Š” k8s์—๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ์ „ํžˆ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด ‘/healthz’ ๊ฒฝ๋กœ์˜ ํฌํŠธ 8080 HTTP GET ์š”์ฒญ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์•Œ๋ ค์ค€๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น์„œ๋ฒ„๊ฐ€ HTTP ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

๋™์ž‘ ์ค‘์ธ ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ ๋ณด๊ธฐ

kubectl describe ์ปค๋งจ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

liveness.png

State๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Last State๋Š” ์ง€๋‚œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€๋‚œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ Liveness๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๊ณ  3์ดˆ(delay) ์ดํ›„ ํ”„๋กœ๋ธŒ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ์š”์ฒญ์‹œ 1์ดˆ(timeout) ์ด๋‚ด์— ์‘๋‹ต์„ ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹คํŒจํ•œ๋‹ค. 3์ดˆ ๋งˆ๋‹ค(period) HTTP GET ์š”์ฒญ์„ ํ•˜๋ฉฐ ์—ฐ์†์œผ๋กœ 3๋ฒˆ ์‹คํŒจ(failure)ํ•˜๋ฉด kubelet์ด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘์‹œํ‚จ๋‹ค.

TCP Socket

์ปจํ…Œ์ด๋„ˆ์˜ ์ง€์ •๋œ ํฌํŠธ์— TCP๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด ํ”„๋กœ๋ธŒ๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    ports:
    - containerPort: 8080
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

TCP Socket์„ ํ†ตํ•œ ํ”„๋กœ๋ธŒ๋Š” HTTP Request ํ”„๋กœ๋ธŒ์™€ ๋น„์Šทํ•˜๋‹ค.

Exec Command

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๋ช…๋ น์˜ ์ข…๋ฃŒ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 0์ด๋ฉด ๊ฒ€์‚ฌ๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

kubelet์ด initialDelaySeconds, periodSeconds๋ฅผ ๊ณ ๋ คํ•ด cat /tmp/healthy ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ args๋ฅผ ๋ณด๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ๋นˆ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์ผ ์‚ญ์ œ๊ฐ€ ๋˜๋ฉด ๋ผ์ด๋ธŒ๋‹ˆ์Šค ํ”„๋กœ๋ธŒ๋Š” ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. kubelet์€ ์ง€์†์ ์œผ๋กœ ์ปค๋งจ๋“œ๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋น„์ •์ƒ์ ์ด๋ผ๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

References


์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ReplicaSet, DeamonSet, Job, CronJob, Deployment, StatefulSet ๋“ฑ์ด ์žˆ๋‹ค

ReplicaSet

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

rs.png

์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ ๋Œ€์‹  ์ƒ์œ„ ์ˆ˜์ค€์˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

๐Ÿงฉ ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์ž‘์„ฑ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# frontend.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3 # ์›ํ•˜๋Š” ํŒŒ๋“œ ๊ฐœ์ˆ˜. ๊ธฐ๋ณธ๊ฐ’์€ 1
  selector: # ๋ผ๋ฒจ ์ฒดํฌ ์กฐ๊ฑด. ์–ด๋–ค ๋ ˆ์ด๋ธ”์˜ ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•ด์„œ ๊ด€๋ฆฌํ• ์ง€ ์„ค์ •
    matchLabels:
      tier: frontend
  template: # ์ƒ์„ฑํ•  ํŒŒ๋“œ ๋ช…์„ธ
    metadata:
      labels:
        tier: frontend
    spec:
      containers: # ์ปจํ…Œ์ด๋„ˆ ๋ช…์„ธ
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

๋ผ๋ฒจ์„ ์ฒดํฌํ•ด์„œ ์›ํ•˜๋Š” ์ˆ˜์˜ ํŒŒ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๐Ÿงฉ ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์ƒ์„ฑ ์ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ frontend.yaml์— ์ €์žฅํ•˜๊ณ  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•˜๋ฉด ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ์ƒ์„ฑ๋˜๊ณ  ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

1
2
# ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์ƒ์„ฑ
$ kubectl apply -f frontend.yaml

๐Ÿงฉ ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ํ™•์ธ ํ˜„์žฌ ๋ฐฐํฌ๋œ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒ์„ฑ๋œ frontend๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
# ๋ฆฌ์†Œ์Šค ํ™•์ธ
$ kubectl get rs

NAME       DESIRED   CURRENT   READY   AGE
frontend   3         3         3       6s
  • DISIRED : ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์„ค์ •์— ์ง€์ •ํ•œ ํŒŒ๋“œ ๊ฐœ์ˆ˜
  • CURRENT : ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ์ด์šฉํ•ด ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์ž‘ํ•˜๋Š” ์‹ค์ œ ํŒŒ๋“œ ๊ฐœ์ˆ˜
  • READY : ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ ํŒŒ๋“œ์˜ ๊ฐœ์ˆ˜

๋˜ํ•œ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•  ๊ฒƒ์ด๋‹ค.

1
$ kubectl describe rs/frontend
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Name:         frontend
Namespace:    default
Selector:     tier=frontend
Labels:       app=guestbook
              tier=frontend
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"labels":{"app":"guestbook","tier":"frontend"},"name":"frontend",...
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  tier=frontend
  Containers:
   php-redis:
    Image:        gcr.io/google_samples/gb-frontend:v3
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  117s  replicaset-controller  Created pod: frontend-wtsmm
  Normal  SuccessfulCreate  116s  replicaset-controller  Created pod: frontend-b2zdv
  Normal  SuccessfulCreate  116s  replicaset-controller  Created pod: frontend-vcmts

๐Ÿงฉ ํŒŒ๋“œ ํ™•์ธ ํ˜„์žฌ ํŒŒ๋“œ ์ •๋ณด๋ฅผ ํ™•์ธํ•œ๋‹ค.

1
2
3
4
5
6
7
# ํŒŒ๋“œ ํ™•์ธ
$ kubectl get pods

NAME             READY   STATUS    RESTARTS   AGE
frontend-b2zdv   1/1     Running   0          6m36s
frontend-vcmts   1/1     Running   0          6m36s
frontend-wtsmm   1/1     Running   0          6m36s

.spec.replicas๋ฅผ 3์œผ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— frontend-b2zdv, frontend-vcmts, frontend-wtsmm๋ผ๋Š” ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงฉ ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์‚ญ์ œ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ์‚ญ์ œํ•œ๋‹ค. ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ์‚ญ์ œํ•˜๋ฉด ๊ด€๋ จ ํŒŒ๋“œ๋„ ๋ชจ๋‘ ์‚ญ์ œ๋œ๋‹ค.

1
$ kubectl delete rs frontend

References


DaemonSet

๋ฐ๋ชฌ์…‹์€ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ๋…ธ๋“œ์— ํŠน์ • ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์ƒˆ๋กญ๊ฒŒ ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ๋ฐ๋ชฌ์…‹์ด ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

๐Ÿ”Ž ์ปจํŠธ๋กค๋Ÿฌ: ๊ธฐ๋ณธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ๋กœ, ๋Œ€ํ‘œ์ ์œผ๋กœ ReplicaSet, DeamonSet, StatefulSet, Job, Deployment ๋“ฑ์ด ์žˆ๋‹ค.

daemonset

๋ฐ๋ชฌ์…‹์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ์ˆ˜๋งŒํผ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐฐํฌํ•œ๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋‹ค์šด๋ผ๋„ ๋ฐ๋ชฌ์…‹์€ ์–ด๋Š ๊ณณ์—์„œ๋„ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋น ์กŒ์„ ๋•Œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ์žˆ๋˜ ํŒŒ๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ๋ผ์งˆ ๋ฟ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ€์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

๋ฐ๋ชฌ์…‹์€ ๋ณดํ†ต ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ๋ชฌ ๋“ฑ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์— ํ•ญ์ƒ ์‹คํ–‰ํ•ด๋‘์–ด์•ผ ํ•˜๋Š” ํŒŒ๋“œ์— ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐ๋ชฌ์…‹ ์ƒ์„ฑ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myapp-ds
spec:
  selector:
    matchLabels:
      app: myapp-ds
  template:
    metadata:
      labels:
        app: myapp-ds
    spec:
      nodeSelector:
        node: development
      containers:
      - name: myapp
        image: ghcr.io/c1t1d0s7/go-myweb
        ports:
        - containerPort: 8080

๐Ÿ”Ž .spec.template.spec.nodeSelector: ํŒŒ๋“œ๋ฅผ ํŠน์ • ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•œ๋‹ค. ๋…ธ๋“œ์˜ ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ ํ•„๋“œ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹, ๋ฐ๋ชฌ์žก, ์žก, ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ๋ชฌ์…‹ ํ™•์ธ

1
2
# ๋ฐ๋ชฌ์…‹ ํ™•์ธ
$ kubectl get ds
1
2
$ kubectl get po
No resources found.

DISIRED, CURRENT, READY ๋“ฑ์ด ๋ชจ๋‘ 0์œผ๋กœ ๋ณด์ธ๋‹ค. ํŒŒ๋“œ ๋ชฉ๋ก์„ ๋‚˜์—ดํ•˜๋Š” ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?

๋ฐ๋ชฌ์…‹ ์ •์˜์— ๋…ธ๋“œ์…€๋ ‰ํ„ฐ๋กœ node=development ๋ ˆ์ด๋ธ”์„ ์„ ํƒํ•˜๋„๋ก ์ •์˜ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ ๋ ˆ์ด๋ธ”๊ณผ ๋งค์นญ๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์–ด์„œ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋…ธ๋“œ ๋ ˆ์ด๋ธ” ์ง€์ •

๋ฐ๋ชฌ์…‹์ด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•œ๋‹ค. kube-node1 ๋…ธ๋“œ์— node=development ๋…ธ๋“œ ๋ ˆ์ด๋ธ”์„ ์„ค์ •ํ•œ๋‹ค.

1
2
$ kubectl label nodes kube-node1 node=development
node/kube-node1 labeled

DaemonSet vs ReplicaSet

๋ ˆํ”Œ๋ฆฌ์นด์…‹์€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์— ์ •์˜๋œ ํŒŒ๋“œ์˜ ์ˆ˜๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ•ญ์ƒ ์‹คํ–‰๋˜๋„๋ก ํ•˜์ง€๋งŒ ๋ฐ๋ชฌ์…‹์€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ •์˜๋œ ํ•˜๋‚˜์˜ ํŒŒ๋“œ ๋ณต์‚ฌ๋ณธ์ด ๋ชจ๋“  ๋…ธ๋“œ์— ํ•˜๋‚˜์”ฉ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค.

๋ ˆํ”Œ๋ฆฌ์นด์…‹์€ ํด๋Ÿฌ์Šคํ„ฐ์— ์›ํ•˜๋Š” ์ˆ˜์˜ ํŒŒ๋“œ ๋ณต์ œ๋ณธ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ˜๋ฉด, ๋ฐ๋ชฌ์…‹์—๋Š” ์›ํ•˜๋Š” ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜์˜ ๊ฐœ๋…์ด ์—†๋‹ค. ํŒŒ๋“œ ์…€๋ ‰ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ํŒŒ๋“œ๊ฐ€ ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ฐ๋ชฌ์…‹์ด ์ˆ˜ํ–‰ํ•ด์•ผํ•  ์—ญํ• ์ด๋‹ค.

daemon_rs

์ฆ‰, ๋ ˆํ”Œ๋ฆฌ์นด์…‹์€ ํŒŒ๋“œ๋ฅผ ์ž„์˜์˜ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์Šค์ผ€์ค„ํ•˜๋Š” ๋ฐ˜๋ฉด, ๋ฐ๋ชฌ์…‹์€ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐ๋ชฌ์…‹์—์„œ ์ •์˜ํ•œ ํŒŒ๋“œ์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

References


๋ ˆํ”Œ๋ฆฌ์นด์…‹๊ณผ ๋ฐ๋ชฌ์…‹์€ ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๊ณ„์† ํ…Œ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Ÿฐ ํŒŒ๋“œ์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์‹œ์ž‘๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์™„๋ฃŒ ๊ฐ€๋Šฅํ•œ ํƒœ์Šคํฌ์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

Job

job

๐Ÿ”Ž ์ปจํŠธ๋กค๋Ÿฌ: ๊ธฐ๋ณธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ๋กœ, ๋Œ€ํ‘œ์ ์œผ๋กœ ReplicaSet, DeamonSet, StatefulSet, Job, Deployment ๋“ฑ์ด ์žˆ๋‹ค.

์žก์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์ง€์ •๋œ ์ˆ˜์˜ ํŒŒ๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋„๋ก ํ•œ๋‹ค. ์ฆ‰, ๋‚ด๋ถ€์—์„œ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑ์—…์ด๋‚˜ ํŠน์ • ๋ฐฐ์น˜ ํŒŒ์ผ๋“ค์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒ๋˜๋Š” ์„ฑ๊ฒฉ์˜ ์ž‘์—…์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

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

job-managing

๋ฆฌ์†Œ์Šค ์ •์˜

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: batch/v1 # ์žก์€ batch api ๊ทธ๋ฃน์˜ ๋ฒ„์ „ v1์— ์žˆ๋‹ค
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never # ํŒŒ๋“œ์˜ ์žฌ์‹œ์ž‘ ์ •์ฑ… ์„ค์ •
  backoffLimit: 4 # ์žฌ์‹œ๋„ ํšŸ์ˆ˜ ์„ค์ •
  activeDeadlineSeconds: 100 # ํŒŒ๋“œ์˜ ์‹คํ–‰์‹œ๊ฐ„ ์„ค์ •

ํŒŒ์ด(ฯ€)์˜ 2000์ž๋ฆฌ๊นŒ์ง€ ๊ณ„์‚ฐํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”Ž restartPolicy ์˜ต์…˜: ํŒŒ๋“œ์˜ ์žฌ์‹œ์ž‘ ์ •์ฑ…์„ ์„ค์ •ํ•œ๋‹ค.

  • always: ํ•ญ์ƒ ์žฌ์‹œ์ž‘ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด์ง€๋งŒ, ์žก ํŒŒ๋“œ๋Š” ๋ฌด์ œํ•œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ •์ฑ…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.) restartPolicy ์ •์ฑ…์„ onFailure๋‚˜ Never๋กœ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
  • onFailure: ๋น„์ •์ƒ ์ข…๋ฃŒ ๋ฐœ์ƒ ์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • Never: ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ”Ž backoffLimit ์˜ต์…˜: ์žก์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋‹ค์‹œ ์‹คํ–‰์‹œํ‚ฌ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 6์ด๋‹ค. ๋ณดํ†ต ์žก ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žฌ์‹œ์ž‘์„ ๊ด€๋ฆฌํ•  ๋–„๋งˆ๋‹ค ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋Š˜๋ฆฐ๋‹ค. ์ฒ˜์Œ ์žฌ์‹œ์ž‘ ์‹คํŒจํ›„ 10์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์‹œ๋„ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์€ 20์ดˆ, 40์ดˆ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์† ์žฌ์‹œ์ž‘ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋Š˜๋ฆฐ๋‹ค.

๐Ÿ”Ž activeDeadlineSeconds ์˜ต์…˜: ํŒŒ๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค. ํŒŒ๋“œ๊ฐ€ ์ด๋ณด๋‹ค ์˜ค๋ž˜ ์‹คํ–‰๋˜๋ฉด ์‹œ์Šคํ…œ์€ ํŒŒ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žก์„ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค ์ƒ์„ฑ

1
$ kubectl apply -f job.yaml

๋ฆฌ์†Œ์Šค ํ™•์ธ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ kubectl describe jobs/pi
Name:           pi
Namespace:      default
Selector:       controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
Labels:         controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
                job-name=pi
Annotations:    kubectl.kubernetes.io/last-applied-configuration:
                  {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":4,"template":...
Parallelism:    1
Completions:    1
Start Time:     Mon, 02 Dec 2019 15:20:11 +0200
Completed At:   Mon, 02 Dec 2019 15:21:16 +0200
Duration:       65s
Pods Statuses:  0 Running / 1 Succeeded / 0 Failed
Pod Template:
  Labels:  controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
           job-name=pi
  Containers:
   pi:
    Image:      perl
    Port:       <none>
    Host Port:  <none>
    Command:
      perl
      -Mbignum=bpi
      -wle
      print bpi(2000)
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  14m   job-controller  Created pod: pi-5rwd7

์œ„์™€ ๊ฐ™์ด Start Time, Completed At, Duration, Pod Statuses ํ•ญ๋ชฉ์„ ๋ณด๋ฉด 65์ดˆ ๋™์•ˆ ํŒŒ๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
# ์›์ฃผ์šœ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ํ™•์ธ
$ kubectl logs pi-5rwd7

3.14159265358979323846264338327950288419716939937510582097494459230781640628620...

๋‹ค์ˆ˜์˜ ํŒŒ๋“œ ์‹คํ–‰

์žก์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํŒŒ๋“œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋ณ‘๋ ฌ ๋˜๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์žก ์ŠคํŽ™์˜ completions์™€ parallelism ์†์„ฑ์„ ์„ค์ •ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

.spec.completions

์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋‹ค.

1
2
3
4
5
6
7
8
9
apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  completions: 5 # ์‹คํ–‰ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ํŒŒ๋“œ ์ˆ˜ ์„ค์ •
  template:
    spec:
      ...

์ด ์žก์€ ๋‹ค์„ฏ ๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ•˜๋‚˜์˜ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‘ ๋ฒˆ์งธ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค์„ฏ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•œ๋‹ค. ํŒŒ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์žก์ด ์ƒˆ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์œผ๋กœ ๋ณด๋ฉด ๋‹ค์„ฏ ๊ฐœ ์ด์ƒ์˜ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

.spec.parallelism

๋™์‹œ์— ๋ช‡ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด๋„ ๊ดœ์ฐฎ์€์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๊ณ  0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์žก์„ ์ •์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  completions: 5
  parallelism: 2 # ์žก ๋ณ‘๋ ฌ์„ฑ ๊ด€๋ฆฌ
  template:
    spec:
      ...

์ด ์žก์€ 2๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ 5๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋๋‚˜๋ฉด ์žก์€ ๋‹ค์„ฏ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์žก ์ข…๋ฃŒ

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

.spec.activeDeadlineSeconds ํ•„๋“œ์— ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๋ฉด, ์ง€์ •๋œ ์‹œ๊ฐ„์— ํ•ด๋‹น ์žก ์‹คํ–‰์„ ๊ฐ•์ œ๋กœ ๋๋‚ด๋ฉด์„œ ๋ชจ๋“  ํŒŒ๋“œ ์‹คํ–‰๋„ ์ข…๋ฃŒํ•œ๋‹ค.

๐Ÿงฉ ์žก ์‚ญ์ œ

์žก์„ ์‚ญ์ œํ•˜๋ฉด ๊ด€๋ จ๋œ ํŒŒ๋“œ๋“ค๋„ ๊ฐ™์ด ์‚ญ์ œ๋œ๋‹ค.

1
$ kubectl delete job ์žก์ด๋ฆ„

์žก ํŒจํ„ด

์žก์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

์ž‘์—… ๊ฐœ์ˆ˜๋งŒํผ์˜ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŒŒ๋“œ ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋„ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํŒŒ๋“œ ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.

CronJob

cron_job

์žก ๋ฆฌ์†Œ์Šค๋Š” ์ƒ์„ฑ๋  ๋•Œ ์ฆ‰์‹œ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๋ฐฐ์น˜ ์ž‘์—…์€ ์•ž์œผ๋กœ ํŠน์ • ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ง€์ •๋œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ ์‹คํ–‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค ๊ฐ™์€ OS์—์„œ ์ด๋Ÿฐ ์ž‘์—…์€ cron ์ž‘์—…์œผ๋กœ ์•Œ๋ ค์ ธ์žˆ๋‹ค. k8s๋„ ์ด์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์ง€์›ํ•œ๋‹ค.

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

์„ค์ •๋œ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ํฌ๋ก ์žก์— ๊ตฌ์„ฑ๋œ ์žก ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ ์žก ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์žก ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ๋“œ ๋ณต์ œ๋ณธ์ด ์ƒ์„ฑ๋˜๊ณ  ์žก์˜ ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ ์‹œ์ž‘๋œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ CronJob์€ Job๊ณผ์˜ ์„ค์ •๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ๋‹ค๋ฅธ ์ ์€ ์Šค์ผ€์ค„๋กœ ์ฃผ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋ฆฌ์†Œ์Šค ์ •์˜

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: batch/v1 # API ๊ทธ๋ฃน์€ batch์ด๋‹ค.
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"   # ๋งค 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

๋งค 1๋ถ„๋งˆ๋‹ค ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ hello ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํฌ๋ก  ์Šค์ผ€์ค„ ๋ฌธ๋ฒ•

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๋ถ„ (0 - 59)
# โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์‹œ (0 - 23)
# โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์ผ (1 - 31)
# โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์›” (1 - 12)
# โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์š”์ผ (0 - 6) (์ผ์š”์ผ๋ถ€ํ„ฐ ํ† ์š”์ผ๊นŒ์ง€;
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚                                   ํŠน์ • ์‹œ์Šคํ…œ์—์„œ๋Š” 7๋„ ์ผ์š”์ผ)
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚                                   ๋˜๋Š” sun, mon, tue, wed, thu, fri, sat
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
# * * * * *

> "2์‹œ๊ฐ„๋งˆ๋‹ค"๋ผ๊ณ  ์ง€์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ๊ฐ„๋‹จํžˆ */2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์Šค์ผ€์ค„ ๋ฌธ๋ฒ•

์–ด๋–ค ์ด์œ ๋กœ๋“  ํ•ด๋‹น ์Šค์ผ€์ค„ ์‹œ๊ฐ„์— ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—…์ด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์‹คํŒจ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

๋ฆฌ์†Œ์Šค ํ™•์ธ

๐Ÿงฉ ํฌ๋ก  ์žก์˜ ์Šค์ผ€์ค„ ์„ค์ • ํ™•์ธ

1
2
3
4
$ kubectl get cronjobs

NAME       SCHEDULE   		SUSPEND   ACTIVE   LAST SCHEDULE 	AGE
hello      */1 * * * *   	false     1	       11s       		15s
  • SUSPEND : ํฌ๋ก ์žก์ด ์ •์ง€๋˜์—ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ACTIVE : ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์žก์ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • LAST SCHEDULE : ๋งˆ์ง€๋ง‰์œผ๋กœ ์žก์„ ์‹คํ–‰ํ•œ ํ›„ ์–ด๋Š์ •๋„ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๐Ÿงฉ ํฌ๋ก  ์žก์ด ์‹คํ–‰ํ•œ ์žก ํ™•์ธ

1
2
3
4
5
$ kubectl get jobs
NAME               COMPLETIONS   DURATION   AGE
hello-4111706356   0/1                      0s
hello-4111706356   0/1           0s         0s
hello-4111706356   1/1           5s         5s

ํฌ๋ก ์žก ์ด๋ฆ„์ด hello ๋’ค์— ์ˆซ์ž๊ฐ€ ๋ถ™์€ ์žก๋“ค์ด ์‹คํ–‰๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • COMPLETIONS : ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•œ ํšŸ์ˆ˜/์ด ์ž‘์—… ํšŸ์ˆ˜
  • DURATION : ์ž‘์—…์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„

๋ฆฌ์†Œ์Šค ์‚ญ์ œ

1
$ kubectl delete cronjobs ํฌ๋ก ์žก์ด๋ฆ„

ํฌ๋ก ์žก์ด ์ƒ์„ฑํ–ˆ๋˜ ์žก๊ณผ ํŒŒ๋“œ๊นŒ์ง€ ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œ๋œ๋‹ค.

์žก(Job)์€ 1ํšŒ์„ฑ ์ž‘์—…์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ํฌ๋ก ์žก(CronJob)์€ ์ฃผ๊ธฐ์ ์ธ ๋ฐฐ์น˜ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

References