web-dev-qa-db-ja.com

ポッドが無期限にPodInitializing状態のままになる

私は、initコンテナーと1つのポッドコンテナーで構成されるk8s cronjobを持っています。 initコンテナが失敗した場合、メインコンテナのポッドは開始されず、無期限に「PodInitializing」のままになります。

私の意図は、initコンテナーが失敗した場合にジョブが失敗するようにすることです。

---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: job-name
  namespace: default
  labels:
    run: job-name
spec:
  schedule: "15 23 * * *"
  startingDeadlineSeconds: 60
  concurrencyPolicy: "Forbid"
  successfulJobsHistoryLimit: 30
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
      # only try twice
      backoffLimit: 2
      activeDeadlineSeconds: 60
      template:
        spec:
          initContainers:
          - name: init-name
            image: init-image:1.0
          restartPolicy: Never
          containers:
          - name: some-name
            image: someimage:1.0
          restartPolicy: Never

停止しているポッドのkubectlの結果:

Name:               job-name-1542237120-rgvzl
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               my-node-98afffbf-0psc/10.0.0.0
Start Time:         Wed, 14 Nov 2018 23:12:16 +0000
Labels:             controller-uid=ID
                    job-name=job-name-1542237120
Annotations:        kubernetes.io/limit-ranger:
                      LimitRanger plugin set: cpu request for container elasticsearch-metrics; cpu request for init container elasticsearch-repo-setup; cpu requ...
Status:             Failed
IP:                 10.0.0.0
Controlled By:      Job/job-1542237120
Init Containers:
init-container-name:
    Container ID:  docker://ID
    Image:         init-image:1.0
    Image ID:      init-imageID
    Port:          <none>
    Host Port:     <none>
    State:          Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Wed, 14 Nov 2018 23:12:21 +0000
      Finished:     Wed, 14 Nov 2018 23:12:32 +0000
    Ready:          False
    Restart Count:  0
    Requests:
      cpu:        100m
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wwl5n (ro)
Containers:
  some-name:
    Container ID:  
    Image:         someimage:1.0
    Image ID:      
    Port:          <none>
    Host Port:     <none>
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Requests:
      cpu:        100m
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wwl5n (ro)
Conditions:
  Type              Status
  Initialized       False 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True
3
Anderson

それがinitコンテナの予想される動作であることは見逃すかもしれないと思います。ルールは、initContainersが失敗した場合、restartPolicyがNeverに設定されていると、ポッドは再起動しません。それ以外の場合、Kubernetesは、成功するまで再起動し続けます。

また:

Initコンテナが失敗した場合、メインコンテナのポッドは開始されず、無期限に「PodInitializing」のままになります。

documentation: によると

すべての初期化コンテナが成功するまで、ポッドを準備することはできません。 Init Containerのポートはサービスの下で集約されません。初期化中のポッドはPending状態ですが、Initializing条件をtrueに設定する必要があります。

*この動作を変更しようとしたのはわかりますが、CronJobを使用して変更できるかどうかはわかりません。ジョブの例を確認しました。しかし、私は理論化しているだけであり、この投稿が問題の解決に役立たなかった場合は、ラボ環境で再現することを試みることができます。

3
aurelius

これを試して理解するには、次のコマンドを実行します。

kubectl get pods-必要に応じて名前空間パラメーターを追加します。

次に、ポッド名をコピーして実行します。

kubectl describe pod {POD_NAME}

これにより、初期化状態でスタックしている理由がわかります。

2
ajtrichards

Initcontainersは正常に実行され、正常に実行されることをすでに理解しているためです。 initコンテナーを取り除くことができない場合、私がこの場合に行うことは、initコンテナーが常に正常に終了することを確認することです。 initコンテナーの結果は、initdirコンテナーと作業コンテナーの両方で共有される、ステータスファイルのようなemptydirボリュームに書き込むことができます。 initコンテナーが正常に終了しなかった場合にどうするかを決定する責任は、ワークコンテナーに委任します。

1
Bal Chua