Implementa una aplicación con estado

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

Descripción general

Las aplicaciones con estado guardan datos en el almacenamiento de discos persistentes 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 clave-valor en el que otras aplicaciones guardan y recuperan datos.

El almacenamiento continuo se puede aprovisionar de forma dinámica, por lo que los volúmenes subyacentes se crean a pedido. En Kubernetes, configuras el aprovisionamiento dinámico mediante la creación de una StorageClass. En GKE, una StorageClass predeterminada te permite aprovisionar de forma dinámica los discos persistentes de Compute Engine.

Kubernetes usa el controlador StatefulSet para implementar aplicaciones con estado como objetos de StatefulSet. Los pods de StatefulSets no son intercambiables: cada uno usa un identificador único que se conserva más allá de dónde se programe.

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

Puedes obtener más información sobre el almacenamiento continuo en clústeres multizonales y regionales.

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 el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.
  • Asegúrate de que tu aplicación en contenedores se almacene en un registro de imagen, 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.

Solicita almacenamiento continuo en StatefulSet

Las aplicaciones pueden solicitar almacenamiento continuo con un objeto PersistentVolumeClaim.

Por lo general, debes crear objetos PersistentVolumeClaim además de crear el Pod. Sin embargo, los objetos StatefulSet incluyen un arreglo volumeClaimTemplates, que genera de forma automática los objetos PersistentVolumeClaim. Cada réplica de StatefulSet recibe su propio objeto PersistentVolumeClaim.

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

Crea un StatefulSet

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

El comando kubectl apply usa archivos de manifiesto para crear, actualizar y borrar recursos en tu clúster. Este es un método declarativo de configuración de objetos. Con este método, se retienen las escrituras realizadas en objetos activos sin combinar los cambios en los archivos de configuración del objeto.

Linux

El siguiente archivo de manifiesto es un ejemplo simple de un StatefulSet regido por un Service que se creó 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

Reemplaza lo siguiente:

  • STATEFULSET_NAME: Es el nombre del objeto StatefulSet, por ejemplo, web.
  • SERVICE_NAME: Es 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 en los Pods, por ejemplo, nginx
  • IMAGE: Tu imagen de contenedor, por ejemplo, registry.k8s.io/nginx-slim:0.8
  • PORT_NAME: El nombre del puerto que abrió el StatefulSet, por ejemplo, web.
  • PVC_NAME: Es el nombre del PersistentVolumeClaim, por ejemplo, www.
  • MOUNT_PATH: Es la ruta de acceso en el contenedor en la que se une el almacenamiento, por ejemplo, /usr/share/nginx/html.
  • KEY y VALUE: Son un par clave-valor de anotación que se aplicará a los metadatos de PersistentVolumeClaim. Puedes usar anotaciones para adjuntar metadatos arbitrarios que no identifiquen objetos que los clientes, como herramientas y bibliotecas, pueden recuperar. 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. En este ejemplo, StatefulSet genera tres pods replicados y abre el puerto 80 para exponer StatefulSet en Internet.

Windows

Cuando usas clústeres con grupos de nodos de Windows Server, debes crear un StorageClass, ya que el predeterminado usa ext4 como tipo de sistema de archivos, que solo funciona para contenedores de Linux. Si usas un disco persistente de Compute Engine, debes usar NTFS como el tipo de almacenamiento de archivos, 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 el StorageClass que definiste con anterioridad. Crea cuatro pares de PersistentVolume y PersistentVolumeClaim para representar cuatro discos persistentes de Compute Engine. Cada pod en StatefulSet consume un disco persistente.

Para asegurarte de que los pods se programen de forma correcta en los nodos de Windows Server, debes agregar un selector de nodos a tu especificación de pods:

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

Reemplaza lo siguiente:

  • STATEFULSET_NAME: Es el nombre del objeto 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 en los Pods, por ejemplo, iis
  • IMAGE: Tu imagen de contenedor, por ejemplo, mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
  • PORT_NAME: El nombre del puerto que abrió el StatefulSet, por ejemplo, http.
  • PVC_NAME: Es el nombre del PersistentVolumeClaim, por ejemplo, iis-state.
  • MOUNT_PATH: Es la ruta de acceso en el contenedor en la que se une el almacenamiento, por ejemplo, C:\mnt\state.
  • STORAGECLASS_NAME: Es el nombre de la StorageClass, por ejemplo, my-storage-class.

Para crear un recurso StatefulSet, ejecuta el siguiente comando y reemplaza 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 existentes) definidos en los archivos de configuración almacenados en un directorio.

Inspecciona un StatefulSet

kubectl

Para 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.

Para enumerar los pods creados con StatefulSet, ejecuta el siguiente comando:

kubectl get pods -l app=APP_NAME

En este comando, la marca -l le indica a kubectl que etiquete todos los Pods con APP_NAME.

El resultado es similar al siguiente:

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

Para 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 crearon, ejecuta el siguiente comando:

kubectl get pvc

El resultado es 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 PersistentVolume en específico, ejecuta el siguiente comando:

kubectl describe pv PV_NAME

Console

A fin de inspeccionar StatefulSet, sigue estos pasos:

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

    Ir a Cargas de trabajo

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

  3. En la página Detalles de conjuntos con estado, realiza una de las siguientes acciones:

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

Actualizar StatefulSet

Existen varias formas de actualizar StatefulSets. El método declarativo común es kubectl apply. Para actualizar StatefulSet directo desde tu shell o en un editor preferido, 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 pods para un recurso StatefulSet, como su imagen, solicitud o uso de recursos, o configuración.

kubectl apply

Para actualizar StatefulSet, puedes aplicar un archivo de manifiesto nuevo o actualizado. Esto es útil para aplicar varios cambios en StatefulSet, como cuando escalas o quieres especificar una versión nueva de tu aplicación.

Para actualizar StatefulSet, ejecuta el comando siguiente:

kubectl apply -f STATEFULSET_FILE

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

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

Console

Para editar la configuración activa de StatefulSet, sigue estos pasos:

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

    Ir a Cargas de trabajo

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

  3. Haz clic en  Editar.

  4. Cambia la configuración YAML como desees.

  5. Haz clic en Guardar.

Inspecciona el lanzamiento de actualizaciones

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

kubectl rollout status statefulset STATEFULSET_NAME

Para ver el historial de lanzamiento 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

Actualiza estrategias

El campo updateStrategy de StatefulSet te permite configurar y, además, inhabilitar las actualizaciones progresivas automatizadas para contenedores, etiquetas, límites o solicitudes de recursos y anotaciones destinadas a los pods en un StatefulSet.

Puedes obtener más información sobre las estrategias de actualización para StatefulSets en la documentación de Kubernetes.

Escala StatefulSet

kubectl

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

Para escalar manualmente un StatefulSet, ejecuta el siguiente comando:

kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS

Reemplaza NUMBER_OF_REPLICAS por la cantidad deseada de Pods replicados.

Console

Para escalar StatefulSet, sigue estos pasos:

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

    Ir a Cargas de trabajo

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

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

  4. Ingresa la cantidad nueva de Réplicas para StatefulSet.

  5. Haz clic en Escalar.

Borrar StatefulSet

kubectl

Para borrar StatefulSet, ejecuta el siguiente comando:

kubectl delete statefulset STATEFULSET_NAME

Console

Para borrar un StatefulSet, sigue estos pasos:

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

    Ir a Cargas de trabajo

  2. En la lista de cargas de trabajo, selecciona uno o más StatefulSets que deseas borrar.

  3. Haz clic en Borrar.

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

¿Qué sigue?