C'est ce que je continue de recevoir:
[root@centos-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-server-h6nw8 1/1 Running 0 1h
nfs-web-07rxz 0/1 CrashLoopBackOff 8 16m
nfs-web-fdr9h 0/1 CrashLoopBackOff 8 16m
Vous trouverez ci-dessous le résultat de "Des gousses" Kubectl Des gousses
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
16m 16m 1 {default-scheduler } Normal Scheduled Successfully assigned nfs-web-fdr9h to centos-minion-2
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Created Created container with docker id 495fcbb06836
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Started Started container with docker id 495fcbb06836
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Started Started container with docker id d56f34ae4e8f
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Created Created container with docker id d56f34ae4e8f
16m 16m 2 {kubelet centos-minion-2} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "web" with CrashLoopBackOff: "Back-off 10s restarting failed container=web pod=nfs-web-fdr9h_default(461c937d-d870-11e6-98de-005056040cc2)"
J'ai deux pods: nfs-web-07rxz, nfs-web-fdr9h, mais si je fais "kubectl logs nfs-web-07rxz" ou avec l'option "-p", je ne vois aucun journal dans les deux pods.
[root@centos-master ~]# kubectl logs nfs-web-07rxz -p
[root@centos-master ~]# kubectl logs nfs-web-07rxz
Voici mon fichier yaml replicationController: fichier yaml réplicationController
apiVersion: v1 kind: ReplicationController metadata: name: nfs-web spec: replicas: 2 selector:
role: web-frontend template:
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: eso-cmbu-docker.artifactory.eng.vmware.com/demo-container:demo-version3.0
ports:
- name: web
containerPort: 80
securityContext:
privileged: true
Mon image Docker a été créée à partir de ce simple fichier docker:
FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y nfs-common
J'exécute mon cluster kubernetes sur CentOs-1611, version kube:
[root@centos-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/AMD64"}
Server Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/AMD64"}
Si j'exécute l'image du menu fixe en exécutant "Exécution du menu fixe", je suis en mesure d'exécuter l'image sans problème, mais uniquement par le biais de kubernetes.
Quelqu'un peut-il m'aider, comment puis-je déboguer sans voir aucun journal?
Comme @Sukumar l'a commenté, vous devez que votre fichier Docker ait une commande pour pouvoir s'exécuter ou que votre ReplicationController spécifie une commande.
Le pod se bloque car il démarre puis se termine immédiatement. Kubernetes redémarre et le cycle continue.
kubectl -n <namespace-name> describe pod <pod name>
kubectl -n <namespace-name> logs -p <pod name>
J'avais besoin de garder un pod en fonctionnement pour les appels ultérieurs kubectl exec et, comme l'indiquaient les commentaires ci-dessus, mon pod était en train d'être tué par mon cluster k8s car il avait exécuté toutes ses tâches. J'ai réussi à maintenir mon pod en marche en le tapant simplement avec une commande qui ne s'arrêtait pas automatiquement, comme dans:
kubectl run YOUR_POD_NAME -n YOUR_NAMESPACE --image SOME_PUBLIC_IMAGE:latest --command tailf /dev/null
De Cette page , le conteneur meurt après avoir tout exécuté correctement mais plante, car toutes les commandes se sont terminées. Soit vous faites fonctionner vos services au premier plan, soit vous créez un script Keep Alive. Ce faisant, Kubernetes montrera que votre application est en cours d'exécution. Nous devons noter que dans l'environnement Docker
, ce problème n'est pas rencontré. Ce n'est que Kubernetes qui veut une application en cours d'exécution.
Si vous avez une application dont le démarrage est plus lent, cela pourrait être lié aux valeurs initiales des sondes de disponibilité/vivacité. J'ai résolu mon problème en augmentant la valeur de initialDelaySeconds
à 120s car mon application SpringBoot
traitait beaucoup d'initialisation. La documentation not ne mentionne pas le 0 par défaut ( https://kubernetes.io/docs/api-reference/v1.9/#probe-v1-core )
service:
livenessProbe:
httpGet:
path: /health/local
scheme: HTTP
port: 8888
initialDelaySeconds: 120
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 10
readinessProbe:
httpGet:
path: /admin/health
scheme: HTTP
port: 8642
initialDelaySeconds: 150
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 10
Une très bonne explication de ces valeurs est donnée par Quelle est la valeur par défaut de initialDelaySeconds .
L'algorithme de vérification de l'état de santé ou de l'état de préparation fonctionne comme suit:
- attendre
initialDelaySeconds
- effectuez le contrôle et attendez
timeoutSeconds
pour un délai d'attente si le nombre de succès continus est supérieur àsuccessThreshold
return return- si le nombre d'échecs continus est supérieur à
failureThreshold
renvoyer échec sinon attendezperiodSeconds
et démarrez une nouvelle vérification
Dans mon cas, mon application peut maintenant démarrer de manière très claire, de sorte que je sache que je n'aurai pas de crash-back périodique, car parfois ce serait à la limite de ces taux.
Dans mon cas, le problème était ce que Steve S. a mentionné:
Le pod se bloque car il démarre puis se termine immédiatement. Kubernetes redémarre et le cycle continue.
A savoir, j'avais une application Java dont la main
lançait une exception (et quelque chose a surchargé le gestionnaire d'exceptions par défaut non capturé afin que rien ne soit consigné). La solution consistait à placer le corps de main
dans try { ... } catch
et à imprimer l'exception. Ainsi, j'ai pu découvrir ce qui n'allait pas et le réparer.
(Une autre cause peut être quelque chose dans l'application appelant System.exit
; vous pouvez utiliser une SecurityManager
personnalisée avec une checkExit
remplacée pour empêcher (ou connecter l'appelant de) quitter; voir https://stackoverflow.com/a/5401319/204205 .)
Lors du dépannage du même problème, je n’ai trouvé aucun journal lors de l’utilisation de kubeclt logs <pod_id>
. Par conséquent, j’ai ssh: édité dans l’instance de noeud pour essayer d’exécuter le conteneur à l’aide du menu fixe. À ma grande surprise, cela a également échoué.
En entrant dans le conteneur avec:
docker exec -it faulty:latest /bin/sh
et en fouillant, j'ai trouvé que ce n'était pas la dernière version.
Une version défectueuse de l'image du menu fixe était déjà disponible sur l'instance.
Quand j'ai enlevé la dernière instance défectueuse avec:
docker rmi faulty:latest
tout a commencé à fonctionner.