StatefulSet

En esta página, se describen los objetos StatefulSet de Kubernetes y su uso en Google Kubernetes Engine (GKE). También puedes obtener información sobre cómo implementar una aplicación con estado.

Descripción general

Los objetos StatefulSet representan un conjunto de pods con identidades exclusivas y persistentes, y con nombres de host estables que GKE conserva sin importar el lugar donde estén programados. La información de estado y otros datos resilientes de cualquier pod del StatefulSet se conservan en el almacenamiento del disco persistente que está asociado al StatefulSet.

Los StatefulSets usan un índice ordinal para la identidad y organización de sus pods. De forma predeterminada, los pods del StatefulSet se implementan en orden secuencial y finalizan en orden del tipo ordinal inverso. Por ejemplo, un StatefulSet denominado web tiene sus propios pods llamados web-0, web-1 y web-2. Cuando se cambia la especificación del pod web, sus pods se detienen con facilidad y se vuelven a crear de forma ordenada. En este ejemplo, web-2 finaliza primero, luego web-1 y así de forma sucesiva. Como alternativa, puedes especificar el campo podManagementPolicy: Parallel para que StatefulSet inicie o finalice todos sus pods en paralelo, en lugar de esperar a que los pods estén en ejecución y listos o que finalicen antes de iniciar o finalizar otro pod.

Los StatefulSets usan una plantilla de pod que contiene una especificación para sus pods. La especificación del pod determina cómo debe verse cada pod: qué aplicaciones debe ejecutar en sus contenedores, qué volúmenes debe activar, sus etiquetas y selectores, y demás.

Patrones de uso

Los StatefulSets están diseñados para implementar aplicaciones con estado y aplicaciones agrupadas en clústeres que guardan datos en almacenamiento continuo, como los discos persistentes de Compute Engine. Estos objetos resultan adecuados para implementar Kafka, MySQL, Redis, ZooKeeper y otras aplicaciones que necesitan identidades exclusivas y persistentes, así como nombres de host estables. Para las aplicaciones sin estado, debes usar objetos Deployment.

Crea StatefulSets

Puedes crear un StatefulSet con kubectl apply.

Una vez creado, el StatefulSet se asegura de que la cantidad deseada de pods esté en ejecución y disponible en todo momento. El StatefulSet reemplaza de forma automática los pods que fallan o que son expulsados de sus nodos, y asocia de manera automática nuevos pods con los recursos de almacenamiento, las solicitudes y límites de recursos y otras opciones de configuración definidas en la especificación del pod del StatefulSet.

El siguiente es un ejemplo de un archivo de manifiesto de Service y StatefulSet:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # Label selector that determines which Pods belong to the StatefulSet
                 # Must match spec: template: metadata: labels
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx # Pod template's label selector
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

En este ejemplo se dan las situaciones siguientes:

  • Se crea un objeto Service llamado nginx, indicado por el campo metadata: name. El Service se orienta a una app llamada nginx, indicada por labels: app: nginx y selector: app: nginx. El Service expone el puerto 80 y le otorga el nombre web. Este Service controla el dominio de red y dirige el tráfico de Internet a la aplicación en contenedores que StatefulSet implementa.
  • Se crea un StatefulSet llamado web con tres pods replicados (replicas: 3).
  • La plantilla de pod (spec: template) indica que los pods se etiquetan como app: nginx.
  • La especificación del pod (template: spec) indica que los pods de StatefulSet ejecutan un contenedor, nginx, que ejecuta la imagen nginx-slim en la versión 0.8. La imagen del contenedor se aloja en Container Registry.
  • La especificación del pod usa el puerto web que abrió el servicio.
  • template: spec: volumeMounts especifica un mountPath, que se denomina www. mountPath es la ruta dentro del contenedor en la que se debe activar un volumen de almacenamiento.
  • StatefulSet aprovisiona un PersistentVolumeClaim, www, con 1 GB de almacenamiento proporcionado.

A modo de resumen, la especificación del pod contiene las instrucciones siguientes:

  • Etiqueta cada Pod como app: nginx.
  • En cada Pod, ejecuta un contenedor llamado nginx.
  • Ejecuta la imagen nginx-slim en la versión 0.8.
  • Haz que los Pods usen el puerto 80.
  • Guarda los datos en la ruta de activación.

Para obtener más información sobre las opciones de configuración del StatefulSet, consulta la referencia de la API de StatefulSet.

Actualiza StatefulSets

Puedes actualizar un StatefulSet si aplicas cambios en la especificación de su pod, que incluye sus volúmenes y sus imágenes de contenedor. También puedes actualizar los límites y solicitudes de recursos del objeto, las etiquetas y las anotaciones. Para actualizar un StatefulSet, puedes usar kubectl, la API de Kubernetes o el menú GKE Workloads en Google Cloud Console.

Para decidir cómo controlar las actualizaciones, los StatefulSets usan una estrategia de actualización definida en spec: updateStrategy. Hay dos estrategias, OnDelete y RollingUpdate:

  • OnDelete no borra ni vuelve a crear de forma automática los pods cuando se cambia la configuración del objeto. En su lugar, debes borrar de forma manual los pods antiguos para que el controlador cree pods actualizados.
  • RollingUpdate borra y vuelve a crear los pods de forma automática cuando se cambia la configuración del objeto. Los pods nuevos deben estar en ejecución y listos antes de que se borren sus antecesores. Con esta estrategia, cambiar la especificación del pod activa de forma automática una actualización. Esta es la estrategia de actualización predeterminada para los StatefulSets.

Los StatefulSets actualizan los pods en orden del tipo ordinal inverso. Puedes supervisar las actualizaciones de lanzamiento si ejecutas el siguiente comando:

kubectl rollout status statefulset statefulset-name

Realiza una partición de las actualizaciones progresivas

Puedes realizar particiones de las actualizaciones progresivas. Hacer particiones es útil si quieres programar una actualización, actualizar un Canary o realizar una actualización por fases.

Cuando haces una partición de una actualización, se actualizan todos los pods con un ordinal mayor o igual al valor de partición cuando actualizas la especificación del pod del StatefulSet. Los pods con un ordinal menor al valor de partición no se actualizan y, aun si se borran, se vuelven a crear según la versión anterior de la especificación. Si el valor de partición es mayor que el número de réplicas, las actualizaciones no se propagan a los pods.

Próximos pasos