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 pod del namespace kube-system 
    • kubectl 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 node
  • Kubectl 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 deploy my-nginx
  • kubectl describe pod my-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-nginx
  • kubectl 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 po
  • kubectl 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-dev está declarado en el ConfigMap aws-auth como un username, 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 deployment
    • kubectl explain deployment --recursive
    • kubectl explain deployment.spec.strategy
    • kubectl <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!

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

IT

Siguiente artículo

Filebeat vs Fluentd vs FluentBit