๐Ÿค  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค job, cronjob

๊น€์„ฑ์ธยท2023๋…„ 10์›” 20์ผ
0

[DevOps] ๐ŸณDocker & Kubernetes

๋ชฉ๋ก ๋ณด๊ธฐ
42/62

ํŒŒ๋“œ ์˜ˆ์•ฝ ์‹คํ–‰
https://kubernetes.io/ko/docs/concepts/workloads/controllers/job/

Job

  • ํŠน์ • ๊ฐœ์ˆ˜์˜ ํŒŒ๋“œ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰/์ข…๋ฃŒํ•จ์„ ๋ณด์žฅํ•จ.
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ”„๋กœ์„ธ์Šค์ฒ˜๋Ÿผ ์‹คํ–‰ํ•จ
  • ์—ฌ๋Ÿฌ ํŒŒ๋“œ๋ฅผ ๋ณ‘๋ ฌ์œผ๋กœ๋„ ์‹คํ–‰๊ฐ€๋Šฅ
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

spec.completions : ๋ชฉํ‘œ ์™„๋ฃŒ ํŒŒ๋“œ ๊ฐœ์ˆ˜
spec.parallelism : ๋™์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ ํŒŒ๋“œ ๊ฐœ์ˆ˜

  • ์žก apiVersion: batch/v1
  • restartPolicy: Never(ํŒŒ๋“œ๊ฐ€ ์„ฑ๊ณต์œผ๋กœ ๋๋‚˜๊ฒŒ ํ•จ, ์ƒˆ ํŒŒ๋“œ ์ƒ์„ฑ), OnFailure(ํŒŒ๋“œ์•ˆ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ ๋ฌ๊ฑฐ๋‚˜, ์ •์ƒ ์ข…๋ฃŒ ๋˜์ง€ ์•Š์•˜์„๋•Œ ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘)
  • backOffLimit: ์žก ์‹คํ–‰ ์‹คํŒจ์‹œ ์ž๋™์œผ๋กœ ์ตœ๋Œ€ ๋ช‡๋ฒˆ ์žฌ์‹œ์ž‘ํ• ์ง€ ์„ค์ • (default=6)

๋ณ‘๋ ฌ์„ฑ

  • completions๋ฅผ ํ†ตํ•ด ์ •์ƒ์™„๋ฃŒ ์žก์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ฐœ์ˆ˜๊ฐ€ ๋‚จ์•„์žˆ๋Š” ์™„๋ฃŒ ๋Œ€๊ธฐ ์žก์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํฌ๋ฉด ๋ณ‘๋ ฌ์‹คํ–‰์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด๋“ฌ
    • ์™„๋ฃŒ ๋ชฉํ‘œ ์žก 10๊ฐœ, ์™„๋ฃŒ๋œ ์žก 9๊ฐœ, ๋ณ‘๋ ฌ์‹คํ–‰ ์žก 3 ์ด๋ผ๋ฉด -> ํŒŒ๋“œ๋Š” 1๊ฐœ๋งŒ ์‹คํ–‰๋จ
  • ์›Œํฌ ํ์šฉ ์žก(completions๋ฏธ ์„ค์ •)์—์„œ๋Š” ํŒŒ๋“œํ•˜๋‚˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด ํŒŒ๋“œ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ.
  • ์žก ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜์‘ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๊ถŒํ•œ ๋ถ€์กฑ๋“ฑ์œผ๋กœ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ• ๋•Œ๋„ ์žˆ์Œ
  • ์žก์—์„œ ์‹คํ–‰์‹œํ‚จ ํŒŒ๋“œ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์ด ์‹คํŒจํ–ˆ์œผ๋ฉด ์žก ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ƒˆ๋กœ์šด ํŒŒ๋“œ ์ƒ์„ฑ์„ ์ œํ•œํ•จ.
  • ํŒŒ๋“œ๊ฐ€ gracefulํ•˜๊ฒŒ ์ข…๋ฃŒ๋จ

Job ์ข…๋ฅ˜

1. ๋น„-๋ณ‘๋ ฌ(Non-parallel), ๋‹จ์ผ ์žก:

  • ์ผ๋ฐ˜์ ์œผ๋กœ, ํŒŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š์€ ํ•œ, ํ•˜๋‚˜์˜ ํŒŒ๋“œ๋งŒ ์‹œ์ž‘๋œ๋‹ค.
  • ํŒŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ์žก์ด ์™„๋ฃŒ๋œ๋‹ค.

2. ๊ณ ์ •์ (fixed)์ธ ์™„๋ฃŒ ํšŸ์ˆ˜ ๋ฅผ ๊ฐ€์ง„ ๋ณ‘๋ ฌ ์žก:

  • .spec.completions ์— 0์ด ์•„๋‹Œ ์–‘์ˆ˜ ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค.
  • ์žก์€ ์ „์ฒด ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, .spec.completions ์„ฑ๊ณตํ•œ ํŒŒ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ์™„๋ฃŒ๋œ๋‹ค.
  • .spec.completionMode="Indexed" ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ฐ ํŒŒ๋“œ๋Š” 0์—์„œ .spec.completions-1 ๋ฒ”์œ„ ๋‚ด์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

3. ์ž‘์—… ํ(queue) ๊ฐ€ ์žˆ๋Š” ๋ณ‘๋ ฌ ์žก:

  • .spec.completions ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , .spec.parallelism ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.
  • ํŒŒ๋“œ๋Š” ๊ฐ์ž ๋˜๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค ๊ฐ„์— ์กฐ์ •์„ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ์ž‘์—…์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ๋“œ๋Š” ์ž‘์—… ํ์—์„œ ์ตœ๋Œ€ N ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ผ๊ด„๋กœ ๊ฐ€์ ธ์˜ฌ(fetch) ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ ํŒŒ๋“œ๋Š” ๋ชจ๋“  ํ”ผ์–ด๋“ค์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ „์ฒด ์žก์ด ์™„๋ฃŒ๋˜๊ฒŒ ํ•œ๋‹ค.
  • ์žก์˜ ๋ชจ๋“  ํŒŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด, ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋Š” ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ณ , ๋ชจ๋“  ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์žก์€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ๋‹ค.
  • ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋œ ํŒŒ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์ƒ๊ธด ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ํŒŒ๋“œ๋“ค์€ ํ•ด๋‹น ์ž‘์—…์„ ์ง€์†ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ์–ด๋– ํ•œ ์ถœ๋ ฅ๋„ ์ž‘์„ฑํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ํŒŒ๋“œ๋“ค์€ ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋Š” ๊ณผ์ •์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

Job ์‚ญ์ œ ์‹œ, ์ƒ์„ฑ๋œ ํŒŒ๋“œ๋„ ๋ชจ๋‘ ์‚ญ์ œ๋จ

Cron Job

์žก์„ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ์ƒ์„ฑ

  • ์ง€์ •ํ•œ ์‹œ๊ฐ„์— ํ•œ๋ฒˆ๋งŒ ์žก์„ ์‹คํ–‰
  • ์ง€์ •ํ•œ ์‹œ๊ฐ„๋™์•ˆ ์ฃผ๊ธฐ์ ์œผ๋กœ ์žก์„ ๋ฐ˜๋ณต ์‹คํ–‰
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 600
  concurrencyPolicy: Forbid
  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
  • .spec.startingDeadlineSeconds : ์ง€์ •๋œ ์‹œ๊ฐ„์— ํฌ๋ก ์žก์ด ์‹คํ–‰๋˜์ง€ ๋ชปํ–ˆ์„๋•Œ, ์„ค์ •ํ•œ ์‹œ๊ฐ„๊นŒ์ง€ ์ง€๋‚˜๋ฉด ํฌ๋ก ์žก์ด ์‹คํ–‰๋˜์ง€ ์•Š๊ฒŒํ•จ
  • .spec.concurrencyPolicy : ํฌ๋ก ์žก์ด ์‹คํ–‰ํ•˜๋Š” ์žก์˜ ๋™์‹œ์„ฑ ๊ด€๋ฆฌ
    • Allow: ๊ธฐ๋ณธ๊ฐ’, ํฌ๋ก ์žก์ด ์—ฌ๋Ÿฌ๊ฐœ ์žก์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋„๋ก ํ•จ
    • Forbid: ์žก์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•จ.
      • ์ด์ „ ์‹คํ–‰ ์žก์ด ์ •์ƒ์ข…๋ฃŒ ์•ˆ๋˜๊ณ  ์‹คํ–‰์ค‘์ผ๋•Œ, ์ƒˆ๋กœ์šด ์žก์„ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ์‹œ๊ฐ„์ด ๋œ๋‹ค๋ฉด,
      • ํฌ๋ก ์žก์€ ํ•ด๋‹น์‹œ๊ฐ„์— ์ƒˆ๋กœ์šด ์žก์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ง€์ •๋œ ์‹œ๊ฐ„์— ์žก์„ ์‹คํ–‰์‹œํ‚ด.
    • Replace: ์ด์ „ ์‹คํ–‰ ์žก์ด ์‹คํ–‰์ค‘์ธ ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ์žก ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋˜๋ฉด, ์ƒˆ๋กœ์šด ์žก์œผ๋กœ ๋Œ€์ฒดํ•จ.
# ์Šค์ผ€์ค„ ๋ฌธ๋ฒ•
# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๋ถ„ (0 - 59)
# โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์‹œ (0 - 23)
# โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์ผ (1 - 31)
# โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์›” (1 - 12)
# โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์š”์ผ (0 - 6) (์ผ์š”์ผ๋ถ€ํ„ฐ ํ† ์š”์ผ๊นŒ์ง€;
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚                                   ํŠน์ • ์‹œ์Šคํ…œ์—์„œ๋Š” 7๋„ ์ผ์š”์ผ)
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚                                   ๋˜๋Š” sun, mon, tue, wed, thu, fri, sat
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
# * * * * *

0๊ฐœ์˜ ๋Œ“๊ธ€