J'ai un cronjob k8s qui se compose d'un conteneur init et d'un conteneur pod. Si le conteneur init échoue, le pod du conteneur principal ne démarre jamais et reste indéfiniment dans "PodInitializing".
Mon intention est que le travail échoue si le conteneur init échoue.
---
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
un kubectl sur le pod qui est bloqué se traduit par:
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
Je pense que vous pourriez manquer que c'est le comportement attendu des conteneurs init. La règle est qu'en cas d'échec d'initContainers, un pod ne redémarrera pas si restartPolicy est défini sur Jamais, sinon Kubernetes continuera de le redémarrer jusqu'à ce qu'il réussisse.
Aussi:
Si le conteneur init échoue, le pod du conteneur principal ne démarre jamais et reste indéfiniment dans "PodInitializing".
Selon documentation:
Un pod ne peut pas être prêt tant que tous les conteneurs Init n'ont pas réussi. Les ports d'un conteneur Init ne sont pas agrégés sous un service. Un pod en cours d'initialisation est dans l'état En attente mais doit avoir une condition Initialisation définie sur true.
* Je peux voir que vous avez essayé de changer ce comportement, mais je ne sais pas si vous pouvez le faire avec CronJob, j'ai vu des exemples avec Jobs. Mais je ne fais que théoriser, et si ce message ne vous a pas aidé à résoudre votre problème, je peux essayer de le recréer dans un environnement de laboratoire.
Pour essayer de comprendre cela, j'exécuterais la commande:
kubectl get pods
- Ajoutez le paramètre d'espace de noms si nécessaire.
Copiez ensuite le nom du module et exécutez:
kubectl describe pod {POD_NAME}
Cela devrait vous donner des informations sur la raison pour laquelle il est bloqué dans l'état d'initialisation.
Puisque vous avez déjà compris que les conteneurs init sont censés fonctionner jusqu'à la fin, avec succès. Si vous ne pouvez pas vous débarrasser des conteneurs init, ce que je ferais dans ce cas est de m'assurer que le conteneur init se termine avec succès tout le temps. Le résultat du conteneur init peut être écrit dans un volume emptydir, quelque chose comme un fichier d'état, partagé par votre conteneur init et votre conteneur de travail. Je déléguerais au conteneur de travail la responsabilité de décider quoi faire au cas où le conteneur d'init se terminerait en vain.