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 contenedoresArquitectura Kubernetes
Esquema 2. Pods, Programador y KubeletEn esta ilustración, se resaltan los objetos y componentes correspondientes. Los
pods se representan como
Kubernetes Pod Objects , y trabajan con ellos:
Objetos Kubernetes
Figura 3. Objetos de KubernetesEsta 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'aCuando 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 KubernetesLa 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 nodoSe 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 KubeletLa 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 procesoEn 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 initEl 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 principalEl 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 contenedorLa 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 vainaPendiente
Fase pendienteUn 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ónPod 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 éxitoPod 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 fallaUn 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 vainasUna 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: