El problema es que después de implementar una nueva implementación como
kubectl apply -f deployment.yml(digamos implementación con una réplica)
Kubernetes creará un segundo pod y apagará el anterior; hasta ahora, está bien.
Pero inmediatamente después de aplicar kubectl, me gustaría detectar en CI/CD si la implementación fue exitosa y, en cualquier caso (sin importar si la implementación tuvo éxito o falló), obtenga el registro de uno de los pods recién implementados para proporcionar la mayor cantidad de información posible en CI /CD log para determinar qué salió mal.
entonces estoy usando
kubectl rollout status deployment deployment-nameque está esperando la implementación para implementarse. Inmediatamente después, terminará con dos pods, uno en estado "En ejecución" y otro "Terminando".
Ahora la parte problemática: normalmente usaría un método como
kubectl get pods --selector=app=deployment-name --output=jsonpath='{.items[*].metadata.name}' --field-selector=status.phase=Runningpero desafortunadamente devolverá los nombres de ambos pods ("En ejecución" y "Terminando") separados por espacios.
Ahora he probado también
kubectl get pods --selector=app=deployment-name --output=jsonpath='{.items[*].metadata.name}' --field-selector=status.phase=Running,status.phase!=Terminatingsegún la documentación:
pero por alguna razón esto devolverá exactamente el mismo resultado, ambos pods ejecutándose y finalizando.
La pregunta es:
¿Cómo excluir correctamente los pods TERMINATING del resultado?
Problema conocido desde 2018. Aún no se ha resuelto.
Consulte Kubectl devuelve pods en varios estados cuando solo se seleccionan aquellos en estado En ejecución a través de --field-selector o -o jsonpath para obtener más detalles.
En resumen: NO hay un comando de una línea normal, CORTO y adecuado que haga lo que usted quiere.
Esto parece no ser un error. La columna STATUS de salida de kubectl get pods no muestra status.phase. kubectl get pods muestra el formato de tabla del objeto PodList y usa los estados status.containerStatuses para mostrar los datos de la columna STATUS.
Los estados válidos de la fase del pod son pendiente, en ejecución, correcto, fallido y desconocido. De este documento, el estado 'En ejecución' depende de 'restartPolicy'.
Jsonpath se aplica al objeto 'PodList', no a la salida de kubectl. status.containerStatuses indica si los contenedores de pod se están ejecutando o no. Los selectores de campo varían según los tipos de recursos de Kubernetes. status.containerStatuses no es compatible con los selectores de campo de pods.
Soluciones alternativas:
1. kubectl get pods | grep Running
2. kubectl get pods -o jsonpath='{.items[*].status.containerStatuses[*].state.running},{.items[*].metadata.name}' --field-selector=status.phase==Running | sed 's/ /\n/' | grep startedAt | awk -F',' '{print $2}'
3. ( fuente ) kubectl get pods --field-selector=status.phase=Running --template {{range .items}}{{ if not .metadata.deletionTimestamp }}{{.metadata.name}}{{"\n"}}{{end}}{{end}}
desde la línea de comandos puedes usar comandos como
greppara atrapar lo que te gusta o puedes hacer lo que hago y simplemente mirar todas las vainas con
watchComando para ver los cambios y ver los errores desde una terminal separada.
Lo que uso para este tipo de situaciones:
watch -n0.5 " kubectl get pods | grep -v 'Running' "para capturar pods con estado no en ejecución (Completado, OOMKilled, Pendiente, etc.) y luego desde una terminal separada
kubectl logs podName && kubectl describe pods podNameEspero haber sido un poco de ayuda.
Incluso para obtener el último número de revisión que uso
kubectl rollout history deployment.v1.apps/deploymentName | tail -2 | head -1 | awk '{print $1}'Pero tal vez puedas usar
kubectl get pods --sort-by=.metadata.creationTimestampy luego tome el último, así que finalmente tal vez, puede usar
kubectl logs -c [containerName] $(kubectl get pods --sort-by=.metadata.creationTimestamp | tail -1 | awk '{print$1}')esto me puede dar el último pod creado y sus registros