Las implementaciones de Kubernetes (K8) a menudo presentan desafíos desde diversas perspectivas, incluidos pods, servicios, ingreso, clústeres que no responden, planos de control y configuración de alta disponibilidad. El pod de Kubernetes es la unidad implementable más pequeña del ecosistema de Kubernetes y encapsula uno o más contenedores que comparten recursos y redes. Los pods están diseñados para ejecutar una única instancia de una aplicación o proceso, y se crean y eliminan según sea necesario. Los pods son esenciales para escalar, actualizar y mantener aplicaciones en un entorno K8.
Traducido de Master Kubernetes Pods: estrategias avanzadas de solución de problemas , autor Ninguno.
Este artículo explora los desafíos que enfrentan los pods de Kubernetes y los pasos a seguir para solucionar problemas. Algunos de los mensajes de error encontrados al ejecutar pods de Kubernetes incluyen:
- ImagenPullBackoff
- ErrImagePull
- Nombre de imagen no válido
- CrashLoopBackOff
A veces, ni siquiera encontrará los errores enumerados, pero aun así descubrirá que su pod falla. Primero, es importante tener en cuenta que al depurar cualquier recurso de Kubernetes, debes comprender la referencia de API . Explica cómo se definen las distintas API de Kubernetes y cómo funcionan varios objetos en un pod/implementación. La documentación está claramente definida en la referencia de API en el sitio web de Kubernetes . En este caso, al depurar el pod, seleccione el objeto del pod en la referencia de API para obtener más información sobre cómo funciona el pod. Define los campos que van al pod, a saber, versión, tipo, metadatos, especificación y estado. Kubernetes también proporciona una hoja de referencia con una guía de los comandos necesarios.
requisitos previos
Este artículo asume que los lectores tienen las siguientes condiciones:
- Tipo instalado para demostración de escenario.
- Comprensión intermedia de la arquitectura de Kubernetes.
- Herramienta de línea de comando Kubectl
Error del módulo de Kubernetes: ImagePullBackoff
Este error aparece por tres motivos diferentes:
- Imagen inválida
- Etiqueta no válida
- Permisos no válidos
Estas situaciones surgen cuando no tienes la información correcta sobre la imagen. Es posible que tampoco tenga permiso para extraer la imagen de su repositorio (repositorio privado). Para demostrar esto en el siguiente ejemplo, creamos una implementación de nginx:
➜ ~ kubectl create deploy nginx --image=nginxdeployment.apps/nginx created
Después de que el Pod se esté ejecutando, obtenga el nombre del pod:
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-8f458dc5b-hcrsh 1/1 Running 0 100s
Copie el nombre del pod en ejecución y obtenga más información al respecto:
➜ ~ kubectl describe pod nginx-8f458dc5b-hcrsh
Name: nginx-8f458dc5b-hcrsh
hable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m43s default-scheduler Successfully assigned default/nginx-8f458dc5b-hcrsh to k8s-troubleshooting-control-plane
Normal Pulling 2m43s kubelet Pulling image "nginx"
Normal Pulled 100s kubelet Successfully pulled image "nginx" in 1m2.220189835s
Normal Created 100s kubelet Created container nginx
Normal Started 100s kubelet Started container nginx
La imagen se ha extraído con éxito. Su pod de Kubernetes se está ejecutando sin errores.
Para demostrar ImagePullBackoff, edite el archivo YAML de implementación y especifique una imagen que no existe:
➜ kubectl edit deploy nginx
containers:
-image: nginxdoestexist
imagePullPolicy: Always
name: nginx
El nuevo módulo no se implementó correctamente
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5b847fdb95-mx4pq 0/1 ErrImagePull 0 3m40s
nginx-8f458dc5b-hcrsh 1/1 Running 0 38m
Se muestra el error ImagePullBackoff
➜ ~ kubectl describe pod nginx-6f46cbfbcb-c92bl
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 88s default-scheduler Successfully assigned default/nginx-6f46cbfbcb-c92bl to k8s-troubleshooting-control-plane
Normal Pulling 40s (x3 over 88s) kubelet Pulling image "nginxdoesntexist"
Warning Failed 37s (x3 over 85s) kubelet Failed to pull image "nginxdoesntexist": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxdoesntexist:latest": failed to resolve reference "docker.io/library/nginxdoesntexist:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
Warning Failed 37s (x3 over 85s) kubelet Error: ErrImagePull
Normal BackOff 11s (x4 over 85s) kubelet Back-off pulling image "nginxdoesntexist"
Warning Failed 11s (x4 over 85s) kubelet Error: ImagePullBackOff
Error del pod de Kubernetes: la imagen se extrajo pero el pod está en estado pendiente.
Siempre que ejecuta K8 en un entorno de producción, el administrador de K8 asigna cuotas de recursos a cada espacio de nombres según los requisitos de los espacios de nombres que se ejecutan dentro del clúster. Los espacios de nombres se utilizan para la separación lógica dentro de un clúster.
El error "Imagen extraída, pero el pod aún está pendiente" se genera cuando las especificaciones en la cuota de recursos no cumplen con los requisitos mínimos de la aplicación en el Pod. En el siguiente ejemplo, cree un espacio de nombres llamado pagos:
➜ ~ kubectl create ns payments
namespace/payments created
Cree cuotas de recursos utilizando especificaciones relevantes
➜ ~ cat resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 4Gi
Asignar cuotas de recursos a pagos de espacios de nombres
➜ ~ kubectl apply -f resourcequota.yaml -n paymentsresourcequota/compute-resources created
Cuota de recursos/recursos informáticos creados
Cree una nueva implementación dentro de un espacio de nombres con restricciones de cuota de recursos:
kubectl create deploy nginx --image=nginx -n paymentsdeployment.apps/nginx created
Aunque la implementación se creó correctamente, no existen pods:
➜ ~ kubectl get pods -n payments
No resources found in payments namespace
Se crea la implementación, pero no hay Pods en estado listo, ni Pods para actualizar ni Pods disponibles:
➜ ~ kubectl get deploy -n payments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 0 0 7m4s
Para depurar más, describa la implementación de nginx. Error al crear el pod:
➜ ~ kubectl describe deploy nginx -n payments
Name: nginx
Namespace: payments
CreationTimestamp: Wed, 24 May 2023 21:37:55 +0300
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 1 desired | 0 updated | 0 total | 0 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
ReplicaFailure True FailedCreate
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: nginx-8f458dc5b (0/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set nginx-8f458dc5b to 1
Un análisis más detallado de los eventos de Kubernetes reveló que no se necesitaba suficiente memoria para la creación del Pod.
➜ ~ kubectl get events --sort-by=/metadata.creationTimestamp
Este error ocurre cuando su imagen se extrae exitosamente y se crea su contenedor, pero su configuración de tiempo de ejecución falla. Por ejemplo, si tiene una aplicación Python en funcionamiento que intenta escribir en una carpeta que no existe o no tiene permiso para escribir en la carpeta. Inicialmente, la aplicación se ejecuta y luego encuentra un error. Si ocurre un pánico en la lógica de su aplicación, el contenedor se detendrá. El contenedor entrará en CrashLoopBackOff. Finalmente, observa que la implementación no tiene Pods, es decir, hay un Pod, pero no se está ejecutando y arroja un error CrashLoopbackoff.
Las sondas de vida y preparación fallaron
La detección de vida detecta si un Pod ha entrado en un estado dañado y ya no puede proporcionar tráfico. Kubernetes reiniciará el Pod por usted. Las sondas de preparación verifican si su aplicación está lista para manejar el tráfico. Las sondas de preparación garantizan que su aplicación obtenga toda la configuración requerida del mapa de configuración e inicie sus subprocesos. Sólo después de completar este proceso su aplicación estará lista para recibir tráfico. Si su aplicación encuentra un error durante este proceso, también ingresará a CrashLoopBackoff.
¡Comience a solucionar problemas!
Este artículo proporciona una descripción general de las técnicas de solución de problemas para Kubernetes Pods. Aborda los errores comunes que se encuentran al implementar Pods y proporciona soluciones prácticas para resolver estos errores. También proporciona información sobre páginas de referencia y hojas de trucos que son fundamentales para comprender cómo funciona Kubernetes e identificar y resolver problemas de manera efectiva. Siguiendo la guía proporcionada en este artículo, los lectores pueden mejorar sus habilidades de resolución de problemas y simplificar la implementación y administración de sus Kubernetes Pods.
Decidí renunciar al código abierto Hongmeng Wang Chenglu, el padre del código abierto Hongmeng: El código abierto Hongmeng es el único evento de software industrial de innovación arquitectónica en el campo del software básico en China: se lanza OGG 1.0, Huawei contribuye con todo el código fuente. Google Reader es asesinado por la "montaña de mierda de código" Ubuntu 24.04 LTS se lanza oficialmente Antes del lanzamiento oficial de Fedora Linux 40, desarrolladores de Microsoft: el rendimiento de Windows 11 es "ridículamente malo", Ma Huateng y Zhou Hongyi se dan la mano, "eliminando rencores" Conocidas empresas de juegos han emitido nuevas regulaciones: los obsequios de boda de los empleados no deben exceder los 100.000 yuanes Pinduoduo fue sentenciado por competencia desleal Indemnización de 5 millones de yuanesEste artículo se publicó por primera vez en Yunyunzhongsheng ( https://yylives.cc/ ), todos son bienvenidos a visitarlo.