Los 10 mejores consejos y trucos de Kubernetes



Hay mucha literatura de referencia en Internet, pero a veces los consejos más simples se vuelven los más valiosos. El equipo de Mail.ru Kubernetes aaS ha traducido una selección de diez trucos y consejos que el autor del artículo recopiló después de un año de trabajar con Kubernetes. Los consejos no están ordenados por importancia, pero creemos que todos encontrarán algo útil para ellos.

El equipo más fácil para trabajar con Kubernetes.


Para empezar, quizás la acción más simple y útil al trabajar con Kubernetes. El siguiente comando habilita el autocompletado de comandos kubectlen el shell bash:

echo "source <(kubectl completion bash)" >> ~/.bashrc

Autocompletar kubectlse escribirá en el archivo .bashrc y se activará automáticamente cada vez que se inicie el shell. Esto acelera un conjunto de comandos y parámetros largos, como all-namespaces. Consulte la ayuda de Kubernetes bash para obtener más información .

Restricciones predeterminadas en la memoria y la CPU en el espacio de nombres


Si la aplicación no se escribe correctamente, por ejemplo, cada segundo abre una nueva conexión de base de datos, pero nunca la cierra, entonces se produce una pérdida de memoria en el clúster. Y si no hay un límite de memoria para la aplicación durante la implementación, esto puede provocar un fallo de nodo.

Para evitar esto, Kubernetes le permite establecer restricciones predeterminadas para cada espacio de nombres. Están escritos en el archivo yaml para un 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

Cree tal yaml y aplique a cualquier espacio de nombres. Por ejemplo, a un espacio de nombres limit-example. Ahora, para cualquier contenedor implementado en este espacio de nombres, se aplicará el 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 por defecto inicia la recolección de basura cuando var / lib / docker ocupa el 90% del espacio disponible en disco. Esto está bien, sin embargo, antes de Kubernetes 1.7 no había límite predeterminado en el número de inodos utilizados (inodos), que corresponden al número de archivos en el sistema de archivos.

Potencialmente, su contenedor var / lib / docker solo puede usar el 50% del espacio en disco, pero los inodos pueden agotarse, lo que causará problemas a los trabajadores.

En versiones anteriores de kubelet de 1.4 a 1.6, deberá agregar el siguiente indicador:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

En 1.7 y versiones más recientes, este indicador se establece de forma predeterminada. Sin embargo, las versiones anteriores no siguen el límite de inodes.

Minikube ... un Kubernetes local pequeño pero poderoso


Minikube es la forma más fácil de iniciar un clúster Kubernetes local. Comienza con un comando simple:

minikube start

Como resultado de este comando, un verdadero clúster de Kubernetes se está ejecutando en su computadora.


Fuente de la ilustración El

truco es cómo construir la aplicación y ejecutarla localmente en este clúster. A menos que se indique específicamente, la imagen de Docker se creará en su computadora, no en el clúster.

Para obligar a Docker a enviar la imagen al clúster Kubernetes local, la máquina acoplable recibe el siguiente comando:

eval $(minikube docker-env)

Ahora podemos construir aplicaciones en el clúster local de Kubernetes.

No le dé acceso a kubectl a todos


Esto parece obvio, pero si varios equipos usan el mismo clúster para sus aplicaciones (para lo cual se creó Kubernetes), no debería simplemente dárselo a todos kubectl. Es mejor separar los equipos dándoles a cada uno su propio espacio de nombres y delimitando el acceso mediante las políticas de RBAC.

Puede confundirse al registrar para cada pod los derechos de acceso, lectura, creación, eliminación y otras operaciones. Pero lo principal es restringir el acceso a los secretos, permitiéndolo solo a los administradores. Por lo tanto, distinguimos entre aquellos que pueden administrar el clúster y aquellos que simplemente pueden implementarlo.

Gestionar presupuestos de hogar


¿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, tal es la realidad. En cada implementación con más de una instancia, definitivamente debe incluir un PDB (PodDisruptionBudget). Se crea en un archivo simple yaml que se aplica al clúster. El área de cobertura de un PDB particular está determinada por los selectores de etiquetas.

Nota: El presupuesto del PDB solo se tiene en cuenta en caso de una interrupción voluntaria . En situaciones como fallas de hardware, el PDB no funcionará.

PDB ejemplo:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

Dos parámetros principales son matchLabelsy minAvailable. El primer parámetro indica qué aplicaciones tienen un presupuesto. Por ejemplo, si tengo implementaciones con app: app-ay etiquetas app: app-b, este PDB solo se aplicará al primero.

El parámetro se minAvailabletiene en cuenta al vaciar (limpiar) la unidad. Por ejemplo, en nuestro ejemplo, todos app: app-amenos dos casos son suplantados durante la devastación .

Esto le permite controlar cuántas instancias de la aplicación deberían ejecutarse en un momento dado.

Aplicación de monitoreo de salud


Tal monitoreo es posible de dos maneras: usando muestras de Readiness o Liveness.

La primera prueba de disponibilidad determina si el contenedor está listo para recibir tráfico.

El segundo (vida) muestra si el contenedor está funcionando o si necesita reiniciarse.

Las configuraciones apropiadas simplemente se agregan a yaml para la implementación. Allí puede especificar tiempos de espera, tiempos de retraso y el número de reintentos. Consulte la documentación de Kubernetes para más detalles .

Etiquetas en 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 crean consultas basadas en etiquetas. En Kubernetes, incluso puede ir al cliente y ver eventos por etiquetas específicas.

Con la ayuda de las etiquetas puede hacer casi todo, pero un buen ejemplo sería crear varios entornos para ejecutar programas en un clúster.

Supongamos que está utilizando el mismo clúster para devy qa. Esto significa que puede tener una aplicación app-aejecutándose simultáneamente en ambos entornos qay dev. En este caso, podemos acceder a la instancia de la aplicación en un entorno específico por separado especificando el parámetro apropiado environment. Por ejemplo, app: app-ay environment: devpara un solo entorno, app: app-ayenvironment: qapara el segundo.

Esto le permite acceder a ambas instancias de la aplicación, por ejemplo, para probar simultáneamente.

Poner en orden


Kubernetes es un sistema muy poderoso, pero cualquier sistema puede terminar empantanado en una gran cantidad de procesos. Kubelet lanza todos los procesos y comprobaciones que especifique, así como los suyos.

Por supuesto, un servicio huérfano no ralentizará el sistema, y ​​Kubernetes fue originalmente diseñado para escalar. Pero si aparece un millón en lugar de un servicio, el kubelet comienza a ahogarse.

Si por alguna razón está eliminando la implementación (contenedor, imagen, lo que sea), solo asegúrese de borrarla por completo.

Llegar a saber ir


Guardamos el consejo principal al final. Aprende el lenguaje de programación Go.

Kubernetes está desarrollado en Go, todas las extensiones están escritas en Go y la biblioteca de cliente client-go también es oficialmente compatible.

Se puede usar para cosas diferentes e interesantes. Por ejemplo, para expandir el sistema Kubernetes a su gusto. Por lo tanto, puede usar sus propios programas para recopilar datos, implementar aplicaciones o simplemente limpiar contenedores.

Aprender el lenguaje de programación Go y dominar el cliente-go es quizás el consejo más importante que puede dar a los usuarios novatos de Kubernetes.

Traducido con el soporte de Mail.ru Cloud Solutions


All Articles