私は、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
それがinitコンテナの予想される動作であることは見逃すかもしれないと思います。ルールは、initContainersが失敗した場合、restartPolicyがNeverに設定されていると、ポッドは再起動しません。それ以外の場合、Kubernetesは、成功するまで再起動し続けます。
また:
Initコンテナが失敗した場合、メインコンテナのポッドは開始されず、無期限に「PodInitializing」のままになります。
documentation: によると
すべての初期化コンテナが成功するまで、ポッドを準備することはできません。 Init Containerのポートはサービスの下で集約されません。初期化中のポッドはPending状態ですが、Initializing条件をtrueに設定する必要があります。
*この動作を変更しようとしたのはわかりますが、CronJobを使用して変更できるかどうかはわかりません。ジョブの例を確認しました。しかし、私は理論化しているだけであり、この投稿が問題の解決に役立たなかった場合は、ラボ環境で再現することを試みることができます。
これを試して理解するには、次のコマンドを実行します。
kubectl get pods
-必要に応じて名前空間パラメーターを追加します。
次に、ポッド名をコピーして実行します。
kubectl describe pod {POD_NAME}
これにより、初期化状態でスタックしている理由がわかります。
Initcontainersは正常に実行され、正常に実行されることをすでに理解しているためです。 initコンテナーを取り除くことができない場合、私がこの場合に行うことは、initコンテナーが常に正常に終了することを確認することです。 initコンテナーの結果は、initdirコンテナーと作業コンテナーの両方で共有される、ステータスファイルのようなemptydirボリュームに書き込むことができます。 initコンテナーが正常に終了しなかった場合にどうするかを決定する責任は、ワークコンテナーに委任します。