Tutoriales

Solución de problemas de Kubernetes: 6 formas de encontrar y solucionar problemas

Kubernetes es la plataforma de orquestación de contenedores más popular. Tiene una amplia gama de capacidades que incluyen escalado, autorreparación, orquestación de contenedores, almacenamiento, secretos y más. El principal problema con una solución tan rica se debe principalmente a su complejidad. Debe conocer sus muchas funciones clave para utilizarlo al máximo. Intentaré cubrir algunos de los aspectos menos obvios para mejorar su experiencia con Kubernetes en producción.

Este artículo (y el que lo acompaña) video de Youtube) describe algunos métodos comunes de solución de problemas utilizando escenarios del mundo real. Supongo que tiene un conocimiento básico de Kubernetes. Si es un principiante, lea ¿Qué es Kubernetes? Luego regrese para echar un vistazo rápido a las funciones y la resolución de problemas de Kubernetes.

[ Getting started with containers? Check out this no-cost course. Deploying containerized applications: A technical overview. ]

1. Obtienes un error OOMKilled

Imagina que te has fusionado Prometeo y la herramienta de monitoreo Grafana en un clúster de Kubernetes, y cree una regla para identificar cuándo un pod deja de estar disponible de forma permanente. Cuando su Pod no esté disponible, se lo notificará a través de llamadas telefónicas automáticas o mensajes de chat.

si tu corres kubectl get pods y ve que algunos pods se están reiniciando, lo siguiente que debe hacer es verificar por qué. Puedes hacer esto con:

kubectl describe pod myPodName -n myNamespace

Es posible que vea un mensaje como el siguiente:

State:  Running
Started: Sun, 16 Feb 2020 10:20:09 +0000
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Sun, 16Feb 2019 09:27:39 +0000
Finished: Sun, 16 Feb 2019 10;20:08 +0000
Restart Count: 7

OOMKilled Significa que el pod alcanzó su límite de memoria, por lo que se reinicia.Puede ver la cantidad de reinicios cuando se ejecuta describe Ordenar. La solución obvia es aumentar la configuración de la memoria.Esto se puede hacer ejecutando kubectl edit deployment myDeployment -n mynamespace y edite el límite de memoria.

Esto puede suceder debido a una pérdida de memoria provocada por un error en su aplicación. Es importante mirar los registros para ver si hay una razón válida para la sobrecarga de memoria (por ejemplo, si la cantidad de solicitudes está aumentando).

2. Verá saltos repentinos en la carga y la escala

Es importante crear una métrica (y mostrarla en un tablero) para rastrear la cantidad de solicitudes por segundo que recibe su aplicación. Esto le da una idea de lo que es normal para su objetivo.

A veces la carga puede saltar repentinamente. Si realiza un seguimiento de la tasa de éxito de su servicio, es posible que se le notifique sobre esta información. También puede detectar esto comparando la carga actual con datos históricos. Quiere ser notificado por las reglas de Prometheus cuando surjan tales problemas.

En este caso, tiene dos opciones: puede aumentar la CPU siguiendo los mismos pasos que la asignación de memoria, o puede aumentar la cantidad de instancias del pod. El enfoque recomendado es aumentar el número de instancias. Por ejemplo, aumente el número de réplicas a cinco:

kubectl scale deployment myDeployment –replicas=5

Si ya está rastreando solicitudes por segundo, probablemente sepa cuántas instancias necesita para manejar las solicitudes adicionales.

Este proceso se puede automatizar si utiliza un escalador automático.

3. Revertir la implementación incorrecta

Si una implementación reciente está causando el problema, una de las formas más rápidas y fáciles de solucionarlo es usar la reversión. Para ver el historial de implementación:

kubectl rollout history deployment myDeployment

La salida es similar a:

kubectl rollout history deployment myDeployment
 deployment.extensions/myDeployment
REVISION CHANGE-CAUSE
1               
2               
3               
4               

La implementación más reciente es la implementación numerada más alta (4 en este caso). Realizar una reversión a la implementación anterior (3):

kubectl rollout undo deployment myDeployment –-to-revision=3

Verá el nuevo pod creado.

Es aconsejable configurar el historial de implementación para guardar un número específico de versiones.Haga esto configurando revisionHistoryLimit.

P.ej:

spec:
replicas:2
revisionHistoryLimit:20

Esto guardará las 20 configuraciones de implementación más recientes.

[ Learn the basics in the Kubernetes cheat sheet. ]

4. Acceder a registros específicos

Suponiendo que tiene un inicio de sesión adecuado, puede revisar sus registros para determinar por qué y cuándo ocurrió el problema:

kubectl logs myPodName 

Sin embargo, es posible que los registros de instancias anteriores del Pod ya no estén actualizados. En este caso, ejecute el siguiente comando para obtener los registros de la instancia anterior:

kubectl logs myPodName –previous

Si ejecuta varios contenedores en el mismo pod, debe especificar el nombre del contenedor para ver sus registros. Si está utilizando un servicio de registro, por lo general, los registros más recientes tardan un poco en aparecer. En este caso, ver los registros con el comando anterior suele ser mejor que confiar en el tablero.

[ Want to test your sysadmin skills? Take a skills assessment today. ]

5. SSH en su pod

Si ninguno de los consejos anteriores funciona, podría tener sentido usar Secure Shell (SSH) para acceder al interior del pod y realizar algunas comprobaciones básicas. Por ejemplo, puede determinar si puede ver el archivo que espera en el sistema de archivos y si existe el archivo de registro. También puedes comprobar que puedes realizar solicitudes de conexión a otros servicios directamente desde el pod. Para conectarse al pod a través de SSH:

kubectl exec -it myPodName sh

Esto le permite acceder al pod a través de una ventana de shell.

6. Corrige los errores de CrashloopBackoff e ImagePullBackoff

Probablemente tenga una herramienta de monitoreo como Grafana para monitorear la cantidad de instancias en cualquier punto del servicio. Por lo general, desea ejecutar una determinada cantidad de instancias mínimas en función del tamaño de la carga. Si el número mínimo no coincide, se activará una alerta.cuando surgen problemas CrashLoopBackOff (su pod se está iniciando, fallando, comenzando de nuevo y luego fallando nuevamente), entonces su servicio no devuelve un código de éxito 200. Si obtiene un error, esto puede indicar un problema de rendimiento.

si un kubectl get pods El comando devuelve el siguiente resultado, entonces sabes que tienes un pod CrashLoopBackOff estado:

kubectl get pods
NAME                   READY  STATUS            RESTARTS   AGE
myDeployment1-89234... 1/1    Running           1          17m
myDeployment1-46964... 0/1    CrashLoopBackOff  2          1m

Puede haber muchas razones para este error.puede que tenga que hacer kubectl describe pod Rastreando la fuente. Aquí hay un resumen de las posibles causas y algunos consejos:

  • Su Dockerfile no tiene un comando (CMD), por lo que su pod se cierra tan pronto como se inicia. Kubernetes reinicia automáticamente los Pods cuando son administrados por un Deployment o ReplicaSet.
  • Está utilizando el mismo puerto para ambos contenedores dentro del mismo pod. Todos los contenedores dentro del mismo pod tienen la misma dirección de Protocolo de Internet (IP). No se les permite utilizar el mismo puerto. Cada contenedor en su pod necesita un puerto separado.
  • Kubernetes no pudo extraer la imagen que especificó y siguió fallando.Aquí hay un ejemplo ImagePullBackoff.
  • correr kubectl logs podName para obtener más información sobre la causa del error.
  • Si no ve nada útil en los registros, considere usar el comando de suspensión para implementar la aplicación durante unos minutos. Esto podría ayudarlo a ver algunos registros antes de que la aplicación se bloquee. También puede ayudarlo a determinar si su aplicación tiene errores de código o fallas en su configuración. Si tiene problemas de configuración, probablemente no verá ningún error de código (ya que falla antes de llegar a ellos).

envolver

Kubernetes es una excelente herramienta para automatizar muchos de los procesos manuales involucrados en la implementación, administración y escalado de aplicaciones en contenedores. Si algo sale mal, pruebe estos seis métodos de solución de problemas para encontrar y solucionar el origen del problema.


Este artículo está basado en Ejemplos de solución de problemas de Kubernetespublicado originalmente en el blog de Tennexas, reutilizado con permiso.

LEER  Cómo configurar el clúster Mariadb Galera en Ubuntu o Debian Linux

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba