投稿

EKS での cronjob 実行エラーによってワーカーノードの自動拡張が失敗するのを防ぐ方法

EKS での cronjob 実行エラーによってワーカーノードの自動拡張が失敗するのを防ぐ方法. Practical notes and implementation steps.

最近、EKSにサービスを提供しているとき

何かが起こりました。

cronjob の実行の多くが失敗するからです。

Worker Node を新しいデプロイメントを作成せずに自動的にスケーリングするようにします。

この問題の可能性には複数のレベルがあります。

1.ワーカーノード自動拡張戦略の解決 2.Cronjob の実行に失敗すると、ポッドが大量に再起動し、API Server と kube-scheduler のパフォーマンスに影響が及びます。

以下は問題を書くための cronjob です。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
apiVersion: batch/v1
kind: CronJob
metadata:
  name: database-backup
  namespace: operating
spec:
  schedule: "*/10 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: database-backup-sa
          containers:
            - name: database-backup
              image: postgres:17-alpine
              imagePullPolicy: IfNotPresent
              command:
              - /bin/sh
              - -c
              - |
                export HOST=$(cat /mnt/secrets-store/db-host)
                export PORT=$(cat /mnt/secrets-store/db-port)
                export USERNAME=$(cat /mnt/secrets-store/db-user)
                export PASSWORD=$(cat /mnt/secrets-store/db-password)
                DATABASE="dummy-biz"
                apk add --no-cache aws-cli
                BACKUP_FILE="/tmp/database-backup_$(date +%Y%m%d_%H%M%S).sql"
                PGPASSWORD=$PASSWORD pg_dump -h $HOST -p $PORT -U $USERNAME -d $DATABASE -f $BACKUP_FILE
                aws s3 cp $BACKUP_FILE s3://database-backup/staging/
              resources:
                limits:
                  cpu: "100m"
                  memory: "512Mi"
                requests:
                  cpu: "50m"
                  memory: "64Mi"
              volumeMounts:
              - name: secrets-store
                mountPath: /mnt/secrets-store
                readOnly: true
          volumes:
          - name: secrets-store
            csi:
              driver: secrets-store.csi.k8s.io
              readOnly: true
              volumeAttributes:
                secretProviderClass: database-secret
          restartPolicy: OnFailure

10 秒未満でデータベースをバックアップできます

プログラムが実行できるかどうか

10 秒でエラーポッドを蓄積する

EKS Cluster が間違ったポッドによって 1 時間以内にハングアップすることが予想されます

ワーカーノードの自動拡張戦略を解決する方法があるかもしれません

しかし無制限成長ワーカーノード

また、Cronjob の設定が誤る原因にもなります。

全体的なメンテナンスコストが大幅に増加する

上記のエラー設定により、2 つの設定補正が追加されるはずです。

1.同時実行ポリシー設定の追加 間違ったポッドが蓄積され続ける パラレルも可能です。 常にエラーが蓄積されるポッド

1
2
spec:
  concurrencyPolicy: Forbid

2。リトライポリシー設定の強化 プログラムに問題があった場合 一度間違えると、間違え続けるだけです。 プログラムが修正されるまで ここで、再試行回数とタイムアウト設定を追加する必要があります。

1
2
3
spec:
  backoffLimit: 2 # 失敗したら二度あきらめて、そこでずっと試してはいけない
  activeDeadlineSeconds: 600 # 成功にかかわらず 10 分以上強制終了する

3。成功履歴とエラー履歴の設定数を増やす この設定は必須ではありません。 ただし、最終的にログはログサーバーに転送されます。 そのため、サーバーには新しいレコードをいくつか保存するだけで済みます。

1
2
3
spec:
  failedJobsHistoryLimit: 1 # 失敗したジョブ履歴の上限
  successfulJobsHistoryLimit: 3 # ジョブ成功履歴の上限

すべてプラスとその次はおおまかに次のようになります

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
apiVersion: batch/v1
kind: CronJob
metadata:
  name: database-backup
  namespace: operating
spec:
  schedule: "*/10 * * * *"
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      activeDeadlineSeconds: 600 # 成功に関わらず 10 分以上強制終了する
      backoffLimit: 2 # 失敗したら二度あきらめて、そこでずっと試してはいけない
      template:
        spec:
          serviceAccountName: database-backup-sa
          containers:
            - name: database-backup
              image: postgres:17-alpine
              imagePullPolicy: IfNotPresent
              command:
              - /bin/sh
              - -c
              - |
                export HOST=$(cat /mnt/secrets-store/db-host)
                export PORT=$(cat /mnt/secrets-store/db-port)
                export USERNAME=$(cat /mnt/secrets-store/db-user)
                export PASSWORD=$(cat /mnt/secrets-store/db-password)
                DATABASE="dummy-biz"
                apk add --no-cache aws-cli
                BACKUP_FILE="/tmp/database-backup_$(date +%Y%m%d_%H%M%S).sql"
                PGPASSWORD=$PASSWORD pg_dump -h $HOST -p $PORT -U $USERNAME -d $DATABASE -f $BACKUP_FILE
                aws s3 cp $BACKUP_FILE s3://database-backup/staging/
              resources:
                limits:
                  cpu: "100m"
                  memory: "512Mi"
                requests:
                  cpu: "50m"
                  memory: "64Mi"
              volumeMounts:
              - name: secrets-store
                mountPath: /mnt/secrets-store
                readOnly: true
          volumes:
          - name: secrets-store
            csi:
              driver: secrets-store.csi.k8s.io
              readOnly: true
              volumeAttributes:
                secretProviderClass: database-secret
          restartPolicy: OnFailure

コンテナの実行に apk add--no-cache aws-cli を追加するのは良い考えではありませんが、 少なくとも 1 人は InitContainer ブロックを入れたいと思っています。 準備段階で、必要なパッケージを梱包し、 もちろん、一番いい方法は自分で容器を詰めることです。

この例と改善の方向性はベストプラクティスではありません

ソースはまだエラーのあるプログラムの修正を望んでいます。

改善の方向性だけではない。

しかし、今回はそこが議論のテーマではありません。

今後、次の方法で別の説明を書く予定です。

  • 構文とスキーマの検証 bash kubeconform -summary -strict my-cronjob.yaml `
  • キューブスコアやキューブリンターなどの SAST ツールで確認する *「ドライラン」の実行をシミュレート
    1
    
    kubectl apply -f my-cronjob.yaml --dry-run=server
    
この投稿は投稿者によって CC BY 4.0 の下でライセンスされています。

トレンドのタグ