Desplegar aplicaciones con reconocimiento del estado


En esta página se explica cómo desplegar una aplicación con estado mediante Google Kubernetes Engine (GKE).

Información general

Las aplicaciones con estado guardan datos en almacenamiento en disco persistente para que los usen el servidor, los clientes y otras aplicaciones. Un ejemplo de aplicación con estado es una base de datos o un almacén de pares clave-valor en el que otras aplicaciones guardan y recuperan datos.

El almacenamiento persistente se puede aprovisionar de forma dinámica, de modo que los volúmenes subyacentes se creen bajo demanda. En Kubernetes, puedes configurar el aprovisionamiento dinámico creando un StorageClass. En GKE, una StorageClass predeterminada te permite aprovisionar dinámicamente discos persistentes de Compute Engine.

Kubernetes usa el controlador StatefulSet para desplegar aplicaciones con reconocimiento del estado como objetos StatefulSet. Los pods de los StatefulSets no son intercambiables: cada pod tiene un identificador único que se mantiene independientemente de dónde se programe.

Las aplicaciones con estado son diferentes de las aplicaciones sin estado, en las que los datos de los clientes no se guardan en el servidor entre sesiones.

Puedes consultar más información sobre el almacenamiento persistente en clústeres multizona y regionales.

Antes de empezar

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

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.
  • Asegúrate de que tu aplicación en contenedores esté almacenada en un registro de imágenes, como Artifact Registry.

Puedes seguir la guía de inicio rápido para habilitar la API de GKE, crear un clúster y obtener más información sobre GKE.

Solicitar almacenamiento persistente en StatefulSet

Las aplicaciones pueden solicitar almacenamiento persistente con un PersistentVolumeClaim.

Normalmente, debes crear objetos PersistentVolumeClaim además de crear el pod. Sin embargo, los objetos StatefulSet incluyen una matriz volumeClaimTemplates, que genera automáticamente los objetos PersistentVolumeClaim. Cada réplica de StatefulSet obtiene su propio objeto PersistentVolumeClaim.

También puedes usar un disco preexistente en un StatefulSet.

Crear un StatefulSet

Para crear un recurso StatefulSet, usa el comando kubectl apply.

El comando kubectl apply usa archivos de manifiesto para crear, actualizar y eliminar recursos en tu clúster. Se trata de un método declarativo de configuración de objetos. Este método conserva las escrituras realizadas en objetos activos sin combinar los cambios en los archivos de configuración de objetos.

Linux

El siguiente archivo de manifiesto es un ejemplo sencillo de un StatefulSet gestionado por un servicio que se ha creado por separado:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      # Selects Pods with this label.
      app: APP_NAME
  # Headless Service for network identity.
  serviceName: "SERVICE_NAME"
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: APP_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: IMAGE
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: MOUNT_PATH
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
      annotations:
        KEY: VALUE
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Haz los cambios siguientes:

  • STATEFULSET_NAME: el nombre de StatefulSet, por ejemplo, web.
  • SERVICE_NAME: el nombre del servicio (por ejemplo, nginx).
  • APP_NAME: el nombre de la aplicación que se ejecuta en los pods. Por ejemplo, nginx.
  • CONTAINER_NAME: el nombre de los contenedores de los pods, por ejemplo, nginx.
  • IMAGE: la imagen de tu contenedor, por ejemplo, registry.k8s.io/nginx-slim:0.8.
  • PORT_NAME: el nombre del puerto abierto por StatefulSet, por ejemplo, web.
  • PVC_NAME: el nombre de PersistentVolumeClaim, por ejemplo, www.
  • MOUNT_PATH: la ruta del contenedor en la que se monta el almacenamiento. Por ejemplo, /usr/share/nginx/html.
  • KEY y VALUE: un par clave-valor de anotación que se aplica a los metadatos de PersistentVolumeClaim. Puedes usar anotaciones para adjuntar metadatos arbitrarios no identificativos a objetos que pueden recuperar clientes, como herramientas y bibliotecas. Para obtener más información, consulta Anotaciones.

En este archivo, el campo kind especifica que se debe crear un objeto StatefulSet con las especificaciones definidas en el archivo. Este StatefulSet de ejemplo genera tres pods replicados y abre el puerto 80 para exponer el StatefulSet a Internet.

Windows

Cuando se usan clústeres con grupos de nodos de Windows Server, debes crear una StorageClass, ya que la StorageClass predeterminada usa ext4 como tipo de sistema de archivos, que solo funciona con contenedores Linux. Si usas un disco persistente de Compute Engine, debes usar NTFS como tipo de almacenamiento de archivos, tal como se muestra en el siguiente ejemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  # Defines a name for this StorageClass.
  name: STORAGECLASS_NAME
parameters:
  # Specifies the type of Google Compute Engine persistent disk.
  type: pd-standard
  # Uses NTFS file system, which is crucial for Windows nodes
  fstype: NTFS
# The provisioner for Google Compute Engine persistent disks.
provisioner: kubernetes.io/gce-pd
# Specifies that the PersistentVolume will be deleted if the PersistentVolumeClaim is deleted.
reclaimPolicy: Delete
# Delays volume binding until a Pod using the PVC is scheduled.
volumeBindingMode: WaitForFirstConsumer

El siguiente manifiesto de StatefulSet usa la StorageClass definida anteriormente. Crea cuatro pares de PersistentVolume y PersistentVolumeClaim para representar cuatro discos persistentes de Compute Engine. Cada pod del StatefulSet consume un disco persistente.

Para asegurarse de que sus pods se programan correctamente en los nodos de Windows Server, debe añadir un selector de nodos a la especificación de su pod.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  replicas: 4
  selector:
    matchLabels:
      # Selects Pods with this label.
      app: APP_NAME
  template:
    metadata:
      labels:
        # Labels applied to the Pods created by the StatefulSet.
        app: APP_NAME
      name: CONTAINER_NAME
    spec:
      nodeSelector:
        # Ensures Pods are scheduled on Windows nodes.
        kubernetes.io/os: windows
      containers:
      - name: CONTAINER_NAME
        image: IMAGE
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: MOUNT_PATH
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
    spec:
      # Specifies the StorageClass to use, which is crucial for Windows nodes.
      storageClassName: STORAGECLASS_NAME
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Haz los cambios siguientes:

  • STATEFULSET_NAME: el nombre de StatefulSet, por ejemplo, web-windows.
  • APP_NAME: el nombre de la aplicación que se ejecuta en los pods. Por ejemplo, iis.
  • CONTAINER_NAME: el nombre de los contenedores de los pods, por ejemplo, iis.
  • IMAGE: la imagen de tu contenedor, por ejemplo, mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019.
  • PORT_NAME: el nombre del puerto abierto por StatefulSet, por ejemplo, http.
  • PVC_NAME: el nombre de PersistentVolumeClaim, por ejemplo, iis-state.
  • MOUNT_PATH: la ruta del contenedor en la que se monta el almacenamiento. Por ejemplo, C:\mnt\state.
  • STORAGECLASS_NAME: el nombre de StorageClass (por ejemplo, my-storage-class).

Para crear un recurso StatefulSet, ejecuta el siguiente comando y sustituye STATEFULSET_FILE por el nombre del archivo de manifiesto:

kubectl apply -f STATEFULSET_FILE

También puedes usar kubectl apply -f DIRECTORY/ para crear todos los objetos (excepto los que ya existen) definidos en los archivos de configuración almacenados en un directorio.

Inspeccionar un objeto StatefulSet

kubectl

Si deseas inspeccionar StatefulSet, ejecuta el siguiente comando:

kubectl get statefulset STATEFULSET_NAME -o yaml

Este comando muestra la configuración activa del recurso StatefulSet en formato YAML.

Si quieres enumerar los pods creados por StatefulSet, ejecuta el siguiente comando:

kubectl get pods -l app=APP_NAME

En este comando, la marca -l indica a kubectl que obtenga todos los pods etiquetados para APP_NAME.

El resultado debería ser similar al siguiente:

NAME                                READY     STATUS    RESTARTS   AGE
pod-name                            1/1       Running   0          1m
pod-name                            1/1       Running   0          1m

Si quieres obtener información detallada sobre StatefulSet, ejecuta el siguiente comando:

kubectl describe statefulset STATEFULSET_NAME

Para obtener información sobre un pod específico, ejecuta el siguiente comando:

kubectl describe pod POD_NAME

Para enumerar los objetos PersistentVolumeClaim que se han creado, ejecuta el siguiente comando:

kubectl get pvc

El resultado debería ser similar al siguiente:

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
STATEFULSET_NAME-PVC_NAME-0     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-1     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-2     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

Para obtener información sobre un PersistentVolumeClaim específico, ejecuta el siguiente comando:

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

Para obtener información sobre un PersistentVolume específico, ejecuta el siguiente comando:

kubectl describe pv PV_NAME

Consola

Si quieres inspeccionar un StatefulSet, lleva a cabo los siguientes pasos:

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

    Ve a Cargas de trabajo.

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

  3. En la página Detalles del conjunto con estado, haz lo siguiente:

    • Haz clic en la pestaña Historial de revisiones para ver el historial de revisiones de StatefulSet.
    • Haga clic en la pestaña Eventos para ver todos los eventos relacionados con el StatefulSet.
    • Haz clic en la pestaña Registros para ver los registros del contenedor del StatefulSet.
    • Haga clic en la pestaña YAML para ver, copiar o descargar el archivo YAML de configuración de StatefulSet.

Actualizar un StatefulSet

Hay varias formas de actualizar objetos StatefulSet. El método declarativo habitual es kubectl apply. Para actualizar el StatefulSet directamente desde tu shell o en un editor que prefieras, puedes usar kubectl edit. También puedes usar el editor de YAML desde el menú Cargas de trabajo de GKE en la Google Cloud consola.

Puedes implementar actualizaciones en la especificación de los pods de un recurso StatefulSet, como su imagen, el uso o las solicitudes de recursos o la configuración.

kubectl apply

Puedes actualizar StatefulSet si aplicas un archivo de manifiesto nuevo o actualizado. Esto es útil para hacer varios cambios en tu StatefulSet, como al escalar o especificar una nueva versión de tu aplicación.

Si quieres actualizar un objeto StatefulSet, ejecuta el siguiente comando:

kubectl apply -f STATEFULSET_FILE

Sustituye STATEFULSET_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, lo crea el comando.

Para obtener más información sobre kubectl apply, consulta la documentación de referencia de kubectl.

Consola

Si quieres editar la configuración activa de un objeto StatefulSet, sigue estos pasos:

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

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haga clic en el nombre del StatefulSet que quiera modificar.

  3. Haz clic en Editar.

  4. Cambia el archivo YAML de configuración como quieras.

  5. Haz clic en Guardar.

Inspeccionar el despliegue de la actualización

Para inspeccionar el lanzamiento de StatefulSet, ejecuta el siguiente comando:

kubectl rollout status statefulset STATEFULSET_NAME

Para ver el historial de despliegue de StatefulSet, ejecuta el siguiente comando:

kubectl rollout history statefulset STATEFULSET_NAME

Para deshacer un lanzamiento, ejecuta el siguiente comando:

kubectl rollout undo statefulset STATEFULSET_NAME

Actualizar estrategias

El campo updateStrategy de StatefulSet te permite configurar y inhabilitar las actualizaciones continuas automatizadas de contenedores, etiquetas, solicitudes de recursos, límites y anotaciones de los pods de un StatefulSet.

Puede consultar más información sobre las estrategias de actualización de StatefulSets en la documentación de Kubernetes.

Escalar un objeto StatefulSet

kubectl

El comando kubectl scale se puede usar en cualquier momento para escalar tu StatefulSet.

Si quieres escalar manualmente un objeto StatefulSet, ejecuta el siguiente comando:

kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS

Sustituye NUMBER_OF_REPLICAS por el número de pods replicados que quieras.

Consola

Si quieres escalar un objeto StatefulSet, sigue estos pasos:

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

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, haga clic en el nombre del StatefulSet que quiera modificar.

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

  4. Introduce el nuevo número de Réplicas del StatefulSet.

  5. Haz clic en Escalar.

Eliminar un objeto StatefulSet

kubectl

Si quieres eliminar un objeto StatefulSet, ejecuta el siguiente comando:

kubectl delete statefulset STATEFULSET_NAME

Consola

Si quieres eliminar un objeto StatefulSet, sigue estos pasos:

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

    Ve a Cargas de trabajo.

  2. En la lista de cargas de trabajo, selecciona uno o varios StatefulSets que quieras eliminar.

  3. Haz clic en Eliminar.

  4. Cuando se te pida que confirmes la acción, haz clic en Eliminar.

Siguientes pasos