Los 10 mejores trucos y consejos de Kubernetes

Los 10 mejores trucos y consejos de Kubernetes

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:

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

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:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

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:

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

En 1.7 y posteriores, este indicador está configurado de forma predeterminada. Sin embargo, las versiones anteriores no imponen el límite de inodos.

Minikube… Kubernetes local pequeño pero potente

Minikube es la forma más sencilla de ejecutar un clúster de Kubernetes local. Se inicia con un simple comando:

minikube start

Este comando dará como resultado que se ejecute un clúster de Kubernetes real en su máquina.

Los 10 mejores trucos y consejos de Kubernetes
Fuente de ilustración

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á.

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 и 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.

Traducido con el apoyo de Mail.ru Cloud Solutions

Que mas leer:

  1. Tres niveles de autoescalado en Kubernetes y cómo utilizarlos de forma eficaz.
  2. Nodos trabajadores de Kubernetes: muchos pequeños o pocos grandes?
  3. 25 herramientas útiles para implementar y administrar Kubernetes.

Fuente: habr.com

Añadir un comentario