StatefulSet

En esta página, se describen objetos StatefulSet de Kubernetes y su uso en Google Kubernetes Engine.

¿Qué es un StatefulSet?

Los StatefulSets representan un conjunto de [Pods] con identidades únicas y persistentes, y nombres de host estables que GKE mantiene sin importar el lugar donde están programados. La información de estado y otros datos resistentes de cualquier pod del StatefulSet se mantiene en el almacenamiento del disco persistente asociado con el 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 se finalizan en orden del tipo ordinal inverso. Por ejemplo, un StatefulSet llamado web tiene sus pods llamados web-0, web-1 y web-2. Cuando se cambia la especificación del pod web, los pods se detienen con facilidad y se vuelven a crear de forma ordenada. En este ejemplo, web-2 se finaliza primero, luego web-1, y así de forma sucesiva. De forma opcional, puedes especificar el campo podManagementPolicy: Parallel para que el StatefulSet inicie o finalice todos sus pods en paralelo, en lugar de esperar a que los pods estén listos y en ejecución o se 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 Google Compute Engine. Los StatefulSets son adecuados para implementar Kafka, MySQL, Redis, ZooKeeper y otras aplicaciones que requieren identidades únicas y persistentes además de nombres de host estables. Para las aplicaciones sin estado, usa Implementaciones.

Crea StatefulSets

Puedes crear un StatefulSet mediante 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 servicio 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: gcr.io/google_containers/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 crea un objeto de servicio llamado nginx, indicado por el campo metadata: name. El servicio tiene como objetivo una app llamada nginx, indicada por labels: app: nginx y selector: app: nginx. El servicio expone el puerto 80 y lo llama web. Este servicio controla el dominio de red para dirigir el tráfico de Internet a la aplicación en contenedores que fue implementada por el StatefulSet.
  • Un StatefulSet llamado web se crea con tres pods replicados (replicas: 3).
  • La plantilla de pod (spec: template) indica que sus pods se etiquetan como app: nginx.
  • La especificación del pod (template: spec) indica que los pods del 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 abierto por el servicio.
  • template: spec: volumeMounts especifica un mountPath, que se llama www. mountPath es la ruta dentro del contenedor en la que se debe activar un volumen de almacenamiento.
  • El StatefulSet aprovisiona un PersistentVolumeClaim, www, con 1 GB de almacenamiento proporcionado.

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

  • Etiquetar 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 los StatefulSets

Puedes actualizar un StatefulSet si haces 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ú de cargas de trabajo de GKE en Google Cloud Platform Console.

Para decidir cómo administrar las actualizaciones, StatefulSets usa una estrategia de actualización definida en spec: updateStrategy. Existen dos estrategias, OnDelete y RollingUpdate:

  • OnDelete no borra y vuelve a crear los pods de forma automática cuando cambia la configuración del objeto. En cambio, debes borrar de forma manual los pods anteriores para que el controlador cree pods actualizados.
  • RollingUpdate borra y vuelve a crear los pods de forma automática cuando cambia la configuración del objeto. Los pods nuevos deben estar listos y en ejecución antes de que se borren sus antecesores. Con esta estrategia, cambiar la especificación del pod activa de forma automática un lanzamiento. 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.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...