Cómo implementar aplicaciones en Kubernetes

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

Este artículo discutirá uno de los objetos centrales en Kubernetes: la implementación. El objetivo es comprender su comportamiento y cómo crearlo, actualizarlo y eliminarlo.

¿Qué es un Despliegue?

Una implementación es uno de los objetos que se utilizan para lanzar pods. Las mejores prácticas de Kubernetes fomentan el uso de implementaciones para aplicaciones sin estado. Sin una implementación, necesitaría crear, actualizar y eliminar manualmente varios Pods, lo que sería tedioso e inviable para muchos Pods.

Una implementación declara un solo objeto en YAML que no solo crea los pods, sino que también garantiza que estén actualizados y en ejecución. También puede escalar automáticamente fácilmente sus aplicaciones mediante una implementación en Kubernetes. Por lo tanto, una implementación se usa para escalar, implementar y revertir versiones de sus aplicaciones en Pods.

Una implementación también le dice 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 una implementación. El controlador asociado con el ReplicaSet creará una serie de Pods a partir de la configuración del ReplicaSet.

Las ventajas de usar una implementación en lugar de crear directamente un ReplicaSet son:

  • Historización del objeto: cada cambio en el objeto (a través de una «aplicación» o una «edición») creará una copia de seguridad de la versión anterior.
  • Gestión de rollout y rollback: Puede retroceder en una configuración en relación con el punto anterior.

Creación de una implementación

Hay dos métodos que podemos usar para crear una implementación de Kubernetes:

método imperativo

Las API de Kubernetes permiten un enfoque más directo e imperativo sin necesidad de archivos de configuración o 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 qué se debe hacer para lograr el resultado esperado.

Para usar el método imperativo, simplemente use el siguiente comando:

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

Método declarativo

En este método, debe declarar todo, y cuando usa este código, Kubernetes solo lee sus definiciones y crea exactamente como se presenta o declara.

Para usar la implementación declarativa, deberá crear un archivo YAML.

Archivo YAML para implementación con el nombre new_deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  #Specifies the number of Pod Copies
  replicas: 3
 #Selects the Pod to be managed by the deployment
  selector:
    #Matches the defined labels
    matchLabels:
      deploy: example
  template:
    metadata:
      #Specifies the labels on the Pod.
       labels:
         deploy: example
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.2 

En este archivo YAML, después de definir la versión de la API de Kubernetes, el tipo de objeto que está creando y el nombre de la implementación, está la sección de especificaciones. En esta sección, primero define la clave de réplicas, que indica la cantidad de instancias de Pod que la implementación debe mantener activa.

Use una etiqueta de selector para identificar los pods en la implementación. Para esto, puede usar la etiqueta de implementación, que indica que todos los pods que coinciden con estas etiquetas se agrupan en la implementación.

Después de eso, tiene el objeto de plantilla donde tiene un modelo de Pod dentro de su especificación de implementación. Cuando la implementación crea pods, los crea usando esta plantilla. La especificación de un pod normal se puede encontrar en la clave de plantilla.

Con esta implementación, las imágenes de Nginx con etiquetas se implementará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 un mismo Pod.

Luego, aplique el archivo new_deployment.yaml Yaml, use el siguiente comando:

kubectl apply -f new_deployment.yaml

Después de unos segundos, puede obtener el estado de implementación usando lo siguiente:

kubectl get all

Recuperar y actualizar la implementación

Tenga en cuenta que tiene los Pods creados, la implementación y también un Replicaset. Por lo tanto, una implementación siempre crea y administra un conjunto de réplicas. Ahora puede usar el siguiente comando para describir la implementación:

kubectl describe deployment nginx-deployment 

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

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

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

  • Recrear: finaliza las instancias de Pod que se están ejecutando actualmente 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 como lo hará en el futuro;
  • Canary: una estrategia de implementación en la que un subconjunto de usuarios participa en el lanzamiento incremental de una aplicación o servicio.

Si opta por la «actualización continua», puede configurar su comportamiento sobre la cantidad de réplicas deseadas.

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

Según su aplicación y su escalador automático, estas configuraciones le permitirán garantizar QoS o acelerar sus implementaciones.

A continuación, debe escalar los Pods a 10 y cambiar la etiqueta de imagen de Nginx a la más reciente.

kubectl scale deployment nginx-deployment --replicas=10

Tenga en cuenta que tenemos 5 contenedores en creación, y de 10 Pods, tenemos 5 disponibles.

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

kubectl get all

Aquí puede ver que se han creado todos los pods y que los contenedores se están ejecutando.

Eliminación de su implementación

Para eliminar una implementación de Kubernetes, puede usar los siguientes comandos:

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

Helm: simplificar las implementaciones

Cuando desea implementar una aplicación compleja que utiliza 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 administrador de paquetes para Kubernetes que se basa en kubectl y simplifica las implementaciones de aplicaciones.

En el vocabulario de Helm, una aplicación se llama lanzamiento. Está asociado a un gráfico, es decir, una colección de archivos de configuración en formato YAML que contiene variables globales y plantillas que describen los recursos de Kubernetes.

Conclusión

La implementación es un objeto esencial de Kubernetes. Como un gran poder implica una gran responsabilidad, debes tener cuidado al configurarlo o te arriesgas a tener comportamientos inesperados. Para ir más allá con las configuraciones de implementación, 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.