Puntos clave: Los pods Kubernetes son las unidades desplegables más pequeñas, encapsulando uno o más contenedores que comparten recursos. Esta guía cubre tipos de pods, fases del ciclo de vida y despliegue con ejemplos de manifiestos YAML para pods de un solo contenedor y múltiple.
- Los pods Kubernetes gestionan eficazmente las aplicaciones contenedidas.
- Los pods pueden contener múltiples contenedores acoplados estrechamente que comparten recursos de red y almacenamiento.
En este artículo, voy a explicar los pods de Kubernetes, sus casos de utiliza y su ciclo de vida, así como cómo utilizar pods para desplegar una aplicación.
Esta publicación asume te entiendes el propósito de Kubernetes y te tener instalados minikube y kubectl.
¿Qué es un pod K8s?
De los modelos de objetos en Kubernetes, el pod están el bloque constructor más pequeño. Dentro de un clúster, un pod representa un proceso que está en ejecución. El interior de un pod puede tener uno o más contenedores. Los que están dentro de un solo pod comparten:
- Una IP de red única
- Red
- Almacenamiento
- ¿Alguna especificación adicional te aplicado al pod
Otra forma de pensar en un pod: un "host lógico" que están específico de tu aplicación y que contiene uno o más contenedores fuertemente acoplados. Por ejemplo, imagina que tenemos un app-container y un log-container en un pod. La única función del logging-container están extraer logs del app-container. Localizar tus contenedores en un pod elimina la configuración adicional de comunicación porque son co-ubicados, así que todo está local y comparten todos los recursos. Esto es lo mismo que la ejecución en el mismo servidor físico en un mundo pre-contenedor.
Por supuesto, son otras cosas que hacer con las cápsulas. te puede tener un contenedor de inicio que inicie un segundo contenedor. Una vez que el segundo contenedor están y sirviendo, el primer contenedor se detiene—su trabajo están hecho.
Tipos de modelos de cápsulas
Existen dos tipos de pods son te pueden Crea:
- Un contenedor por cápsula. Este modelo es el más popular. El poste están el "envoltorio" de un solo contenedor. Como el contenedor están el objeto más pequeño que K8S reconoce, gestiona los pods en lugar de gestionar directamente los contenedores.
- Multi-contenedor-pod. En este modelo, un pod puede albergar múltiples contenedores co-ubicados que son estrechamente acoplados para compartir recursos. Estos contenedores funcionan como una única unidad de servicio cohesionada. El pod luego envuelve estos múltiples contenedores con recursos de almacenamiento en una sola unidad. Ejemplos de casos de utiliza incluyen sidecars, proxies y registro.
Cada pod ejecuta una única instancia de tu aplicación. Si te necesitas escalar la app horizontalmente (como ejecutar varias réplicas), te puedes utiliza un pod por instancia. Esto están diferente de ejecutar varios contenedores de la misma app dentro de un solo pod.
están mencionar que los pods no son pensados como entidades duraderas. Si un nodo falla o si te mantienen nodos, los pods no sobrevivirán. Para resolver este problema, K8S tiene controladores; normalmente, un pod puede crearse con un tipo de controlador.
Fases del ciclo de vida de las cápsulas
El estado de una cápsula nos indica en qué punto están la cápsula en su ciclo de vida. están pretende darle una idea no te con certeza, por lo que están buena práctica depurar si la cápsula no sale limpiamente. Las cinco fases del ciclo de vida de una cápsula son:
- Pendiente. El pod está aceptado, pero al menos no se ha creado una imagen contenedor.
- En marcha. El pod está vinculado a un nodo y todos los contenedores son creados. Un contenedor está en funcionamiento o en proceso de iniciar o reiniciar.
- Éxito. Todos los contenedores de la cápsula terminados con éxito y no se reinician.
- Fallido. Todos los contenedores son terminados, y al menos uno falla. El contenedor fallido salió con estado distinto de cero.
- Desconocido. No se pudo obtener el estado de la cápsula.
Pods en la práctica
Hemos hablado de lo que están un pod en teoría, ahora vamos a Ve cómo es en la práctica. Primero repasaremos un manifiesto simple de pod y luego desplegaremos una aplicación de ejemplo que muestre cómo trabajar con él.
El manifiesto (YAML)
Vamos a desglosar el manifiesto en cuatro partes:
- ApiVersion – Versión de la API de Kubernetes te estás usando
- Amable – Tipo de objeto te quieres Crea
- Metadatos – Información que identifica de forma única el objeto, como nombre o espacio de nombres.
- Especificación – Configuración especificada de nuestro pod, por ejemplo nombre de imagen, nombre del contenedor, volúmenes, etc.
ApiVersion, kind y metadata son campos obligatorios que son aplicables a todos los objetos Kubernetes, no solo a los pods. La disposición de la especificación, que también están necesaria, varía entre objetos. El manifesto de ejemplo mostrado arriba muestra cómo es una especificación de un solo contenedor pod.
Cápsula de contenedor único
apiVersion: "api version" (1)
kind: "object to create" (2)
Metadata: (3)
Name: "Pod name"
labels:
App: "label value"
Spec: (4)
containers:
- name: "container name"
image: "image to use for container"
Bien, ahora que entendemos cómo es el manifiesto, mostraremos ambos modelos para crear un pod.
Nuestro pod-1.yaml es el manifiesto de nuestro pod de contenedor único. Ejecuta un pod nginx que nos hace eco de algo.
apiVersion: v1
kind: Pod
metadata:
name: firstpod
labels:
app: myapp
spec:
containers:
- name: my-first-pod
image: nginx
A continuación, desplegamos este manifiesto en nuestro clúster local de Kubernetes ejecutando Kubectl Crea -f pod-1.yaml. Luego ejecutamos "kubectl Obtén pods" para confirmar que nuestro pod está funcionando como se espera.
kubectl get pod
NAME READY STATUS RESTARTS AGE
firstpod 1/1 Running 0 45s
¡Ahora está ejecutándose! Para confirmar que realmente está funcionando, ejecuta kubectl exec firstpod—kubeconfig=kubeconfig — service nginx status. Esto ejecuta un comando dentro de nuestro pod pasando — service nginx status. (Nota: esto es similar a ejecutar docker exec.)
kubectl exec firstpod — service nginx status
nginx is running.
Ahora, limpiaremos ejecutando kubectl delete pod firstpod.
kubectl delete pod firstpod
pod "firstpod" deleted
Manifiesto multicontenedor
En este ejemplo, desplegaremos algo más útil: un pod con múltiples contenedores que funcionan como una sola entidad. Un contenedor escribe la fecha actual en un archivo cada 10 segundos mientras el otro contenedor nos sirve los registros.
Adelante, despliega el manifiesto pod-2.yaml con kubectl Crea -f pod-2.yaml.
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod # Name of our pod
spec:
volumes:
- name: shared-date-logs # Creating a shared volume for my containers
emptyDir: {}
containers:
- name: container-writing-dates # Name of first container
image: alpine # Image to use for first container
command: ["/bin/sh"]
args: ["-c", "while true; do date >> /var/log/output.txt; sleep 10;done"] # writing date every 10secs
volumeMounts:
- name: shared-date-logs
mountPath: /var/log # Mounting log dir so app can write to it.
- name: container-serving-dates # Name of second container
image: nginx:1.7.9 # Image for second container
ports:
- containerPort: 80 # Defining what port to use.
volumeMounts:
- name: shared-date-logs
mountPath: /usr/share/nginx/html # Where nginx will serve the written file
están merece la pena detenerse brevemente para hablar de volúmenes en los pods. En nuestro ejemplo anterior, los volúmenes proporcionan una forma para que los contenedores se comuniquen durante la vida útil del pod. Si el pod están eliminado y recreado, cualquier dato almacenado en el volumen compartido están perdido. El objeto de volúmenes persistentes resuelve este problema para que tus datos existan más allá de la pérdida de pod. Usamos este ejemplo de múltiples contenedores son no solo para demostrar cómo Crea pod de dos contenedores, sino también para mostrar cómo ambos contenedores comparten recursos.
kubectl create -f pod-2.yaml
pod "multi-container-pod" created
Luego confirmamos que realmente está desplegado.
kubectl get pod --kubeconfig=kubeconfig
NAME READY STATUS RESTARTS AGE
multi-container-pod 2/2 Running 0 1m
¡Genial! están funcionando. Ahora vamos a Haz asegurarnos de que todo son funcionando como esperamos. Tenemos que Haz seguros de que nuestro segundo recipiente están sirviendo los dátiles.
Comprueba que Haz que son dos contenedores en nuestro pod ejecutando kubectl describe el "nombre del pod". Este comando muestra cómo es el objeto creado.
Containers:
container-writing-dates:
Container ID: docker://e5274fb901cf276ed5d94b625b36f240e3ca7f1a89cbe74b3c492347e98c7a5b
Image: alpine
Image ID: docker-pullable://alpine@sha256:621c2f39f8133acb8e64023a94dbdf0d5ca81896102b9e57c0dc184cadaf5528
Port:
Host Port:
Command:
/bin/sh
Args:
-c
while true; do date >> /var/log/output.txt; sleep 10;done
State: Running
Started: Fri, 16 Nov 2018 11:31:44 -0700
Ready: True
Restart Count: 0
Environment:
Mounts:
/var/log from shared-date-logs (rw)
/var/run/secrets/Kubernetes.io/serviceaccount from default-token-8dl5j (ro)
container-serving-dates:
Container ID: docker://f9c85f3fe398c3197644fb117dc1681635268903b3bba43aa0a1d151fab6ad22
Image: nginx:1.7.9
Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Fri, 16 Nov 2018 11:31:44 -0700
Ready: True
Restart Count: 0
Environment:
Mounts:
/usr/share/nginx/html from shared-date-logs (rw)
/var/run/secrets/Kubernetes.io/serviceaccount from default-token-8dl5j (ro)
Ambos contenedores son funcionando, así que asegurémonos de Haz que ambos son haciendo sus tareas asignadas.
Conéctate al contenedor ejecutando kubectl exec -ti multi-container-pod -c container-serving-dates —kubeconfig=kubeconfig bash. Ahora son dentro del contenedor.
Finalmente, ejecutamos curl 'http://localhost:80/output.txt' dentro del contenedor y debería servir nuestro archivo. (Si no te tiene curl instalado en el contenedor, primero ejecuta apt-get update y apt-get instala curl y luego ejecuta curl 'http://localhost:80/output.txt' de nuevo.)
curl 'http://localhost:80/app.txt'
Fri Nov 16 18:31:44 UTC 2018
Fri Nov 16 18:31:54 UTC 2018
Fri Nov 16 18:32:04 UTC 2018
Fri Nov 16 18:32:14 UTC 2018
Fri Nov 16 18:32:24 UTC 2018
Fri Nov 16 18:32:34 UTC 2018
Fri Nov 16 18:32:44 UTC 2018
Fri Nov 16 18:32:54 UTC 2018
Recursos adicionales
Para más información sobre Kubernetes, explora estos recursos:
- Guía Kubernetes, con 20+ artículos y tutoriales
- BMC DevOps Blog
Guía Kubernetes
- ¿Qué es Kubernetes (K8s)? Un tutorial básico de Kubernetes
- Mejores prácticas de Kubernetes para mejorar la eficiencia del clúster
- Mejores Prácticas: Cómo Diseñar Aplicaciones para Kubernetes
- Kubernetes Pods: Una introducción
- Kubernetes ReplicaSets: Una breve introducción
- Despliegues de Kubernetes completamente explicados
- Cómo utilizar y gestionar los DaemonSets de Kubernetes
- Cómo funcionan los servicios de Kubernetes
- Uso de Kubernetes Port, TargetPort y NodePort
- Creación y uso de ConfigMaps en Kubernetes
- Introducción a Kubernetes Secrets
- Fundamentos de las redes de Kubernetes
- Explicación de Kubernetes Ingress
- Introducción a las Listas de Helm de Kubernetes
- ¿Qué están el patrón de operador Kubernetes?
- Despliegue de PostgreSQL como un StatefulSet en Kubernetes
- Definición de Recursos Personalizados (CRDs) de Kubernetes Explicada
- 3 Patrones Kubernetes para aplicaciones nativas en la nube
- Explicación de los recursos de cómputo de Kubernetes
- Kubernetes Security for DevOps Pipelines
- Uso de spinnaker con Kubernetes para entrega continua
- Multi-Clústeres Kubernetes: Cómo y por qué utilizarlos
- Monitorización de Kubernetes: Una guía completa
- Kubernetes vs Docker: Una comparación rápida
- Kubernetes vs Docker Swarm: Comparando herramientas de orquestación de contenedores
- Kubernetes vs OpenShift: ¿Cuál es la diferencia?
- Certificaciones Kubernetes: Cómo y por qué Obtén la certificación
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.