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
- Establesca la conexión hacia
cluster1como predeterminada ejecutando los siguientes comandos dentro del servidorBastion: Asegurarse de estar en el servidorBastioncon el usuariostudent:Listar y verificar los archivos dentro del directoriostudent@lab-0-bastion:~>/home/student/rke2_conn/cluster1/:Copiar el archivols -ltr /home/student/rke2_conn/cluster1/KUBECONFIGhacia la ubicación predeterminada del clientekubectl:Cambiarle nombre al archivocp /home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml /home/student/.kube/KUBECONFIG:mv /home/student/.kube/cluster1_kubeconfig.yaml /home/student/.kube/config - Verifique que la conexión al cluster está funcionando correctamente
kubectl version --output=yaml - Verifique el estado de los servidores de componen el cluster
kubectl get nodes - Vista extendida de los nodos
kubectl get nodes -o wide - Verifique el consumo de recursos de hardware de todos los servidores del cluster
kubectl top nodes - Verifique el consumo de recursos de un servidor en particular
kubectl top node (Node-Name) - Revise la configuración de los nodos
kubectl describe node (Node-Name) - 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}}' - Revise los servicios principales en el Namespace KUBE-SYSTEM
kubectl get pods -n kube-system - 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 - Verifique los logs de los PODS de cattle-cluster-agent:
kubectl -n cattle-system logs -l app=cattle-cluster-agent - 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 - 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-nginxkubectl -n kube-system logs -l app.kubernetes.io/instance=rke2-ingress-nginxkubectl -n kube-system logs <pod name>kubectl -n kube-system get events - 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 - Revise servicios complementarios que tenga instalados, como por ejemplo los siguientes:
kubectl get pods -n cattle-logging-systemkubectl get pods -n cattle-monitoring-systemPuede que no cuente con todos los servicios listados en este numeral instalados.kubectl get pods -n longhorn-system - Revise el estado de los recursos Deployments
kubectl get deployments --all-namespaces - Revise el estado de los recursos Deployments
kubectl get deployments -n (Namespace) - Verifique el estado de todos los pods, los cuales deebrían de esta en un estado Running/Completed:
kubectl get pods -A - Vista extendida de los pods
kubectl get pods -A -o wide - Revise el detalle de un POD como se muestra en el siguiente ejemplo:
kubectl describe pod POD_NAME -n NAMESPACEkubectl describe pod rke2-metrics-server-6cd986844b-j2f9t -n kube-system -
Revise los logs de un POD como se muestra en el siguiente ejemplo:
kubectl logs POD_NAME -n NAMESPACEkubectl logs rke2-metrics-server-6cd986844b-j2f9t -n kube-systemPresione CTRL+C para salir.kubectl logs -f rke2-metrics-server-6cd986844b-j2f9t -n kube-system -
Verifique el estado de todos los pods qué se encuentran en estado diferente de “Running”
Si todo marcha bien el el cluster, la salida del comando anterior debería de ser vacia.kubectl get pods -A | grep -v Running | grep -v Completed - Revise los PODS que se encuentran en estado Evicted:
Si todo marcha bien el el cluster, la salida del comando anterior debería de ser vacia.
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}}' - Verifique el consumo de recursos de los pods
kubectl top pods -n (Namespace)kubectl top pods -n kube-system - Verifique los eventos de un Namespace
kubectl get events -n (Namespace)kubectl get events -n kube-system - Verifique que los servicios de DNS estan ejecutándose correctamente:
kubectl -n kube-system get pods -l k8s-app=kube-dns - 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 - 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 - 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 - Verifique los logs del servicio de DNS
kubectl -n kube-system logs -l k8s-app=kube-dns - Verifique la configuración del servicio DNS:
Nota: Verificar los comandos anteriores desde la Web Console de Rancher también en posible.
kubectl -n kube-system get configmap rke2-coredns-rke2-coredns -o go-template={{.data.Corefile}}
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.
- Establesca la conexión hacia
cluster1como predeterminada ejecutando los siguientes comandos dentro del servidorBastion: Asegurarse de estar en el servidorBastioncon el usuariostudent:Listar y verificar los archivos dentro del directoriostudent@lab-0-bastion:~>/home/student/rke2_conn/cluster1/:Copiar el archivols -ltr /home/student/rke2_conn/cluster1/KUBECONFIGhacia la ubicación predeterminada del clientekubectl:Cambiarle nombre al archivocp /home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml /home/student/.kube/KUBECONFIG:mv /home/student/.kube/cluster1_kubeconfig.yaml /home/student/.kube/config - Verifique que la conexión al cluster está funcionando correctamente
kubectl version --output=yaml - Verifique el estado de los servidores de componen el cluster
kubectl get nodes - Crear un archivo llamado
kubectl-mycommanden el directorio/home/student/bincon 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 - Agregar permisos de ejecución
chmod +x /home/student/bin/kubectl-mycommand - Ahora puedes invocar tu Plugin como el comando siguiente:
El resultado deberá ser similar al siguiente:
kubectl mycommandI 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 - Todos los argumentos y banderas se trasladan tal cual al ejecutable, al ejecutar el siguiente comando:
El resultado será el siguiente:
kubectl mycommand versionEste ejemplo de plugins, puede ser utilizado para extender las capacidades de1.0.0kubectly 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.