Hay mucha literatura de referencia en Internet, pero a veces los consejos más simples son los más valiosos. Equipo Kubernetes aaS de Mail.ru traducido una selección de diez trucos y consejos, que el autor del artículo ha recogido tras un año de trabajo con Kubernetes. Los consejos no están ordenados por importancia, pero creemos que todos encontrarán algo útil para ellos.
El comando más fácil de usar con Kubernetes
Para empezar, quizás el paso más sencillo y útil a la hora de trabajar con Kubernetes. El siguiente comando permite completar el comando kubectl en bash shell:
Autocompletar kubectl se escribirá en el archivo .bashrc y se activará automáticamente cada vez que se inicie el shell. Esto acelera la escritura de comandos largos y opciones como all-namespaces. Más detalles en Ayuda de bash de Kubernetes.
Límites predeterminados de CPU y memoria del espacio de nombres
Si una aplicación se escribe incorrectamente, como abrir una nueva conexión de base de datos cada segundo pero nunca cerrarla, el clúster perderá memoria. Y si la aplicación no tiene un límite de memoria durante la implementación, esto puede provocar una falla del nodo.
Para evitar esto, Kubernetes le permite establecer límites predeterminados para cada espacio de nombres. Están escritos en el archivo yaml para un espacio de nombres específico. A continuación se muestra un ejemplo de dicho archivo:
Cree dicho yaml y aplíquelo a cualquier espacio de nombres. Por ejemplo, al espacio de nombres. limit-example. Ahora, cualquier contenedor implementado en este espacio de nombres tendrá un límite de 512Mi, a menos que se establezca adicionalmente otro límite individual para este contenedor.
Recolección de basura en versiones anteriores de Kubernetes
Kubelet inicia la recolección de basura de forma predeterminada cuando var/lib/docker Ocupa el 90% del espacio disponible en disco. Esto es fantástico, sin embargo, antes de Kubernetes 1.7, no había un límite predeterminado en la cantidad de inodos utilizados, que corresponden a la cantidad de archivos en el sistema de archivos.
Potencialmente tu contenedor var/lib/docker Sólo puede utilizar el 50% del espacio en disco, pero puede quedarse sin inodos, lo que causará problemas a los trabajadores.
En versiones anteriores de kubelet de 1.4 a 1.6, deberá agregar la siguiente bandera:
El truco consiste en cómo crear la aplicación y ejecutarla localmente en este clúster. A menos que se especifique lo contrario, la imagen de Docker se creará en su máquina, no en el clúster.
Para obligar a Docker a enviar la imagen al clúster de Kubernetes local, se proporciona el siguiente comando a la máquina acoplable:
eval $(minikube docker-env)
Ahora podemos crear aplicaciones en un clúster de Kubernetes local.
No compartas el acceso a kubectl con todos
Esto parece obvio, pero si varios equipos utilizan el mismo clúster para sus aplicaciones (que es para lo que se creó Kubernetes), no los emita todos seguidos. kubectl. Es mejor separar los comandos, dándole a cada uno su propio espacio de nombres y delimitando el acceso con políticas RBAC.
Puede confundirse al asignar derechos 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 únicamente a los administradores. Así es como distinguimos entre quienes pueden administrar el clúster y quienes simplemente pueden implementarlo.
Administrar presupuestos de pods
¿Cómo garantizar que no haya tiempo de inactividad para una aplicación en un clúster de Kubernetes? PodDisruptionBudget y nuevamente PodDisruptionBudget.
Los clústeres se actualizan periódicamente y los nodos se vacían. Nada se detiene, esa es la realidad. Cada implementación con más de una instancia debe incluir un PDB (PodDisruptionBudget). Se crea en un archivo yaml simple que se aplica al clúster. El alcance de un PDB en particular está determinado por los selectores de etiquetas.
Nota: El presupuesto del AP se tiene en cuenta sólo en caso de una infracción presupuestaria reversible (interrupción voluntaria). En situaciones como fallas de hardware, PDB no funcionará.
Los dos parámetros principales son matchLabels и minAvailable. El primer parámetro especifica a qué aplicaciones se aplica el presupuesto. Por ejemplo, si tengo implementaciones con etiquetas app: app-a и app: app-b, entonces este PDB solo se aplicará al primero.
Parámetro minAvailable Se tiene en cuenta al vaciar (limpiar) el nodo. Por ejemplo, en nuestro ejemplo, todas las instancias son desalojadas durante la devastación. app: app-aexcepto dos.
Esto le permite controlar cuántas instancias de la aplicación deben ejecutarse al mismo tiempo.
Monitoreo del estado de la aplicación
Este seguimiento es posible de dos formas: mediante pruebas de preparación o de vida.
La primera sonda (preparación) determina si el contenedor está listo para recibir tráfico.
El segundo (vivacidad) indica si el contenedor está en buen estado o es necesario reiniciarlo.
Las configuraciones relevantes simplemente se agregan al yaml para su implementación. Allí puede especificar tiempos de espera, tiempo de retraso y número de reintentos. Ver más sobre ellos Documentación de Kubernetes.
Etiquetas por todas partes
Las etiquetas son uno de los conceptos fundamentales en Kubernetes. Permiten que los objetos se comuniquen libremente entre sí, así como también creen solicitudes basadas en etiquetas. En Kubernetes, incluso puedes ir al cliente y ver eventos para etiquetas específicas.
Se puede hacer casi cualquier cosa con etiquetas, pero un buen ejemplo sería crear múltiples entornos para ejecutar programas en el mismo clúster.
Digamos que usas el mismo cluster para dev и qa. Esto significa que puedes tener una aplicación. app-a, trabajando simultáneamente en ambos entornos qa и dev. En este caso, podemos acceder a la instancia de la aplicación por separado en un entorno específico especificando el parámetro apropiado environment. Por ejemplo, app: app-a и environment: dev para un entorno, y app: app-a и environment: qa para el segundo.
Esto le permite acceder a ambas instancias de la aplicación, por ejemplo, para realizar pruebas al mismo tiempo.
Poner las cosas en orden
Kubernetes es un sistema muy poderoso, pero cualquier sistema eventualmente puede atascarse en una gran cantidad de procesos. Kubelet ejecuta todos los procesos y comprobaciones que usted especifique, así como los suyos propios.
Por supuesto, 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 aparece un millón, Kubelet empieza a ahogarse.
Si por alguna razón está eliminando una implementación (contenedor, imagen, lo que sea), asegúrese de limpiarla por completo.
Conozca ir
Hemos guardado nuestro consejo principal para el final. Aprenda el lenguaje de programación Go.
Kubernetes está desarrollado en Go, todas las extensiones están escritas en Go y la biblioteca client-go también es compatible oficialmente.
Se puede utilizar para cosas diferentes e interesantes. Por ejemplo, para ampliar el sistema Kubernetes a tu gusto. Por ejemplo, puede utilizar sus propios programas para recopilar datos, implementar aplicaciones o simplemente limpiar contenedores.
Aprender el lenguaje de programación Go y dominar client-go es quizás el consejo más importante que se les puede dar a los usuarios novatos de Kubernetes.