Chuyển đến nội dung chính

レッスン2: Jobs, CronJobs & Resource Management

Kubernetes Jobs(completions、parallelism、backoffLimit)、CronJob schedule構文、 concurrencyPolicy。Resource requests/limits、QoSクラスの基礎とLimitRange/ResourceQuota。

Jobs、CronJobs & Resource Management — completions、parallelism、QoSクラス

1. Jobs

Jobは完了まで実行して終了するタスクを作成します(Deploymentの常駐型とは異なる)。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-calculator
spec:
  completions: 5       # 合計5回成功する必要あり
  parallelism: 2       # 同時に2つのPodを実行
  backoffLimit: 4      # 最大4回リトライして失敗
  activeDeadlineSeconds: 300  # 最大300秒で全体タイムアウト
  template:
    spec:
      restartPolicy: Never  # JobではNeverまたはOnFailure
      containers:
      - name: pi
        image: perl:5.34
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
フィールドデフォルト意味
completions1成功完了が必要な回数
parallelism1同時実行Podの最大数
backoffLimit6失敗リトライの最大回数
activeDeadlineSecondsなしJob全体の最大実行時間

試験のポイント: JobのrestartPolicyはNeverまたはOnFailureのみ。Alwaysは使えません(Jobは完了して終了するため)。backoffLimitに達すると、JobはFailed状態になりPodの作成を停止します。

2. CronJobs

apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-backup
spec:
  schedule: "0 2 * * *"   # 毎日2:00 AM (cron構文)
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  startingDeadlineSeconds: 200
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: backup
            image: backup-tool:latest
            command: ["/bin/sh", "-c", "backup.sh"]
concurrencyPolicy動作
Allow(デフォルト)前のJobが終わっていなくても新しいJobを作成
Forbid前のJobが実行中なら新しいJobをスキップ
Replace前のJobをキャンセルして新しいJobを開始
Cron構文:
  ┌───────────── 分 (0 - 59)
  │ ┌─────────── 時 (0 - 23)
  │ │ ┌───────── 日 (1 - 31)
  │ │ │ ┌─────── 月 (1 - 12)
  │ │ │ │ ┌───── 曜日 (0 - 6, 0=日曜)
  │ │ │ │ │
  * * * * *

例:
  "*/5 * * * *"   = 5分ごと
  "0 */2 * * *"   = 2時間ごと
  "0 9 * * 1-5"   = 平日の9:00 AM

3. Resource Requests & Limits(基礎)

resources:
  requests:
    cpu: "250m"      # スケジューリング用の最小CPU保証
    memory: "128Mi"  # 最小メモリ保証
  limits:
    cpu: "500m"      # 最大CPU(超過するとスロットリング)
    memory: "256Mi"  # 最大メモリ(超過するとOOMKilled)

4. QoSクラス(概要)

QoSクラス条件退避優先度
GuaranteedCPUとメモリ両方でrequests == limits(全コンテナ)最低(最後に退避)
Burstable少なくとも1つのコンテナにrequest/limitあり、Guaranteedの条件を満たさない中間
BestEffortrequest/limitが一切なし最高(最初に退避)

5. LimitRange & ResourceQuota

リソーススコープ用途
LimitRange個々のPod/Containerデフォルトのrequests/limitsを設定、最大/最小を制限
ResourceQuotaNamespace全体合計CPU/メモリ/Podの上限を設定
# ResourceQuotaの例
apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "20"

6. チートシート

タスクコマンド
Jobを素早く作成kubectl create job myjob --image=busybox -- echo hi
CronJobを作成kubectl create cronjob mycron --image=busybox --schedule="*/5 * * * *" -- echo hi
Jobの状態確認kubectl get jobs
QoSクラス確認kubectl describe pod <name> | grep -i qos
リソース使用量kubectl top pods

7. 練習問題

Q1: completions: 6、parallelism: 2のJobがあります。Podは何回作成されますか?

  • A) 2
  • B) 6 ✓
  • C) 8
  • D) 12

解説: completionsは成功完了が必要なPodの総数です。parallelismは同時に実行するPodの数です。合計6つのPodが作成されますが、同時に実行されるのは最大2つです。全体の実行時間は短縮されますが、Podの総数は変わりません。

Q2: concurrencyPolicy: ForbidのCronJobで、スケジュール時間に前のJobがまだ実行中の場合、何が起こりますか?

  • A) 前のJobをキャンセルして新しいJobを開始する
  • B) 前のJobと並行して新しいJobを実行する
  • C) 新しいJobの実行をスキップする ✓
  • D) 前のJobをキューに入れる

解説: Forbidは前のJobが実行中の場合、新しい実行を完全にスキップします。これによりバックアップジョブの重複実行などを防止できます。Allowの場合は並行実行を許可し、Replaceの場合は前のJobをキャンセルします。

Q3: コンテナのresourcesにrequests: cpu=500m, memory=256Mi、limits: cpu=500m, memory=256Miが設定されています。このPodのQoSクラスは何ですか?

  • A) BestEffort
  • B) Burstable
  • C) Guaranteed ✓
  • D) Critical

解説: Guaranteedの条件は、すべてのコンテナでCPUとメモリ両方のrequestsがlimitsと等しいことです。ここではcpu requests(500m) == cpu limits(500m)、memory requests(256Mi) == memory limits(256Mi)なので、QoSクラスはGuaranteedです。