Entonces, ¿qué es una vaina en Kubernetes?

Nota perev. : Este artículo continúa el ciclo de materiales de un escritor técnico de Google, que trabaja en la documentación para Kubernetes (Andrew Chen) y el director de ingeniería de software de SAP (Dominik Tornow). Su objetivo es explicar clara y claramente los conceptos básicos de Kubernetes. La última vez tradujimos un artículo sobre alta disponibilidad , y ahora hablaremos sobre un concepto tan básico en Kubernetes como pod.



Kubernetes es un motor de orquestación de contenedores diseñado para ejecutar aplicaciones en contenedores en múltiples nodos, comúnmente conocido como un clúster. En estas publicaciones, utilizamos un enfoque de modelado de sistemas para mejorar la comprensión de Kubernetes y sus conceptos subyacentes. Se alienta a los lectores a que ya tengan una comprensión básica de Kubernetes.

Los pods son los componentes básicos de Kubernetes, pero incluso los usuarios experimentados de Kubernetes no siempre pueden explicar qué es.

Esta publicación ofrece un modelo de pensamiento conciso que arroja luz sobre las características definitorias de las vainas de Kubernetes. En aras de esta brevedad, tuve que omitir algunas otras características de Pods, como sondas de vida y preparación , uso compartido de recursos (incluido el uso compartido de espacios de nombres recientemente aparecido - Transl. Aprox. ) , Trabajar con la red.

Definición


Un pod es una solicitud para ejecutar uno o más contenedores en un solo nodo.

Un pod se define presentando una solicitud para ejecutar uno o más contenedores en un solo nodo, y estos contenedores comparten acceso a recursos como los volúmenes de almacenamiento y la pila de red.

Sin embargo, en la vida cotidiana, el término "pod" puede usarse tanto en el sentido de esta solicitud como en el sentido de la recolección de contenedores que se lanzan en respuesta a la solicitud. Por lo tanto, en la publicación usaremos la palabra "pod" cuando hablemos de la solicitud, y para el segundo caso, use la expresión "conjunto de contenedores".

Los pods se consideran los componentes básicos de Kubernetes porque todas las cargas de trabajo en Kubernetes, por ejemplo, Implementaciones , ReplicaSets y Trabajos , se pueden expresar como pods.

Pod es el único objeto en Kubernetes que hace que se ejecuten los contenedores. ¡Sin vaina, sin contenedor!


Esquema 1. Implementación, ReplicaSet, pod y contenedores

Arquitectura Kubernetes



Esquema 2. Pods, Programador y Kubelet

En esta ilustración, se resaltan los objetos y componentes correspondientes. Los pods se representan como Kubernetes Pod Objects , y trabajan con ellos:

  • Programador
  • Kubelet


Objetos Kubernetes



Figura 3. Objetos de Kubernetes

Esta ilustración muestra los objetos de Kubernetes responsables de trabajar con el pod:

  • el objeto pod real (Objeto Pod) ;
  • Objeto vinculante
  • Objeto de nodo

Pod Object establece el conjunto de contenedores que se lanzarán y la política de reinicio deseada en caso de un bloqueo de contenedores, y también supervisa el estado de lanzamiento.

El objeto vinculante vincula el objeto Pod al objeto nodo , es decir asigna un pod al host para su posterior lanzamiento.

Node Object representa un nodo en un clúster de Kubernetes.

Procesamiento de pod



Esquema 4. Procesamiento de pod'a

Cuando un usuario o controlador crea un pod, como ReplicaSet Controller o Job Controller , Kubernetes procesa el pod en dos pasos:

  • El programador está planeando un pod,
  • Kubelet lanza la cápsula.

Planificación de vainas



Figura 5. Ciclo de control del planificador de Kubernetes

La tarea del Programador en Kubernetes es programar un pod, es decir, asignarle un nodo adecuado en el clúster de Kubernetes para su posterior lanzamiento.


Asociar un objeto pod con un objeto nodo

Se asigna un pod a un nodo (o se une a él) si y solo si hay un objeto vinculante que tiene:

  • el espacio de nombres es igual al espacio de nombres del pod,
  • el nombre es igual al nombre de la vaina,
  • tipo de destino es igual a Node ,
  • el nombre del objetivo es igual al nombre del nodo.

(Los amantes de la aventura pueden echar un vistazo a la esencia de GitHub de Kelsey Hightower titulada " Crear y programar un pod manualmente " , una guía paso a paso sobre cómo crear manualmente un objeto vinculante).

Lanzamiento de pod



Diagrama 6. Ciclo de control de Kubelet

La tarea de Kubelet es lanzar pod, lo que esencialmente significa lanzar un conjunto de contenedores de pod. El lanzamiento de la cápsula de Kubelet ocurre en dos fases: inicialización y etapa principal.

Como regla general, un conjunto de contenedores durante la fase de inicialización lleva a cabo un trabajo preparatorio, como la preparación del directorio y la estructura de archivos necesarios. Y el conjunto de contenedores en la fase principal ya realiza las tareas "más importantes".

En la vida cotidiana, aunque esto no es del todo correcto, el término "pod" a menudo implica un conjunto de contenedores en la fase principal o un significado aún más estrecho del contenedor "más importante" de la fase principal.


Esquema 7.1. Inicio de un pod, fase de inicialización (init) y fase principal (main)

Durante la inicialización, Kubelet inicia secuencialmente los contenedores de acuerdo con las especificaciones del .Spec.InitContainers y en el orden especificado en la lista. Para iniciar con éxito el pod y teniendo en cuenta la política de reinicio, sus contenedores de inicio deben iniciarse y completarse con éxito.

Durante la fase principal, Kubelet lanza simultáneamente contenedores de acuerdo con las especificaciones de la .Spec.Containers . Aquí, para el lanzamiento exitoso del pod, y teniendo en cuenta la política de reinicio, sus contenedores principales deben iniciarse y completarse con éxito o trabajar tiempo ilimitado.


Esquema 7.2. Running pod, detalles de este proceso

En el caso de una falla del contenedor, cuando el contenedor deja de funcionar con un código de salida distinto de cero (0), Kubelet puede reiniciar el contenedor de acuerdo con la política de reinicio del pod. Esta política tiene uno de los siguientes significados: Always , en caso de OnFailure , Never .

La política de reinicio de pod tiene una semántica diferente para los contenedores init y los contenedores principales: si el lanzamiento de los contenedores init debe llevar a la finalización, entonces los contenedores principales pueden no finalizar.


Reiniciar la política para el contenedor init

El contenedor inicial se reiniciará (es decir, implica el lanzamiento de un nuevo contenedor con la misma especificación) al finalizar su trabajo solo si se cumplen las siguientes condiciones:

  • El código de salida del contenedor informa un error y
  • OnFailure política de reinicio OnFailure es Always u OnFailure .


Reiniciar la política para el contenedor principal

El contenedor principal se reiniciará (es decir, implica el lanzamiento de un nuevo contenedor con la misma especificación) al finalizar su trabajo solo si se cumplen las siguientes condiciones:

  • reiniciar la política definida como Always o
  • La política de reinicio se define como OnFailure y el código de salida del contenedor informa un error.


Diagrama 8. Ejemplo de una línea de tiempo con un punto rojo, que simboliza la falla de un contenedor

La ilustración muestra una posible línea de tiempo de lanzamiento de pod con dos especificaciones para contenedores init y dos especificaciones para contenedores principales. También muestra la creación (de acuerdo con la política de reinicio) del nuevo contenedor Main Container 1.2 después de un problema con el lanzamiento de Main Container 1.1 .

Fases del pod



Diagrama 9. Interacción de Kubelet con el objeto pod y el tiempo de ejecución del contenedor (tiempo de ejecución del contenedor)

Kubelet recibe las especificaciones de pod para .Spec.InitContainers y .Spec.Containers , lanza el conjunto de contenedores especificado y actualiza los valores de .Status.InitContainerStatuses para .Status.InitContainerStatuses y .Status.ContainerStatuses .

Kubelet contrae .Status.InitContainerStatuses y .Status.ContainerStatuses en un solo valor: .Status.Phase .

La fase de pod es una proyección del estado de los contenedores de un conjunto de contenedores, depende de:

  • estados y códigos de salida de contenedores init,
  • estados y códigos de salida de los contenedores principales.


Esquema 10. Fases de la vaina

Pendiente



Fase pendiente

Un pod está en una fase de espera si y solo si:

  • ninguno de los contenedores pod init se encuentra en el estado Terminated con un error ( Failure );
  • Todos los contenedores principales de vainas están en estado de Waiting .

Corriendo



Fase de ejecución

Pod está en la fase de trabajo si y solo si:

  • todos los contenedores pod init están en estado Terminated con éxito;
  • al menos un contenedor de pod principal está en estado de Running ;
  • ninguno de los contenedores de cápsulas principales está en el estado Terminated con una Failure .

El éxito



Fase de éxito

Pod está en una fase de éxito si y solo si:

  • todos los contenedores pod init están en estado Terminated con éxito;
  • Todos los contenedores principales de vainas están en estado Terminated con éxito.

Fracaso



Fase de falla

Un pod está en una fase de falla si y solo si:

  • todos los contenedores de vainas están en estado Terminated ;
  • al menos uno de los contenedores de pod está en el estado Terminated con un error ( Failure ).

Desconocido


Además de las fases descritas anteriormente, la cápsula puede estar en una fase desconocida, lo que indica la imposibilidad de determinar su fase actual.

Recolección de basura para vainas



Diagrama 11. Ciclo de control del recolector de basura de vainas

Una vez que se ha planificado y lanzado el pod, un controlador especial en Kubernetes, el controlador del recolector de basura Pod , es responsable de eliminar los objetos del pod de Kubernetes Object Store .

Conclusión


Pod es el componente básico de Kubernetes: se define como la representación de una solicitud para lanzar uno o más contenedores en un solo nodo. Una vez creado el pod, Kubernetes lo procesa en dos etapas: primero, el Programador programa el pod y luego Kubelet lo inicia. A lo largo de su ciclo de vida, el pod pasa por diferentes fases, informando el estado, o, más precisamente, el estado de su conjunto de contenedores, al usuario y al sistema.

PD del traductor


Lea también en nuestro blog:

Source: https://habr.com/ru/post/es427819/


All Articles