Ir al contenido principal
BlogContenedores (Kubernetes, Docker)5 trucos de Kubernetes Shell

5 Kubernetes Shell Tricks

5ShellTricks_BlogImages_Blog_1920x1008

Hola, soy Andrew, desarrollador de Linode. En el proceso de construcción de una solución gestionada de Kubernetes, he descubierto y creado varios trucos que utilizo para facilitar las tareas diarias con Kubernetes. Quería compartir estos cinco aquí con ustedes y espero que los encuentren tan útiles como yo.

1. El truco de la metacarcasa

La primera vez que vi este truco fue en la charla de Olive Power sobre la preparación del CKA en la KubeCon Europe de este año.

kubectl <command> --help | grep kubectl

Cada comando kubectl contiene un número de ejemplos en su salida de ayuda, y esta es una forma rápida de verlos todos a la vez. Estos ejemplos pueden darle ideas sobre cómo combinar parámetros y banderas de manera útil que podrían no ser obvias simplemente leyendo la documentación.

Actualmente, el comando kubectl run es el que ofrece el mayor número de ejemplos: 18. Sin embargo, el comando que uso más a menudo es kubectl get. Veamos uno de sus ejemplos:

kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image

Este comando transforma la salida de kubectl get, dándole sólo la versión del contenedor desplegado para este pod. Con algunos pequeños cambios, puede hacer que la salida sea mucho más útil. Observe que está solicitando el nombre y la imagen de sólo el primer contenedor (containers[0]). Usando la sintaxis JSONPath soportada por kubectl, puede listar todas las versiones de todos los contenedores en todos los pods.

kubectl get pod -o custom-columns=CONTAINER:.spec.containers[*].name,IMAGE:.spec.containers[*].image -A

Este truco puede ahorrarle el tener que hurgar en los recursos individuales de los pods para encontrar una imagen canaria o una versión sesgada en su clúster. Con un alias de kgi (y el selector de espacio de nombres -A eliminado), puede utilizar encontrar la versión del kube-apiserver que se ejecuta en su clúster. Ver abajo:

$ kgi -n kube-system -l component=component=kube-apiserver
CONTAINER        IMAGE
kube-apiserver   k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver   k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver   k8s.gcr.io/kube-apiserver:v1.14.5

El siguiente comando imprimirá una lista actualizada de todos los ejemplos incorporados. Escoge uno con algunas banderas que nunca hayas visto antes y experimenta!

for c in $(kubectl --help | egrep "^\s+([a-z-]+)" -o); do echo -e "$(kubectl $c --help | egrep '^\s+kubectl')"; done

2. Obtener el uso de memoria por espacio de nombres

Algunos de nosotros sabemos que awk es mucho más que awk { print $1 }. Recientemente, profundicé y aprendí los fundamentos de este increíblemente poderoso lenguaje que nos llegó de algunos de los titanes de la historia de Unix. Aquí hay un ejemplo de un programa awk muy útil que es lo suficientemente corto como para ponerle un alias de una sola línea. Suma e imprime el número de MiB de memoria utilizados por todos los pods en cada espacio de nombres, y utiliza el printf de awk para una salida limpia, incluso cuando su cluster contiene nombres largos de espacios de nombres. Considere el uso de awk cuando necesite una vista agregada de la salida de kubectl.

kubectl top pod -A --no-headers=true | awk '{a[$1] += $4} END {for (c in a) printf "%-35s %s\n", c, a[c]}'

3. Ver los secretos en texto plano

Cuando desarrollas una aplicación que depende de los secretos, puede ser una tarea difícil encontrar una manera de canalizar la salida de kubectl a base64. Tal vez usted ha escrito una tubería de shell o un pequeño script para decodificarlos. He visto algunas opciones diferentes con varios inconvenientes: no soporta la salida de varias líneas, añadiendo o dejando caer nuevas líneas en el camino, o perdiendo el contexto de los nombres de los campos. Con el plugin de decodificación de secretos de Ashley Schuett para kubectl, puedes ver los secretos en una forma legible dentro de la salida de kubectl y evitar todos estos problemas.

La documentación del proyecto recomienda utilizar curl para obtener el binario de GitHub y añadirlo a nuestra ruta. Dado que esto toca una variedad de datos sensibles, te animaría a compilarlo desde el código fuente, y revisar la fuente primero. Por suerte, este plugin consiste en un único archivo fuente bien formateado:

git clone git@github.com:ashleyschuett/kubernetes-secret-decode.git
cd kubernetes-secret-decode
GO111MODULE=off go build -o $GOPATH/bin/kubectl-ksd

El nombre del binario construido en el último paso debe comenzar con kubectl- para que sea reconocido como un plugin. Asegúrate de que $GOPATH/bin está en tu $PATH, y entonces podrás usarlo así:

kubectl ksd get secret -n <namespace-name> <secret-name> -o yaml

4. Registros recientes y anteriores

Si tienes un servicio que puede alcanzar semanas o meses de tiempo de actividad, los registros del contenedor pueden crecer hasta un tamaño que hace que los típicos comandos de registro de kubectl produzcan una cantidad ridícula de salida. Es posible que sientas que estás poniendo a prueba los límites de la capacidad de tu terminal para pintar texto, o que te sorprenda la cantidad de tráfico de red en la que incurre lo que se supone que es legible para los humanos. En estos casos, hay múltiples maneras de reducir la salida y llegar a los mensajes que quieres ver.

El primero es el --tail=N que comienza a imprimir las N líneas más recientes del archivo.

kubectl logs --tail=10 -f -n kube-system -l component=kube-apiserver

También hay --since=time que acepta intervalos de tiempo como 30s, 1h o 5m para referirse a un número de segundos, horas o minutos respectivamente.

kubectl logs --since=5m -f -n kube-system -l component=kube-apiserver

Otra bandera de registro en la que he llegado a confiar es -p. Esto imprime los registros de la ejecución anterior del contenedor; los registros de un contenedor que ha salido. Esto habría hecho que mis primeros días con Kubernetes fueran mucho más fáciles, ya que intenté reiniciar los pods y "atrapar" sus registros, con alguna acción rápida de ratón y teclado, antes de que se estrellaran de nuevo.

kubectl logs -p -n kube-system -l component=etcd

5. Ahorre tiempo mientras espera

Siempre que tengas la tentación de escribir un bucle con un comando sleep, suele haber una forma mejor de hacerlo. No importa el intervalo que elijas, es probable que desperdicies uno o más segundos. Esto puede sumar si se trata de un proceso automatizado. Aquí es donde el comando kubectl wait y su paquete asociado apimachinery es para. Este comando te permite poner en pausa tus scripts durante el tiempo específico necesario para que se cumpla la condición en tu clúster. También puede utilizarlo para publicar bocinas en Slack en el momento en que una nueva versión llegue al clúster. Diviértete con él.

He aquí algunos ejemplos:

kubectl wait --for=condition=Available deployment/metrics-server
kubectl wait --for=condition=Initialized pod/csi-linode-controller-0

Las condiciones disponibles varían en función del tipo de recurso y pueden descubrirse utilizando kubectl describe en las "Condiciones:". Un recurso determinado puede tener muchas condiciones diferentes al mismo tiempo.

Trucos adicionales

A veces miras la salida y deseas que se muestre alguna información adicional de red o de otro tipo, ¿verdad? Para ayudar, añada -owide al comando. Esto funciona para casi todos los tipos de recursos, y las columnas que se muestran pueden personalizarse para las definiciones de recursos personalizadas (CRD). Ejemplos:

kubectl get pods -A -owide
kubectl get services -A -owide

Por último, por si no se ha dado cuenta hasta ahora, se ha añadido -A como alias de la bandera --all-namespaces. Supongo que sólo esta función ha ahorrado al mundo millones de pulsaciones desde que se introdujo. Otro gran ahorro de tiempo es añadir alias k=kubectl a su shell rc.

Este post se refiere principalmente a las características incorporadas de kubectl. Para profundizar aún más, existe el libro de código abierto kubectl, que se puede leer en línea. Se centra en el uso de Kustomize, una herramienta integrada que permite organizar y componer los recursos de Kubernetes. Lo recomiendo encarecidamente, especialmente si has estado buscando marcos para proyectos Kubernetes con una superficie mínimamente vulnerable. Para una colección de otros comandos útiles, echa un vistazo a Krew, el gestor de paquetes oficial para los plugins de kubectl.


Comentarios (2)

  1. Author Photo

    Great post Andrew, this is actually cool.

    #2, getting memory usage based on namespace is a nice hack, on #3, i’d prefer to use rancher to get most of these information.

    What do you think, have you tried rancher before?

  2. Andrew Sauber

    Thanks : )

    I have used Rancher before, in fact Linode has an official Rancher integration which you can read about here: https://www.linode.com/docs/kubernetes/how-to-deploy-kubernetes-on-linode-with-rancher-2-x/

    I do like Rancher for managing access to a cluster, the fact that each user gets a ServiceAccount token proxied through the Rancher deployment is very cool.

    For viewing secrets, I still use the technique in #3.

Dejar una respuesta

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