Deployment


En esta página, se describen los objetos de implementación de Kubernetes y su uso en Google Kubernetes Engine (GKE).

¿Qué es un objeto Deployment?

Las implementaciones representan un conjunto de varios Pods idénticos sin identidades exclusivas. Una implementación ejecuta varias réplicas de tu aplicación y reemplaza automáticamente cualquier instancia que falle o deje de responder. De esta manera, las implementaciones ayudan a garantizar que una o más instancias de tu aplicación estén disponibles para entregar solicitudes de usuarios. El controlador de implementación de Kubernetes administra las implementaciones.

Los Deployments usan una plantilla de Pod, que contiene una especificación para sus Pods. La especificación del pod determina cómo debe verse cada pod: qué aplicaciones deben ejecutarse dentro de sus contenedores, qué volúmenes deben activar, sus etiquetas y más.

Cuando se cambia la plantilla de pod de una implementación, se crean nuevos pods automáticamente, uno a la vez.

Patrones de uso

Las implementaciones son adecuadas para las aplicaciones sin estado que usan volúmenes ReadOnlyMany o ReadWriteMany activados en varias réplicas, pero no son adecuadas para cargas de trabajo que usan volúmenes ReadWriteOnce. Para las aplicaciones con estado que usan volúmenes ReadWriteOnce, debes usar StatefulSets. Los StatefulSets están diseñados para implementar aplicaciones con estado y aplicaciones agrupadas que guardan datos en almacenamiento continuo, como los discos persistentes de Compute Engine. Los StatefulSets son adecuados para implementar Kafka, MySQL, Redis, ZooKeeper y otras aplicaciones que necesitan identidades exclusivas y persistentes y nombres de host estables.

Crea implementaciones

Puedes crear una implementación con los comandos kubectl apply o kubectl create.

Una vez creada, la implementación garantiza que la cantidad deseada de pods esté en ejecución y disponible en todo momento. La implementación reemplaza automáticamente los pods que fallan o son expulsados de sus nodos.

A continuación, se muestra un ejemplo de un archivo de manifiesto de una implementación en formato YAML:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

En este ejemplo, se dan las siguientes situaciones:

  • Se crea una implementación con el nombre nginx, indicada por el campo metadata: name.
  • La implementación crea tres pods replicados, indicados por el campo replicas.
  • La plantilla del pod o el campo spec: template indican que sus pods tienen la etiqueta app: nginx.
  • La especificación de la plantilla del pod o el campo template: spec indican que los pods ejecutan un contenedor, nginx, que se ejecuta en la imagen nginx Docker Hub en la versión 1.7.9.
  • El Deployment abre el puerto 80 para que lo usen los Pods.

Para obtener más información sobre las especificaciones de Deployment, consulta la documentación de la API de Kubernetes.

En resumen, la plantilla del pod contiene las siguientes instrucciones para los pods que crea esta implementación:

  • Cada pod tiene la etiqueta app: nginx.
  • Crea un contenedor y asígnele el nombre nginx.
  • Ejecuta la imagen nginx en la versión 1.7.9.
  • Abre el puerto 80 para enviar y recibir tráfico.

Para obtener más información sobre cómo crear implementaciones, consulta la sección sobre cómo crear una implementación.

Cómo actualizar implementaciones

Puedes actualizar una implementación si cambias la especificación de la plantilla del pod de la implementación. Realizar cambios en el campo de especificación activa un lanzamiento de actualización de forma automática. Puedes usar kubectl, la API de Kubernetes o el menú de Cargas de trabajo de GKE en la consola de Google Cloud.

De forma predeterminada, cuando una implementación activa una actualización, la implementación detiene los pods, disminuye la cantidad de pods a cero de forma gradual y, luego, desvía y finaliza los pods. Luego, la implementación usa la plantilla del pod actualizada para abrir nuevos pods.

Los pods antiguos no se quitan hasta que se ejecute un número suficiente de pods nuevos, y estos no se crearán hasta que se haya quitado una cantidad suficiente de pods antiguos. Para ver en qué orden se activan y se quitan los Pods, puedes ejecutar kubectl describe deployments.

Los Deployments pueden garantizar que se ejecute al menos una réplica menos de la cantidad deseada, con un máximo de un Pod no disponible. Del mismo modo, los Deployments pueden garantizar que se ejecute como máximo una réplica más de la cantidad deseada, con un máximo de un Pod más que la cantidad deseada en ejecución.

Puedes revertir una actualización con el comando kubectl rollout undo. También puedes usar kubectl rollout pause para detener una implementación de manera temporal.

Administra implementaciones

A continuación, se muestra una lista de tareas de administración comunes para las implementaciones:

Estado y ciclo de vida

Las implementaciones pueden estar en uno de tres estados durante su ciclo de vida: en progreso, completadas o con errores.

El estado en progreso indica que la implementación está en proceso de realizar sus tareas, como abrir o escalar sus pods.

El estado completada indica que la implementación completó con éxito sus tareas, todos sus pods se ejecutan con la última especificación y están disponibles y no hay pods antiguos en ejecución.

El estado con errores indica que la implementación encontró uno o más problemas que impidieron que completara sus tareas. Algunas causas incluyen cuotas o permisos insuficientes, errores de extracción de imagen, rangos de límite o errores de entorno de ejecución. Para investigar la causa de una falla de implementación, puedes ejecutar kubectl get deployment [DEPLOYMENT+NAME] -o yaml y revisar los mensajes en el campo status: conditions.

Puedes supervisar el progreso de una implementación o verificar su estado con el comando kubectl rollout status.

¿Qué sigue?