
En internet hay mucha literatura de referencia, pero a veces los consejos más simples resultan ser los más valiosos. El equipo ha traducido , que la autora del artículo reunió después de un año de trabajo con Kubernetes. Los consejos no están ordenados por importancia, pero creemos que cada uno encontrará algo útil para sí mismo.
El comando más simple al trabajar con Kubernetes
Para empezar, probablemente la acción más simple y útil al trabajar con Kubernetes. El siguiente comando activa el autocompletado de comandos kubectl en la terminal bash:
echo "source > ~/\.bashrc
El autocompletado kubectl se registrará en el archivo .bashrc y se activará automáticamente cada vez que se inicie la terminal. Esto acelera la escritura de comandos y parámetros largos, como all-namespacesMás detalles en .
Limitaciones por defecto en memoria y CPU en el espacio de nombres
Si una aplicación está mal escrita, por ejemplo, abre una nueva conexión con la base de datos cada segundo pero nunca la cierra, se producirá una fuga de memoria en el clúster. Y si no se establece un límite de memoria para la aplicación al desplegarla, esto puede llevar a un fallo del nodo.
Para evitar esto, Kubernetes permite establecer límites por defecto para cada espacio de nombres. Estos se definen en un archivo yaml para el espacio de nombres específico. Aquí hay un ejemplo de tal archivo:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
Crea este yaml y aplícalo a cualquier espacio de nombres. Por ejemplo, al espacio de nombres limit-example. Ahora, para cualquier contenedor desplegado en este espacio de nombres, se aplicará un límite de 512Mi, a menos que se establezca otro límite individual para ese contenedor.
Recogida de residuos en versiones antiguas de Kubernetes
Kubelet, por defecto, comienza la recogida de residuos cuando var/lib/docker ocupa el 90 % del espacio de disco disponible. Esto es genial, sin embargo, hasta la versión 1.7 de Kubernetes no había un límite por defecto sobre el número de descriptores de índice inode (inodos) usados, que corresponden al número de archivos en el sistema de archivos.
Potencialmente, tu contenedor var/lib/docker puede utilizar solo el 50 % del espacio de disco, pero puede quedarse sin inodos, lo que ocasionará problemas para los trabajadores.
En las versiones antiguas de kubelet de 1.4 a 1.6, deberás agregar esta bandera:
--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%
En las versiones 1.7 y posteriores, esta bandera está habilitada por defecto. Sin embargo, las versiones anteriores no controlan el límite de inodos.
Minikube… pequeño pero poderoso Kubernetes local.
Minikube es la forma más sencilla de ejecutar un clúster de Kubernetes local. Se inicia con un simple comando:
minikube start
Como resultado de ejecutar este comando, tendrás un clúster de Kubernetes real en tu computadora.

El truco está en cómo construir la aplicación y ejecutarla localmente en este clúster. Si no se dan instrucciones específicas, la imagen de Docker se construirá en tu computadora y no en el clúster.
Para hacer que Docker envíe la imagen al clúster local de Kubernetes, se utiliza el siguiente comando en la máquina Docker:
eval $(minikube docker-env)
Ahora podemos construir aplicaciones en el clúster local de Kubernetes.
No otorgues acceso de kubectl a todos indiscriminadamente.
Esto parece obvio, pero si varios equipos utilizan un clúster para sus aplicaciones (para lo cual fue creado Kubernetes), no deberías simplemente otorgar acceso a todos. kubectlEs mejor dividir los equipos, asignando a cada uno su propio espacio de nombres y delimitando el acceso con políticas RBAC.
Puedes complicarte configurando permisos de acceso, lectura, creación, eliminación y otras operaciones para cada pod. Pero lo principal es restringir el acceso a los secretos, permitiéndolo solo a los administradores. Así se delimitará quién puede administrar el clúster y quién puede simplemente desplegar en él.
Gestiona los presupuestos de los pods.
¿Cómo garantizar que no haya tiempos de inactividad para la aplicación en el clúster de Kubernetes? PodDisruptionBudget y otra vez PodDisruptionBudget.
Los clústeres se actualizan periódicamente y los nodos se desocupan. Nada permanece estático, esa es la realidad. Cada despliegue con más de una instancia debe incluir necesariamente el PDB (PodDisruptionBudget). Se crea en un simple archivo yaml que se aplica al clúster. El alcance específico de un PDB está determinado por selectores de etiquetas.
Nota: El presupuesto del PDB solo se tiene en cuenta en interrupciones de presupuesto reversibles (). En situaciones como fallos de hardware, el PDB no funcionará.
Ejemplo de PDB:
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: app-a-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: app-a
Los dos parámetros principales son matchLabels y minAvailable. En el primer parámetro se indica para qué aplicaciones se aplica el presupuesto. Por ejemplo, si tengo despliegues con etiquetas app: app-a y app: app-b, este PDB solo se aplicará al primero.
Parámetro minAvailable se considera al vaciar (limpiar) un nodo. Por ejemplo, en nuestro caso, durante la vacuidad se desalojan todas las instancias app: app-a, excepto dos.
Esto permite controlar cuántas instancias de la aplicación deben estar en funcionamiento en cada momento.
Monitoreo de la salud de la aplicación
Este monitoreo se puede realizar de dos maneras: mediante las pruebas Readiness o Liveness.
La primera prueba (readiness) determina si el contenedor está listo para recibir tráfico.
La segunda (liveness) indica si el contenedor está funcional o si necesita ser reiniciado.
Las configuraciones correspondientes se agregan simplemente en yaml para el despliegue. Allí se pueden especificar los tiempos de espera, el tiempo de retardo y el número de reintentos. Para más detalles sobre ellos, consulte la .
Etiquetas en todas partes
Las etiquetas son uno de los conceptos fundamentales en Kubernetes. Permiten que los objetos se vinculen libremente entre sí, así como crear consultas basadas en etiquetas. En Kubernetes, incluso se puede acceder al cliente y observar eventos según etiquetas específicas.
Con las etiquetas se puede hacer prácticamente todo, pero un buen ejemplo sería crear múltiples entornos para ejecutar programas en un mismo clúster.
Supongamos que utiliza el mismo clúster para dev y qa. Esto significa que puede tener una aplicación app-a, funcionando simultáneamente en ambos entornos qa y dev. En este caso, podemos dirigirnos por separado a la instancia de la aplicación en un entorno específico, especificando el parámetro correspondiente entorno. Por ejemplo, app: app-a y environment: dev para un entorno, y app: app-a y environment: qa para el segundo.
Esto permite acceder a ambas instancias de la aplicación, por ejemplo, realizando pruebas simultáneamente.
Organizar
Kubernetes es un sistema muy poderoso, pero cualquier sistema eventualmente puede quedar atrapado en una gran cantidad de procesos. Kubelet ejecuta todos los procesos y chequeos que ha especificado, así como los suyos propios.
Claro, un servicio huérfano no ralentizará el sistema, y Kubernetes está diseñado para escalar desde el principio. Pero si en lugar de un servicio hay un millón, kubelet comenzará a ahogarse.
Si por alguna razón eliminas un despliegue (contenedor, imagen, lo que sea), asegúrate de una limpieza completa.
Conoce Go
El consejo más importante lo dejamos para el final. Aprende el lenguaje de programación Go.
Kubernetes está desarrollado en Go, todas las extensiones están escritas en Go, y además, se cuenta con la biblioteca cliente client-go oficialmente soportada.
Se puede usar para diversas y interesantes aplicaciones. Por ejemplo, para personalizar el sistema Kubernetes a tu gusto. Así, puedes usar programas propios para recopilar datos, desplegar aplicaciones o simplemente limpiar contenedores.
Aprender el lenguaje de programación Go y dominar client-go es, sin duda, el consejo más importante que se puede dar a los nuevos usuarios de Kubernetes.
Qué más leer:
- .
- ?
- .
Fuente: habr.com
