Kubernetes es una de las plataformas de automatización más populares para desplegar, escalar y operar contenedores de aplicaciones en un clúster de hosts o nodos.

Este artículo tratará sobre uno de los objetos centrales de Kubernetes: el despliegue. El objetivo es comprender su comportamiento y cómo crearlo, actualizarlo y eliminarlo.

¿Qué es un Despliegue?

Un Despliegue es uno de los objetos utilizados para lanzar Pods. Las mejores prácticas de Kubernetes fomentan el uso de despliegues para aplicaciones sin estado. Sin un despliegue, tendría que crear, actualizar y eliminar manualmente varios Pods, lo que resultaría tedioso e inviable para muchos Pods.

Un despliegue declara un único objeto en YAML que no sólo crea los Pods, sino que también garantiza que estén actualizados y en ejecución. También puede autoescalar fácilmente sus aplicaciones utilizando un despliegue en Kubernetes. Así, un despliegue se utiliza para escalar, desplegar y revertir versiones de sus aplicaciones en Pods.

Un despliegue también indica a Kubernetes cuántas copias de un Pod queremos ejecutar, y Kubernetes se encarga del resto. El controlador asociado creará un ReplicaSet a partir de su configuración al crear un despliegue. El controlador asociado al ReplicaSet creará una serie de Pods a partir de la configuración del ReplicaSet.

Las ventajas de utilizar un despliegue en lugar de crear directamente un ReplicaSet son:

  • Historización del objeto: cada cambio en el objeto (mediante un «apply» o un «edit») creará una copia de seguridad de la versión anterior.
  • Gestión de rollout y rollback: Puede volver atrás en una configuración en relación con el punto anterior.

Creación de una implantación

Existen dos métodos que podemos utilizar para crear un despliegue de Kubernetes:

Método imperativo

Las API de Kubernetes permiten un enfoque más directo e imperativo sin necesidad de archivos de configuración ni manifiestos con formato YAML. En este enfoque, todo lo que tenemos que hacer es decir lo que queremos que se haga, y Kubernetes se encargará de definir lo que debe hacerse para lograr el resultado esperado.

Para utilizar el método imperativo, basta con utilizar el siguiente comando

kubectl create deployment nginx-deployment --image nginx --port=80

Método declarativo

En este método, tiene que declararlo todo, y cuando utilice este código, Kubernetes simplemente leerá sus definiciones y creará exactamente como se presenta o declara.

Para utilizar el despliegue declarativo tendrá que crear un archivo YAML.

Archivo YAML para el despliegue con el nombre new_deployment.yaml:

apiVersion: apps/v1
tipo: Despliegue
metadatos:
  name: nginx-deployment
spec:
  #Especifica el número de Pod Copies
  réplicas: 3
 #Selecciona el Pod a gestionar por el despliegue
  selector:
    #Coincide con las etiquetas definidas
    matchLabels:
      deploy: ejemplo
  template:
    metadata:
      #Especifica las etiquetas del Pod.
       etiquetas:
         deploy: ejemplo
    spec:
      contenedores:
        - nombre: nginx
          imagen: nginx:1.20.2 

En este archivo YAML, tras definir la versión de la API de Kubernetes, el tipo de objeto que está creando y el nombre del despliegue, se encuentra la sección spec. En esta sección, defina primero la clave de réplicas, que indica el número de instancias Pod que el despliegue debe mantener activas.

Utilice una etiqueta selectora para identificar los Pods del despliegue. Para ello, puede utilizar la etiqueta deploy, que indica que todos los Pods que coinciden con estas etiquetas se agrupan en el despliegue.

Después de esto, tiene el objeto plantilla donde tiene un modelo Pod dentro de su especificación de despliegue. Cuando el despliegue crea Pods, los crea utilizando esta plantilla. La especificación de un Pod normal se encuentra bajo la clave de la plantilla.

Con este despliegue, las imágenes Nginx con etiquetas se desplegarán en Pods. Además, también hay que tener cuidado en este punto, y el Pod es la unidad de escalabilidad en Kubernetes, por lo que hay que pensar en el patrón que se quiere utilizar si se ponen varios contenedores en el mismo Pod.

A continuación, aplique el archivo Yaml new_deployment.yaml, utilice el siguiente comando:

kubectl apply -f nuevo_despliegue.yaml

Después de unos segundos, puede obtener el estado del despliegue utilizando lo siguiente:

kubectl get all
deploy

Recuperar y actualizar el despliegue

Tenga en cuenta que tiene los Pods creados, el despliegue y también un Replicaset. Así que un despliegue siempre crea y gestiona un Replicaset. Ahora puede utilizar el siguiente comando para describir el despliegue:

kubectl describe deployment nginx-deployment 
describe

Ahora tiene una descripción completa del despliegue. Destaca la estrategia utilizada para crear/reconstruir los pods cuando se ha definido una actualización como RollingUpdate.

La estrategia RollingUpdate permite una migración ordenada de una versión de una aplicación a una versión más reciente. Es la estrategia utilizada por defecto en Kubernetes.

Además, también disponemos de las siguientes estrategias:

  • Recrear: Termina las instancias Pod actualmente en ejecución y las «recrea» con la nueva versión;
  • Azul/Verde: Esta estrategia crea dos entornos separados pero idénticos. En el entorno azul, la aplicación se ejecuta tal cual, mientras que en el entorno verde, la aplicación se ejecuta tal y como será en el futuro;
  • Canario: Una estrategia de despliegue en la que un subconjunto de usuarios participa en el lanzamiento incremental de una aplicación o servicio.

Si opta por «rolling-update», puede configurar su comportamiento sobre el número de réplicas deseado.

  • maxSurge le permite indicar (en términos porcentuales o absolutos) cuántos Pods puede crear además del número de réplicas configurado actualmente.
  • maxUnavailable le permite indicar (en términos porcentuales o absolutos) cuántos Pods pueden estar «no disponibles» durante la actualización, en función del número de réplicas configuradas.

Dependiendo de su aplicación y de su autoescalador, estas configuraciones le permitirán garantizar la calidad de servicio o acelerar sus despliegues.

A continuación, debe escalar los Pods a 10 y cambiar la etiqueta de imagen Nginx a la última.

kubectl scale deployment nginx-deployment --replicas=10
scale-1

Observe que tenemos 5 contenedores creándose, y de 10 Pods, tenemos 5 disponibles.

Después de unos segundos, utilice el siguiente comando:

kubectl get all

Aquí puede ver que todos los Pods han sido creados, y los contenedores se están ejecutando.

all-1

Borrar su despliegue

Para eliminar un despliegue de Kubernetes, puede utilizar los siguientes comandos:

kubectl delete deploy nginx-deployment 
kubectl delete deploy nuevo_despliegue.yaml

Helm: Simplifique los despliegues

Cuando desee desplegar una aplicación compleja que utilice decenas o incluso cientos de recursos de Kubernetes, la herramienta kubectl se vuelve inadecuada, razón por la cual se desarrolló la herramienta Helm. Helm es un gestor de paquetes para Kubernetes que se basa en kubectl y simplifica el despliegue de aplicaciones.

En el vocabulario de Helm, una aplicación se denomina release. Está asociada a una carta, es decir, a una colección de archivos de configuración en formato YAML que contienen variables globales y plantillas que describen los recursos de Kubernetes.

Conclusión

El despliegue es un objeto esencial de Kubernetes. Como un gran poder implica una gran responsabilidad, debe tener cuidado al configurarlo o se arriesgará a tener comportamientos inesperados. Para profundizar en la configuración del despliegue, puede consultar la documentación de Kubernetes.

También puede explorar algunos de los mejores tutoriales de Kubernetes para aprender desde cero y convertirse en un experto.