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
- Inicie sesión en la consola de CCE.
- 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.
- 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.
- Basic Info: Véase Configuración de información básica del contenedor.
- Lifecycle: Véase Setting Container Lifecycle Parameters.
- Health Check: Véase Configuración de la comprobación de estado de un contenedor.
- Environment Variables: Véase Setting an Environment Variable.
- Data Storage: Véase Almacenamiento de contenedores.
- StatefulSets admite los volúmenes de EVS aprovisionados dinámicamente.
El montaje dinámico se consigue utilizando el campo volumeClaimTemplates y depende de la capacidad de creación dinámica de StorageClass. Un StatefulSet asocia cada pod con un PVC usando el campo volumeClaimTemplates y el PVC está unido al PV correspondiente. Por lo tanto, después de reprogramar el pod, los datos originales todavía se pueden montar basándose en el nombre de PVC.
- Después de crear una carga de trabajo, el almacenamiento que se monta dinámicamente no se puede actualizar.
- StatefulSets admite los volúmenes de EVS aprovisionados dinámicamente.
- Security Context: Establezca permisos de contenedor para proteger el sistema y otros contenedores de ser afectados. Introduzca el ID de usuario para establecer los permisos de contenedor y evitar que los sistemas y otros contenedores se vean afectados.
- Logging: Véase Uso de ICAgent para recopilar logs de contenedores.
- 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- Upgrade: Véase Configuración de la política de actualización de carga de trabajo.
- Scheduling: Véase Política de programación (afinidad/antiafinidad).
- Política de la gestión de instancias
Para algunos sistemas distribuidos, la secuencia de StatefulSet es innecesaria y/o no debería ocurrir. Estos sistemas solo requieren unicidad e identificadores.
- OrderedReady: El StatefulSet desplegará, eliminará o escalará los pods en orden y uno por uno. (El StatefulSet continúa solo después de que el pod anterior esté listo o eliminado.) Esta es la política predeterminada.
- Parallel: El StatefulSet creará pods en paralelo para que coincidan con la escala deseada sin esperar, y eliminará todos los pods a la vez.
- Toleration: El uso de manchas y tolerancias permite (no a la fuerza) que el pod se programe en un nodo con las manchas correspondientes, y controla las políticas de desalojo del pod después de que el nodo donde se encuentra el pod esté contaminado. Para obtener más información, véase Tolerancias.
- Labels and Annotations: Véase Etiquetas y anotaciones de pod.
- DNS: Véase Configuración de DNS.
- APM Settings: Véase Configuración de la configuración de APM para el análisis de cuello de botella del rendimiento.
- 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.
- Utilice kubectl para conectarse al clúster. Para obtener más información, véase Conexión a un clúster con kubectl.
- 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
- 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
- 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.