Implementar una aplicación de Linux sin estado


En esta página, se explica cómo implementar una aplicación de Linux sin estado mediante Google Kubernetes Engine (GKE). También puedes aprender a implementar una aplicación de Windows sin estado.

Descripción general

Las aplicaciones sin estado son aplicaciones que no almacenan los datos o el estado de la aplicación en el clúster o en almacenamiento continuo. En cambio, los datos y el estado de la aplicación se quedan con el cliente. Esto hace que las aplicaciones sin estado sean más escalables. Por ejemplo, una aplicación frontend no tiene estado: implementas múltiples réplicas para aumentar su disponibilidad y disminuir su escala cuando la demanda es baja, y las réplicas no necesitan identidades únicas.

Kubernetes usa el controlador de Deployment para implementar aplicaciones sin estado como Pods uniformes que no son únicos. Las implementaciones administran el estado deseado de tu aplicación: cuántos pods deben ejecutar tu aplicación, qué versión de imagen del contenedor se debe ejecutar, cómo se deben etiquetar los pods, etcétera. El estado deseado puede modificarse de forma dinámica mediante actualizaciones en la especificación del pod de la implementación.

Las aplicaciones sin estado se diferencian de las aplicaciones con estado, que usan almacenamiento continuo para guardar datos y StatefulSets a fin de implementar pods con identidades únicas.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.
  • Asegúrate de que tu aplicación en contenedores se almacene en un registro de imagen, como Artifact Registry.

  • Si recién comienzas a usar GKE, deberías completar la guía de inicio rápido, en la que habilitarás la API de GKE y aprenderás cómo funciona el producto.

Anatomía de una implementación

A continuación, se muestra un ejemplo de un archivo de manifiesto de una implementación simple. Esta implementación crea tres pods replicados con la etiqueta run=my-app que ejecutan la imagen hello-app almacenada en Artifact Registry:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-app
  template:
    metadata:
      labels:
        run: my-app
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

En este ejemplo:

  • .spec.replicas es la cantidad de pods replicados que administra la implementación.
  • .spec.template.metadata.labels es la etiqueta asignada a cada pod, que la implementación usa para administrar los pods.
  • .spec.template.spec es la especificación de pod, que define cómo debe ejecutarse cada pod. spec.containers incluye el nombre del contenedor que se ejecutará en cada pod y la imagen de contenedor que se debe ejecutar.

Para obtener más información sobre la especificación de implementación, consulta la referencia de la API de Deployment.

Crea una implementación

Crea un Deployment mediante uno de los siguientes métodos:

  • Puedes usar la característica de implementación en el menú Cargas de trabajo de la consola de Google Cloud para crear una implementación sencilla a partir de una imagen de contenedor que tengas almacenada en Artifact Registry
  • Puedes escribir un manifiesto de implementación y ejecutar kubectl apply para crear el recurso.

kubectl apply

Puedes crear y actualizar de manera declarativa implementaciones desde archivos de manifiesto mediante kubectl apply. Este método también mantiene las actualizaciones realizadas a recursos activos sin transferir los cambios a los archivos de manifiesto.

Para crear una implementación desde su archivo de manifiesto, ejecuta el siguiente comando:

kubectl apply -f DEPLOYMENT_FILE

Reemplaza DEPLOYMENT_FILE por el archivo de manifiesto, como config.yaml.

También puedes usar kubectl apply -f DIRECTORY/ a fin de crear todos los objetos (excepto los existentes) definidos en los archivos de manifiesto almacenados en un directorio.

Console

Para crear una implementación, sigue estos pasos:

  1. Ve a la página Cargas de trabajo en la consola de Google Cloud.

    Ir a Cargas de trabajo

  2. Haz clic en Implementar.

  3. En Especificar contenedor, selecciona una de las siguientes opciones:

    • Imagen de contenedor existente para elegir una imagen de contenedor disponible en Artifact Registry o DockerHub. En Ruta de acceso a la imagen, ingresa la ruta de acceso a la imagen de contenedor y la versión.

    • Imagen de contenedor nueva para usar una imagen creada con Cloud Source Repositories y Cloud Build.

  4. De manera opcional, configura la implementación con los siguientes elementos:

    • Variables de entorno para pasar al contenedor.
    • Comandos iniciales para personalizar el punto de entrada del contenedor en el entorno de ejecución.
  5. Haz clic en Listo y, luego, en Continuar.

  6. En la sección Configuración, asigna a tu implementación un Nombre de la aplicación y especifica el Espacio de nombres de Kubernetes para implementarla.

  7. De forma opcional, en Etiquetas, puedes agregar Etiquetas de Kubernetes a la implementación.

  8. Para guardar el YAML que crea esta implementación a fin deactualizarlo más tarde, haz clic en Ver YAML. Copia y pega el YAML en un archivo, luego guárdalo y haz clic en Cerrar en el cuadro de diálogo Resultado de YAML.

  9. En el menú desplegable Clúster de Kubernetes, selecciona el clúster deseado.

  10. Haz clic en Implementar.

Inspecciona la implementación

Una vez que creaste la implementación, puedes usar uno de los siguientes métodos para inspeccionarla:

kubectl

Para obtener información detallada sobre la implementación, ejecuta el siguiente comando:

kubectl describe deployment DEPLOYMENT_NAME

Reemplaza DEPLOYMENT_NAME por el nombre de la Deployment.

Para realizar una lista de los pods creados por la implementación, ejecuta el siguiente comando:

kubectl get pods -l KEY=VALUE

En este comando, la marca -l indica a kubectl que obtenga todos los pods con una etiqueta de clave-valor. Por ejemplo, si etiquetaras la implementación run: my-app, ejecutarías kubectl get pods -l run=my-app para ver los pods con esa etiqueta.

Para obtener información sobre un pod específico, usa este comando:

kubectl describe pod POD_NAME

Para ver el manifiesto de un deployment, ejecuta el siguiente comando:

kubectl get deployments DEPLOYMENT_NAME -o yaml

Este comando muestra la configuración activa del Deployment en el formato YAML.

Console

Para inspeccionar un Deployment, sigue estos pasos:

  1. Ve a la página Cargas de trabajo en la consola de Google Cloud.

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, haz clic en el nombre del Deployment que deseas inspeccionar.

  3. En la página Detalles del trabajo, realiza una de las siguientes acciones:

    • Haz clic en la pestaña Historial de revisión para ver el historial de revisión de la implementación.
    • Haz clic en la pestaña Eventos para ver todos los eventos relacionados con la implementación.
    • Haz clic en la pestaña Registros para ver los registros de actividad de contenedores en la implementación.
    • Haz clic en la pestaña YAML para ver, copiar y descargar el manifiesto de YAML de la implementación.

Actualiza el objeto Deployment

Puedes implementar actualizaciones en la especificación de pods de una implementación, como su imagen, solicitud o uso de recursos, o su configuración.

Puedes actualizar una implementación mediante los siguientes métodos:

  • Puedes usar el menú Actualización progresiva y el editor de YAML desde el menú Cargas de trabajo de la consola de Google Cloud.
  • Puedes realizar cambios en un archivo de manifiesto y aplicarlos con kubectl apply.
  • Puedes actualizar los campos image, resources o selector de la especificación de pod mediante kubectl set.
  • Puedes actualizar una implementación directamente desde tu shell o el editor que prefieras con kubectl edit.

kubectl apply

Puedes actualizar la implementación mediante la aplicación de un archivo de manifiesto nuevo o actualizado. Esto es útil para realizarle varios cambios a tu implementación, como escalarla o especificar una versión nueva de tu aplicación.

Para actualizar una implementación, ejecuta el siguiente comando:

kubectl apply -f DEPLOYMENT_FILE

Reemplaza DEPLOYMENT_FILE por el archivo de manifiesto actualizado.

El comando kubectl apply aplica un archivo de manifiesto a un recurso. Si el recurso especificado no existe, se crea con el comando.

kubectl set

Puedes usar kubectl set para cambiar los campos de imagen, recursos (solicitudes o límites) o selector de una implementación.

Para cambiar la imagen de una implementación, ejecuta el siguiente comando:

kubectl set image deployment DEPLOYMENT_NAME IMAGE IMAGE:TAG

Por ejemplo, para actualizar una implementación desde la versión 1.7.9 a la 1.9.1 de nginx, ejecuta el siguiente comando:

kubectl set image deployment nginx nginx=nginx:1.9.1

Console

Para acceder al menú Actualización progresiva de la implementación, sigue estos pasos:

  1. Ve a la página Cargas de trabajo en la consola de Google Cloud.

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, haz clic en el nombre del Deployment que deseas modificar.

  3. Haz clic en Acciones > Actualización progresiva.

  4. Configura los siguientes parámetros opcionales para la estrategia de actualización:

    • Cantidad mínima de segundos de preparación: especifica la cantidad mínima de segundos en los que un Pod recién creado debe estar listo para que se considere disponible.
    • Aumento máximo: especifica la cantidad máxima de Pods que pueden crearse sobre el número deseado de Pods. El valor puede ser un número absoluto o un porcentaje.
    • Máximo no disponible: especifica la cantidad máxima de Pods que pueden no estar disponibles durante el proceso de actualización. El valor puede ser un número absoluto o un porcentaje.
  5. En Imágenes de contenedor, ingresa la ruta de acceso a la imagen y la versión de la imagen de contenedor actualizada.

  6. Haz clic en Actualizar.

Revierte una actualización

Puedes revertir una actualización con kubectl rollout undo.

Puedes revertir una actualización en progreso o completada a su revisión anterior con este comando:

kubectl rollout undo deployment my-deployment

También puedes revertir a una revisión específica si usas este otro comando:

kubectl rollout undo deployment my-deployment --to-revision=3

Escala un objeto Deployment

Puedes realizar el ajuste de escala manual de un objeto Deployment mediante la consola de Google Cloud o kubectl scale.

Puedes obtener más información sobre cómo realizar el ajuste de escala automático de las implementaciones.

kubectl

kubectl scale puede usarse en cualquier momento para escalar el Deployment.

Para escalar una implementación de forma manual, ejecuta el siguiente comando:

kubectl scale deployment DEPLOYMENT_NAME --replicas NUMBER_OF_REPLICAS

Reemplaza NUMBER_OF_REPLICAS por la cantidad deseada de Pods replicados.

Console

Para escalar un Deployment, sigue estos pasos:

  1. Ve a la página Cargas de trabajo en la consola de Google Cloud.

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, haz clic en el nombre del Deployment que deseas modificar.

  3. Haz clic en Acciones > Escalar > Editar réplicas.

  4. Ingresa la nueva cantidad de Réplicas para el Deployment.

  5. Haz clic en Escalar.

Borra un objeto Deployment

Puedes borrar un objeto Deployment con la consola de Google Cloud o kubectl delete.

kubectl

Para borrar un Deployment, ejecuta el siguiente comando:

kubectl delete deployment DEPLOYMENT_NAME

Console

Para borrar un Deployment, sigue estos pasos:

  1. Ve a la página Cargas de trabajo en la consola de Google Cloud.

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, selecciona uno o más Deployments para borrar.

  3. Haz clic en Borrar.

  4. Cuando se te solicite confirmar, haz clic en Borrar.

¿Qué sigue?