Skip to content

Revisión de Salud a Clusters de Kubernetes


Introducción

La revisión de salud de clústeres de Kubernetes es un proceso crítico para garantizar la disponibilidad, el rendimiento y la estabilidad de las aplicaciones y servicios desplegados. Este análisis permite identificar problemas en componentes clave, como nodos, pods, servicios y controladores, asegurando que el clúster opere de manera óptima y se alinee con los requisitos del negocio. A través de herramientas y prácticas recomendadas, es posible anticipar y mitigar fallos que puedan afectar la continuidad del servicio.


Objetivo

Objetivo General:

  • Capacitar a los participantes en la realización de revisiones de salud en clústeres de Kubernetes, utilizando herramientas y estrategias efectivas para diagnosticar y resolver problemas, optimizar el rendimiento del clúster y mantener su operación de manera confiable y escalable.

Estado de salud de un cluster de Kubernetes

Dentro de las tareas administrativas en un cluster de Kubernetes, está la revisión de salud de todos los componentes importantes para que el cluster funcione adecuadamente, Los comandos/pasos enumerados en esta sección, se pueden usar para verificar los recursos de Kubernetes más importantes y aplicarlos a los clústeres de Kubernetes instalados por Rancher.

Laboratorio: Estado de salud de un cluster de Kubernetes

Descripción

El estudiante aprenderá a verificar el estado de salud del cluster de Kubernetes y sus componentes más importantes.

Objetivos

  • Verificar el estado de salud del cluster de Kubernetes
  • Verificar el estado de salud desde Rancher Manager Server

Antes de comenzar

  • Contar con los accesos y permisos a nivel administrador en el cluster de Kubernetes y Rancher Manager Server

Inicio de laboratorio

  1. Establesca la conexión hacia cluster1 como predeterminada ejecutando los siguientes comandos dentro del servidor Bastion: Asegurarse de estar en el servidor Bastion con el usuario student:
    student@lab-0-bastion:~>
    
    Listar y verificar los archivos dentro del directorio /home/student/rke2_conn/cluster1/:
    ls -ltr /home/student/rke2_conn/cluster1/
    
    Copiar el archivo KUBECONFIG hacia la ubicación predeterminada del cliente kubectl:
    cp /home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml /home/student/.kube/
    
    Cambiarle nombre al archivo KUBECONFIG:
    mv /home/student/.kube/cluster1_kubeconfig.yaml /home/student/.kube/config
    
  2. Verifique que la conexión al cluster está funcionando correctamente
    kubectl version --output=yaml
    
  3. Verifique el estado de los servidores de componen el cluster
    kubectl get nodes
    
  4. Vista extendida de los nodos
    kubectl get nodes -o wide
    
  5. Verifique el consumo de recursos de hardware de todos los servidores del cluster
    kubectl top nodes
    
  6. Verifique el consumo de recursos de un servidor en particular
    kubectl top node (Node-Name)
    
  7. Revise la configuración de los nodos
    kubectl describe node (Node-Name)
    
  8. Ejecute el siguiente comando para listar nodos con Node Conditions
    kubectl get nodes -o go-template='{{range .items}}{{$node := .}}{{range .status.conditions}}{{$node.metadata.name}}{{": "}}{{.type}}{{":"}}{{.status}}{{"\n"}}{{end}}{{end}}'
    
  9. Revise los servicios principales en el Namespace KUBE-SYSTEM
    kubectl get pods -n kube-system
    
  10. Verifique que los PODS de cattle-cluster-agent estan presentes en el cluster, que se encuentran en estado Running y que no tienen una alta cantidad de reinicios:
    kubectl -n cattle-system get pods -l app=cattle-cluster-agent -o wide
    
  11. Verifique los logs de los PODS de cattle-cluster-agent:
    kubectl -n cattle-system logs -l app=cattle-cluster-agent
    
  12. El Ingress Controller predeterminado es NGINX y se implementa como DaemonSet en el Namespace kube-system, ejecute el siguiente comando para verificar su estado:
    kubectl -n kube-system get pods -o wide
    
  13. Si un POD no se ejecuta correctamente (Su estado es: not Running, si su estado Ready no muestra: 1/1 o si se observan muchos reinicios), debe revisar los detalles del POD, logs y eventos del Namespace.
    kubectl -n kube-system describe pods -l app.kubernetes.io/instance=rke2-ingress-nginx
    
    kubectl -n kube-system logs -l app.kubernetes.io/instance=rke2-ingress-nginx
    
    kubectl -n kube-system logs <pod name>
    
    kubectl -n kube-system get events
    
  14. Puede revisar la configuración generada en cada POD del Ingress Controller
    kubectl -n kube-system get pods -l app.kubernetes.io/instance=rke2-ingress-nginx --no-headers -o custom-columns=.NAME:.metadata.name | while read pod; do kubectl -n kube-system exec $pod -- cat /etc/nginx/nginx.conf; done
    
  15. Revise servicios complementarios que tenga instalados, como por ejemplo los siguientes:
    kubectl get pods -n cattle-logging-system
    
    kubectl get pods -n cattle-monitoring-system
    
    kubectl get pods -n longhorn-system
    
    Puede que no cuente con todos los servicios listados en este numeral instalados.
  16. Revise el estado de los recursos Deployments
    kubectl get deployments --all-namespaces
    
  17. Revise el estado de los recursos Deployments
    kubectl get deployments -n (Namespace)
    
  18. Verifique el estado de todos los pods, los cuales deebrían de esta en un estado Running/Completed:
    kubectl get pods -A
    
  19. Vista extendida de los pods
    kubectl get pods -A -o wide
    
  20. Revise el detalle de un POD como se muestra en el siguiente ejemplo:
    kubectl describe pod POD_NAME -n NAMESPACE
    
    kubectl describe pod rke2-metrics-server-6cd986844b-j2f9t -n kube-system
    
  21. Revise los logs de un POD como se muestra en el siguiente ejemplo:

    kubectl logs POD_NAME -n NAMESPACE
    
    kubectl logs rke2-metrics-server-6cd986844b-j2f9t -n kube-system
    
    kubectl logs -f rke2-metrics-server-6cd986844b-j2f9t -n kube-system
    
    Presione CTRL+C para salir.

  22. Verifique el estado de todos los pods qué se encuentran en estado diferente de “Running”

    kubectl get pods -A | grep -v Running | grep -v Completed
    
    Si todo marcha bien el el cluster, la salida del comando anterior debería de ser vacia.

  23. Revise los PODS que se encuentran en estado Evicted:
    kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}'
    
    Si todo marcha bien el el cluster, la salida del comando anterior debería de ser vacia.
  24. Verifique el consumo de recursos de los pods
    kubectl top pods -n (Namespace)
    
    kubectl top pods -n kube-system
    
  25. Verifique los eventos de un Namespace
    kubectl get events -n (Namespace)
    
    kubectl get events -n kube-system
    
  26. Verifique que los servicios de DNS estan ejecutándose correctamente:
    kubectl -n kube-system get pods -l k8s-app=kube-dns
    
  27. Verifique que el Servicio de DNS se encuentra presente y con el cluster-ip correctamente:
    kubectl -n kube-system get svc -l k8s-app=kube-dns
    
  28. Compruebe si los nombres de los clústeres internos se están resolviendo (en este ejemplo, kubernetes.default), la IP que se muestra después Server: debe ser la misma que la CLUSTER-IP del servicio kube-dns.
    kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes.default 2>/dev/null
    
  29. Compruebe si los nombres externos se están resolviendo correctamente (en este ejemplo, www.google.com)
    kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup www.google.com 2>/dev/null
    
  30. Verifique los logs del servicio de DNS
    kubectl -n kube-system logs -l k8s-app=kube-dns
    
  31. Verifique la configuración del servicio DNS:
    kubectl -n kube-system get configmap rke2-coredns-rke2-coredns -o go-template={{.data.Corefile}}
    
    Nota: Verificar los comandos anteriores desde la Web Console de Rancher también en posible.

Laboratorio: Ampliar kubectl con Plugins

Esta guía demuestra cómo instalar y escribir extensiones para kubectl. Los plugins extienden kubectl con nuevos subcomandos, lo que permite funciones nuevas y personalizadas que no están incluidas en la distribución principal de kubectl.

  1. Establesca la conexión hacia cluster1 como predeterminada ejecutando los siguientes comandos dentro del servidor Bastion: Asegurarse de estar en el servidor Bastion con el usuario student:
    student@lab-0-bastion:~>
    
    Listar y verificar los archivos dentro del directorio /home/student/rke2_conn/cluster1/:
    ls -ltr /home/student/rke2_conn/cluster1/
    
    Copiar el archivo KUBECONFIG hacia la ubicación predeterminada del cliente kubectl:
    cp /home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml /home/student/.kube/
    
    Cambiarle nombre al archivo KUBECONFIG:
    mv /home/student/.kube/cluster1_kubeconfig.yaml /home/student/.kube/config
    
  2. Verifique que la conexión al cluster está funcionando correctamente
    kubectl version --output=yaml
    
  3. Verifique el estado de los servidores de componen el cluster
    kubectl get nodes
    
  4. Crear un archivo llamado kubectl-mycommand en el directorio /home/student/bin con el siguiente contenido:
    #!/bin/bash
    
    # optional argument handling
    if [[ "$1" == "version" ]]
    then
        echo "1.0.0"
        exit 0
    fi
    
    # optional argument handling
    if [[ "$1" == "config" ]]
    then
        echo "$KUBECONFIG"
        exit 0
    fi
    
    echo "I am a plugin named kubectl-mycommand and i can list all pods in Cluster 1"
    
    kubectl get nodes
    
  5. Agregar permisos de ejecución
    chmod +x /home/student/bin/kubectl-mycommand
    
  6. Ahora puedes invocar tu Plugin como el comando siguiente:
    kubectl mycommand
    
    El resultado deberá ser similar al siguiente:
    I am a plugin named kubectl-mycommand and i can list all pods in Cluster 1
    NAME                             STATUS   ROLES                       AGE   VERSION          CLUSTER
    lab-0-master.c.mx-g01.internal   Ready    control-plane,etcd,master   17h   v1.29.9+rke2r1   cluster1
    lab-0-node1.c.mx-g01.internal    Ready    <none>                      17h   v1.29.9+rke2r1   
    lab-0-node2.c.mx-g01.internal    Ready    <none>                      17h   v1.29.9+rke2r1 
    
  7. Todos los argumentos y banderas se trasladan tal cual al ejecutable, al ejecutar el siguiente comando:
    kubectl mycommand version
    
    El resultado será el siguiente:
    1.0.0
    
    Este ejemplo de plugins, puede ser utilizado para extender las capacidades de kubectl y un caso de uso podría ser crear un script con todos los comandos de la revisión de salud de un cluster de Kubernetes, y usarlo de la siguiente manera: kubectl healthcheck cluster1.