Master Solución de problemas de KUBERNETES POD: estrategias y escenarios avanzados

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.

Este artículo se publicó por primera vez en Yunyunzhongsheng ( https://yylives.cc/ ), todos son bienvenidos a visitarlo.

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 yuanes
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/6919515/blog/11054466
Recomendado
Clasificación