Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2024-09-10 GMT+08:00

Creación de un StatefulSet

Escenario

StatefulSets es un tipo de cargas de trabajo cuyos datos o estado se almacenan mientras se ejecutan. Por ejemplo, MySQL es un StatefulSet porque necesita almacenar nuevos datos.

Un contenedor se puede migrar entre diferentes hosts, pero los datos no se almacenan en los hosts. Para almacenar datos de StatefulSet de forma persistente, conecte los volúmenes de almacenamiento de HA proporcionados por CCE a contenedor.

Restricciones

  • Al eliminar o ajustar un StatefulSet, el sistema no elimina los volúmenes de almacenamiento asociados con el StatefulSet para garantizar la seguridad de los datos.
  • Cuando elimine un StatefulSet, reduzca el número de réplicas a 0 antes de eliminar el StatefulSet para que los pods del StatefulSet se puedan detener en orden.
  • Cuando crea un StatefulSet, se requiere un Service sin cabeza para acceder a pods. Para obtener más información, véase Headless Service.
  • Cuando un nodo no está disponible, los pods se convierten en Unready. En este caso, debe eliminar manualmente los pods del StatefulSet para que los pods se puedan migrar a un nodo normal.

Requisitos previos

  • Antes de crear una carga de trabajo, debe tener un clúster disponible. Para obtener más información sobre cómo crear un clúster, consulte Compra de un clúster de CCE.
  • Para habilitar el acceso público a una carga de trabajo, asegúrese de que una EIP o un balanceador de carga se ha vinculado a al menos un nodo del clúster.

    Si un pod tiene contenedores múltiples, asegúrese de que los puertos utilizados por los contenedores no entren en conflicto entre sí. De lo contrario, la creación del StatefulSet fallará.

Uso de la consola de CCE

  1. Inicie sesión en la consola de CCE.
  2. Haga clic en el nombre del clúster para ir a la consola del clúster, elija Workloads en el panel de navegación y haga clic en Create Workload en la esquina superior derecha.
  3. Establezca información básica sobre la carga de trabajo.

    Informaciones básicas
    • Workload Type: Seleccione StatefulSet. Para obtener más información sobre los tipos de carga de trabajo, consulte Overview.
    • Workload Name: Introduzca el nombre de la carga de trabajo. Escriba de 1 a 52 caracteres que comiencen con una letra minúscula y terminen con una letra o un dígito. Solo se permiten letras minúsculas, dígitos y guiones (-).
    • Namespace: Seleccione el espacio de nombres de la carga de trabajo. El valor predeterminado es default. También puede hacer clic en Create Namespace para crear uno. Para obtener más información, véase Creación de un espacio de nombres.
    • Pods: Ingrese el número de pods.
    • Time Zone Synchronization: Especifique si desea habilitar la sincronización de zona horaria. Una vez activada la sincronización de zona horaria, el contenedor y el nodo utilizan la misma zona horaria. La función de sincronización de zona horaria depende del disco local montado en el contenedor. No modifique ni elimine la zona horaria. Para obtener más información, véase Configuración de la sincronización de zona horaria.
    Configuración del contenedor
    • Información del contenedor
      Se pueden configurar múltiples contenedores en un pod. Puede hacer clic en Add Container a la derecha para configurar varios contenedores para el pod.
    • Image Access Credential: Seleccione la credencial utilizada para acceder al repositorio de imágenes. El valor predeterminado es default-secret. Puede usar default-secret para acceder a las imágenes en SWR. Para obtener más información acerca de default-secret, consulte default-secret.
    • GPU graphics card: All está seleccionado de forma predeterminada. La instancia de carga de trabajo se programará en el nodo con el tipo de tarjeta gráfica de GPU especificado.

    Parámetros de Service sin cabeza

    Un Service sin cabeza se utiliza para resolver el problema de acceso mutuo entre pods en un StatefulSet. El Service sin cabeza proporciona un nombre de dominio de acceso fijo para cada pod. Para obtener más información, véase Headless Service.

    Configuración de servicio

    Se utiliza un Service para el acceso a pods. Con una dirección IP fija, un Service reenvía el tráfico de acceso a los pods y realiza el balanceo de carga para estos pods.

    También puede crear un Service después de crear una carga de trabajo. Para obtener más información sobre el Service, consulte Descripción general.

    Configuración avanzada

  4. Haga clic en Create Workload en la esquina inferior derecha.

Uso de kubectl

En este ejemplo, se utiliza una carga de trabajo nginx y el volumen de EVS se monta dinámicamente en él utilizando el campo volumeClaimTemplates.

  1. Utilice kubectl para conectarse al clúster. Para obtener más información, véase Conexión a un clúster con kubectl.
  2. Cree y edite el archivo nginx-statefulset.yaml.

    nginx-statefulset.yaml es un nombre de archivo de ejemplo, y puede cambiarlo según sea necesario.

    vi nginx-statefulset.yaml

    A continuación se proporciona un ejemplo del contenido del archivo. Para obtener más información sobre StatefulSet, consulte la documentación de Kubernetes.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: container-1
              image: nginx:latest
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  cpu: 250m
                  memory: 512Mi
                limits:
                  cpu: 250m
                  memory: 512Mi
              volumeMounts:
                - name: test
                  readOnly: false
                  mountPath: /usr/share/nginx/html
                  subPath: ''
          imagePullSecrets:
            - name: default-secret
          dnsPolicy: ClusterFirst
          volumes: []
      serviceName: nginx-svc
      replicas: 2
      volumeClaimTemplates:  # Dynamically mounts the EVS volume to the workload.
        - apiVersion: v1
          kind: PersistentVolumeClaim
          metadata:
            name: test
            namespace: default
            annotations:
              everest.io/disk-volume-type: SAS  # SAS EVS volume type.
            labels:
              failure-domain.beta.kubernetes.io/region: ap-southeast-1  # region where the EVS volume is created.
              failure-domain.beta.kubernetes.io/zone: ap-southeast-1   # AZ where the EVS volume is created. It must be the same as the AZ of the node.
          spec:
            accessModes:
              - ReadWriteOnce  # The value must be ReadWriteOnce for the EVS volume.
            resources:
              requests:
                storage: 10Gi
            storageClassName: csi-disk # Storage class name. The value is csi-disk for the EVS volume.
      updateStrategy:
        type: RollingUpdate

    vi nginx-headless.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
      namespace: default
      labels:
        app: nginx
    spec:
      selector:
        app: nginx
        version: v1
      clusterIP: None
      ports:
        - name: nginx
          targetPort: 80
          nodePort: 0
          port: 80
          protocol: TCP
      type: ClusterIP

  3. Cree una carga de trabajo y el servicio sin cabeza correspondiente.

    kubectl create -f nginx-statefulset.yaml

    Si se muestra la siguiente información, el StatefulSet se ha creado correctamente.

    statefulset.apps/nginx created

    kubectl create -f nginx-headless.yaml

    Si se muestra la siguiente información, el servicio sin cabeza se ha creado correctamente.

    service/nginx-svc created

  4. Si se accede a la carga de trabajo con un Service de ClusterIP o de NodePort, establezca el tipo de acceso de la carga de trabajo correspondiente. Para obtener más información, véase Red.