KubeTips

Hello World 🙂
En el apasionante mundo de la administración de contenedores, Kubernetes (K8s) se ha establecido como el orquestador por excelencia. Su versatilidad, escalabilidad y robustez lo convierten en una herramienta imprescindible para gestionar nuestras aplicaciones en entornos de contenedores. En este artículo, me complace compartir con ustedes algunos «Tips and Tricks» que he aprendido a lo largo de mi experiencia en la administración de clúster de Kubernetes. Estos consejos no solo facilitarán la gestión diaria del clúster, sino que también ayudarán a optimizar su rendimiento y a evitar posibles obstáculos. ¡Así que prepárense para descubrir algunas gemas que harán que su viaje con Kubernetes sea aún más placentero y productivo!
Kubectx y Kubens
Este par de herramientas son muy útil para mejorar la productividad, si tienes varios clústeres es vital saber sobre cuál estás situado a la hora de hacer un cambio o consultar alguna información y para eso kubectx es esencial, con kubens vas a poderte mover por los diferentes namespace del clúster sin problemas.
Crear «Alias»
No soy muy fan de usar «alias», pero si contamos la cantidad de veces que ejecutamos kubectl en el día nos damos cuenta de que utilizarlo en este caso es realmente útil.
- Ejemplos:
alias allpods='kubectl get pods -A'alias kgl='kubectl logs -n namespace'alias kgn='kubectl get node'
kubectl get
Usando get para ver todos los tag de un deployment y filtrar sus pod:
- Primero ver los tag del deployment
kubectl get deploy name_deploy -o wide
- Luego filtrar los pod por tag
kubectl get pods -l app=mi-aplicacion
- Filtrar todas las imágenes que tienen los
poddel namespace kube-systemkubectl get pods -n kube-system -o custom-columns="POD:.metadata.name,IMAGE:.spec.containers[*].image
- Obtener información sobre CPU y memoria de todos los nodos
kubectl get nodes -o custom-columns="NAME:.metadata.name,CPU:.status.allocatable.cpu,MEMORY:.status.allocatable.memory"
kubectl event
Saber los eventos que están pasando en tu clúster es vital, pero el problema es que si no ordenamos esos eventos más que una ayuda se convierte en un verdadero dolor de cabeza, ahí es cuando entra
- El orden en que se generaron los eventos
kubectl get events -A --sort-by='.metadata.creationTimestamp'
- Lo más reciente que ocurrió
kubectl get events -A --sort-by='.lastTimestamp'kubectl get events -A --sort-by='.lastTimestamp' | tail
kubectl logs
Con esta opción podemos ver los log de diferentes recursos:
- Para ver los log de un pod
kubectl logs pod-name
- Para ver los log de un deploy
kubectl logs -f deployment/deploy-name
- Para ver los log de un daemonset
kubectl logs -f daemonset/ds-name
- Para ver los logs de todos los contenedores de un pod
kubectl logs pod-name --all-containers=true- Si queremos ver los de un solo contenedor del pod usamos la opción
-c container-name
- Ver registros anteriores
kubectl logs --previous pod-name
Kubectl top
Utilizar este comando es realmente útil para analizar la carga en tiempo real de nuestros nodos y pods
Kubectl top nodeKubectl top pod
Nota: Para poder hacer uso de este comando previamente es necesario deployar metrics server
kubectl rollout
Muchas veces precisamos por alguna razón reiniciar nuestro deployment y una opción muy eficiente es ejecutando:
kubectl rollout restart deployment php-apache
Nota: al reiniciar un deployment utilizando el comando kubectl rollout restart, se respetarán las estrategias definidas en el deployment. Las estrategias de rollout en Kubernetes controlan cómo se actualizan los pods cuando se hace un cambio en el deployment.
kubectl describe
Este comando es parecido a «kubeclt logs» nos permite obtener información del recurso
kubectl describe deploymy-nginxkubectl describe podmy-nginx
kubectl edit
No es lo más recomendado, pero quizás precises editar tu deployment o pod por alguna razón y ahí entra en escena
kubectl edit deploy my-nginxkubectl edit pod my-nginx
kubectl port-forward
Para hacer un túnel, por ejemplo, poder conectarse al dashboard de EKS que está en el clúster desde mi máquina:
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8443:443
Luego en navegador local:
Localhost:8443
kubectl auth
Para ver qué permisos tiene el usuario que está logueado en el clúster, podemos cambiar el tipo de verbo y recurso:
kubectl auth can-i get pokubectl auth can-i create deployment
Para ver qué permisos tiene sobre el ns dev:
kubectl auth can-i get po -n dev
Si trabajas con AWS EKS aquí te dejo un par de tips;
- Si
readonly-devestá declarado en elConfigMap aws-authcomo unusername, puedes ejecutar:kubectl auth can-i get pods -n dev --as=readonly-dev
- Probar un grupo declarado en el
ConfigMap aws-auth:kubectl auth can-i get pods --namespace=gbvhq --as-group=readonly-group
Kubectl delete
En ocasiones, podemos necesitar eliminar recursos de forma manual, ya sea por pruebas, errores de despliegue o simplemente para forzar una limpieza. Para estos casos, Kubernetes nos ofrece el comando kubectl delete
Ejemplo para eliminar un pod.
kubectl delete po name-pod
Si tenemos un Pod que se encuentra en estado problemático y no responde a la eliminación tradicional, podemos forzar su eliminación inmediata ejecutando:
kubectl delete po pod-name --grace-period=0 --force
--grace-period=0: indica que no debe esperar ningún tiempo antes de eliminar.
--force: fuerza la eliminación del recurso.
Troubleshooting
La creación de una imagen Docker destinada al troubleshooting dentro de nuestro clúster es una práctica sumamente útil. A menudo, cuando nos enfrentamos a un problema, entramos en un pod del clúster e instalamos diversas herramientas para analizar lo que está sucediendo. El inconveniente surge cuando ese pod se elimina y nos vemos obligados a repetir el proceso una y otra vez, convirtiéndose en un ciclo tedioso.
Por esta razón, mi recomendación es crear una imagen que contenga un conjunto de herramientas de troubleshooting, almacenarla en un repositorio de imágenes y utilizarla cada vez que enfrentemos un problema. Esto nos permite agilizar el proceso de diagnóstico y solución de problemas dentro del clúster, evitando la repetición de tareas y facilitando la gestión de incidencias de manera más eficiente, Ej:
kubectl run tmp -it --restart=Never --image=870730/troubleshooting:v1.2 --tty --rm /bin/sh
Entender la ayuda de kubectl
Aprender todos los comandos necesarios para trabajar con Kubernetes puede resultar un desafío. Poder contar con la ayuda integrada en la línea de comandos de kubectl es de gran utilidad. Dominar el uso de comandos como ‘explain’ y ‘help’ nos permite aclarar dudas rápidamente y agilizar nuestras tareas. Estas funciones nos brindan información detallada sobre los recursos y comandos disponibles, así como ejemplos de su uso.
- Ejemplos:
kubectl explain deploymentkubectl explain deployment --recursivekubectl explain deployment.spec.strategykubectl <command> --help
Extras
Si trabajas con EKS, y quieres ver todos tus nodos ordenados por el nombre de grupos de nodos, y también ver algunos detalles como tipo de instancia, AZ de cada nodo;
- kubectl get nodes -L node.kubernetes.io/instance-type -L eks.amazonaws.com/nodegroup -L topology.kubernetes.io/zone –sort-by='{.metadata.labels.eks\.amazonaws\.com/nodegroup}’
Si quieres ver cuanto CPU tienen asignado los nodos;
kubectl get nodes -o=custom-columns=NAME:.metadata.name,CPU:.status.allocatable.cpu
Una vez que habilites el plugin en los worker nodes con GPU (nvidia-device-plugin), puedes ejecutar el siguiente comando. Verás 1 en los nodos que tienen la GPU habilitada;
kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPUs:.status.allocatable.'nvidia\.com/gpu'
Estos son los «Tips and Tricks» que he utilizado en la administración de clúster de K8S. Si conoces algún consejo adicional que no se mencionó aquí, ¡te animo a compartirlo en los comentarios!
¡Nos vemos en la próxima entrada!
