Crea cargas de trabajo con estado

En este documento, se explica cómo crear y administrar cargas de trabajo con estado dentro de un clúster de Kubernetes aislado de Google Distributed Cloud (GDC). Las cargas de trabajo con estado te permiten escalar la implementación de tu aplicación con almacenamiento persistente. El almacenamiento persistente proporciona a tu aplicación identidades coherentes y nombres de host estables, sin importar dónde estén programadas sus cargas de trabajo.

Este documento está destinado a los desarrolladores del grupo de operadores de aplicaciones, que son responsables de crear cargas de trabajo de aplicaciones para su organización. Para obtener más información, consulta Públicos de la documentación de GDC aislado.

Antes de comenzar

Para completar las tareas de este documento, debes solicitar los permisos necesarios y preparar tu entorno.

Solicita roles de IAM

Debes tener roles específicos para obtener los permisos que necesitas para crear cargas de trabajo con estado. Los roles que necesitas dependen de si trabajas dentro de un clúster compartido con alcance de la organización o un clúster estándar con alcance del proyecto. Para obtener más información, consulta Configuraciones del clúster de Kubernetes.

Roles del clúster compartido

Para crear, borrar, editar o ver cargas de trabajo con estado en un clúster compartido, pídele al administrador de IAM del proyecto que te otorgue el rol de Administrador del espacio de nombres (namespace-admin). Este rol está vinculado al espacio de nombres de tu proyecto.

Roles del clúster estándar

Para crear, borrar, editar o ver cargas de trabajo con estado en un clúster estándar, pídele al administrador de IAM del proyecto que te otorgue el rol de Desarrollador del clúster (cluster-developer). Este rol está vinculado al espacio de nombres de tu proyecto.

Prepara el entorno

Para ejecutar comandos en un clúster de Kubernetes con la API, asegúrate de tener los siguientes recursos:

  • Ubica el nombre del clúster de Kubernetes o pregúntale a un miembro del grupo de administradores de la plataforma cuál es el nombre del clúster.

  • Accede y genera el archivo kubeconfig para el clúster de Kubernetes.

  • Usa la ruta de kubeconfig del clúster de Kubernetes para reemplazar KUBERNETES_CLUSTER_KUBECONFIG en estas instrucciones.

Crea un recurso StatefulSet

Para crear un objeto StatefulSet, escribe un manifiesto StatefulSet y ejecuta kubectl apply para crear el recurso. Para proporcionar una forma estable para que los clientes envíen solicitudes a los pods de tu recurso StatefulSet, también debes crear un objeto Service.

El comando kubectl apply usa archivos de manifiesto para crear, actualizar y borrar recursos en tu clúster de Kubernetes. 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.

Para crear un recurso StatefulSet y Service, ejecuta lo siguiente:

kubectl --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG -n NAMESPACE \
    apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: SERVICE_NAME
  labels:
    app: APP_NAME
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      app: APP_LABEL_NAME
  serviceName: "SERVICE_NAME"
  replicas: NUMBER_OF_REPLICAS
  template:
    metadata:
      labels:
        app: APP_LABEL_NAME
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: CONTAINER_NAME
        image: CONTAINER_IMAGE
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: CONTAINER_STORAGE_VOLUME_PATH
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
EOF

Reemplaza lo siguiente:

  • KUBERNETES_CLUSTER_KUBECONFIG: El archivo kubeconfig para el clúster en el que implementas cargas de trabajo de contenedor.

  • NAMESPACE: El espacio de nombres en el que se implementarán las cargas de trabajo de contenedor. Para los clústeres compartidos, debe ser un espacio de nombres del proyecto. Para los clústeres estándar, puede ser cualquier espacio de nombres.

  • SERVICE_NAME: El nombre del objeto Service. Asegúrate de que el objeto StatefulSet también establezca el objeto Service en su serviceName.

  • APP_NAME: El nombre de la aplicación que se ejecutará dentro de la implementación.

  • APP_LABEL_NAME: El selector de etiquetas que determina qué pods pertenecen al objeto StatefulSet.

  • STATEFULSET_NAME: El nombre del objeto StatefulSet.

  • NUMBER_OF_REPLICAS: La cantidad de objetos Pod replicados que administra la implementación.

  • CONTAINER_NAME: El nombre del contenedor.

  • CONTAINER_IMAGE: El nombre de la imagen de contenedor. Debes incluir la ruta de acceso al registro de contenedores y la versión de la imagen, como REGISTRY_PATH/nginx:1.23. Para obtener más información sobre cómo configurar la ruta de acceso al registro de contenedores, consulta la descripción general del servicio de Harbor administrado.

  • CONTAINER_STORAGE_VOLUME_PATH: La ruta de acceso dentro del contenedor en la que se activa un volumen de almacenamiento.

Como ejemplo, el siguiente objeto StatefulSet y el objeto Service correspondiente crean cargas de trabajo de contenedor con estado:

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
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: REGISTRY_PATH/nginx:1.23
        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 Service llamado nginx, indicado por el campo metadata: name. El objeto Service apunta a una app llamada nginx, indicada por labels.app: nginx y selector.app: nginx. El objeto Service expone el puerto 80 y lo denomina web. Este objeto Service controla el dominio de red y dirige el tráfico de Internet a la aplicación en contenedores que implementa el objeto StatefulSet.
  • Se crea un StatefulSet llamado web con tres objetos Pod replicados, como se establece en el campo replicas: 3.
  • La plantilla Pod, establecida por la sección .spec.template, indica que sus objetos Pod están etiquetados como app: nginx.
  • La especificación Pod, establecida por la sección .template.spec, indica que los pods de StatefulSet ejecutan un contenedor, nginx, que ejecuta la imagen nginx en la versión 1.23.
  • La especificación Pod usa el puerto web que abrió el objeto Service.
  • La sección .template.spec.volumeMounts especifica un campo mountPath, que se denomina www. mountPath es la ruta de acceso en el contenedor donde se activa un volumen de almacenamiento.
  • StatefulSet aprovisiona tres objetos PersistentVolumeClaim, llamados web-www-0, web-www-1 y web-www-2, con 1 GB de almacenamiento aprovisionado cada uno.

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

Solicita almacenamiento persistente en un recurso StatefulSet

El almacenamiento persistente se puede aprovisionar de forma dinámica, por lo que los volúmenes subyacentes se crean a pedido. Las aplicaciones pueden solicitar almacenamiento persistente con un objeto PersistentVolumeClaim.

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

Para obtener más información, consulta Configura el almacenamiento de contenedores.

¿Qué sigue?