Container Service for Kubernetes (ACK) permite establecer límites de E/S en dispositivos de block storage montados en un pod, como un disco en la nube o un disco local virtualizado con Logical Volume Manager (LVM). Kubernetes de código abierto no admite esta función. La limitación evita que un solo pod monopolice la E/S del disco y degrade otras cargas de trabajo en el mismo nodo.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un sistema operativo host Alibaba Cloud Linux 2 o posterior
Un clúster de ACK que ejecute Kubernetes 1.20 o posterior
El complemento Container Storage Interface (CSI) versión 1.22 o posterior. Para más detalles, consulte csi-provisioner
Parámetros de limitación
Establezca los siguientes parámetros en una StorageClass (aprovisionamiento dinámico) o en la sección volumeAttributes de un PersistentVolume (aprovisionamiento estático):
|
Parámetro |
Descripción |
Valor de ejemplo |
|
|
Máximo de operaciones de lectura por segundo para un pod |
|
|
|
Máximo de operaciones de escritura por segundo para un pod |
|
|
|
Máximo de bytes leídos por segundo para un pod |
|
|
|
Máximo de bytes escritos por segundo para un pod |
|
La configuración de limitación establecida para un disco en la nube no se puede modificar después de crear el disco. El ajuste de los parámetros de limitación en una StorageClass solo aplica a los discos en la nube recién creados; los discos existentes no se ven afectados.
Limitar un disco en la nube
Las siguientes secciones muestran cómo configurar la limitación para un disco en la nube montado como volumen aprovisionado de forma dinámica o estática.
Aprovisionamiento dinámico
-
Cree un archivo llamado
alicloud-disk-topology-essd.yamlcon el siguiente contenido:parameters.readIOPS/parameters.writeIOPS: Límites de IOPS aplicados a cada pod que utiliza esta StorageClass.parameters.readBPS/parameters.writeBPS: Límites de throughput.volumeBindingMode: WaitForFirstConsumer: Retrasa la creación del volumen hasta que se programa un pod, lo que garantiza que el disco se cree en la zona de disponibilidad correcta.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-topology-essd parameters: type: cloud_essd readIOPS: "100" writeIOPS: "10" readBPS: "100k" writeBPS: "100m" provisioner: diskplugin.csi.alibabacloud.com reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumerCampos clave:
-
Cree la StorageClass:
kubectl apply -f alicloud-disk-topology-essd.yaml -
Cree un archivo llamado
nginx.yamlcon el siguiente contenido. El StatefulSet hace referencia a la StorageClass para aprovisionar dinámicamente un disco en la nube ESSD como volumen.apiVersion: apps/v1 kind: StatefulSet metadata: name: web-csi-encrypt spec: selector: matchLabels: app: nginx serviceName: "nginx" podManagementPolicy: "Parallel" replicas: 1 template: metadata: labels: app: nginx spec: hostNetwork: true containers: - name: nginx command: - sleep - "999999999" image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: disk-csi mountPath: /data volumeClaimTemplates: - metadata: name: disk-csi spec: accessModes: [ "ReadWriteOnce" ] storageClassName: alicloud-disk-topology-essd resources: requests: storage: 80Gi -
Despliegue la aplicación:
kubectl apply -f nginx.yaml Compruebe que se aplican los límites de limitación. Consulte Comprobar los límites de limitación.
Aprovisionamiento estático
-
Cree un archivo llamado
pv-static.yamlcon el siguiente contenido. Reemplaced-****con el ID de su disco en la nube.volumeAttributes.readIOPS/volumeAttributes.readBPS: Parámetros de limitación para este disco específico.volumeHandle: El ID del disco en la nube existente que se va a utilizar.
apiVersion: v1 kind: PersistentVolume metadata: name: d-**** spec: accessModes: - ReadWriteMany capacity: storage: 80Gi csi: driver: diskplugin.csi.alibabacloud.com fsType: ext4 volumeAttributes: app: nginx type: cloud_ssd readBPS: 100K readIOPS: "100" volumeHandle: d-**** persistentVolumeReclaimPolicy: Retain volumeMode: FilesystemCampos clave:
-
Cree el PersistentVolume (PV):
kubectl apply -f pv-static.yaml -
Cree un archivo llamado
pvc-static.yamlcon el siguiente contenido:apiVersion: v1 kind: PersistentVolumeClaim metadata: labels: app: nginx name: disk-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 80Gi volumeMode: Filesystem volumeName: d-**** -
Cree el PersistentVolumeClaim (PVC):
kubectl apply -f pvc-static.yaml -
Cree un archivo llamado
nginx.yamlcon el siguiente contenido. El Deployment utiliza el PVC para montar el disco en la nube aprovisionado de forma estática.apiVersion: apps/v1 kind: Deployment metadata: name: deploy-disk labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: disk-pvc2 mountPath: /data volumes: - name: disk-pvc2 persistentVolumeClaim: claimName: disk-pvc -
Despliegue la aplicación:
kubectl apply -f nginx.yaml Compruebe que se aplican los límites de limitación. Consulte Comprobar los límites de limitación.
Comprobar los límites de limitación
Utilice las rutas de cgroup en el nodo para confirmar que los límites de IOPS y BPS están configurados correctamente.
Verificar la versión de cgroup
Inicie sesión en el nodo y ejecute:
stat -fc %T /sys/fs/cgroup
Si la salida es
cgroup2fs, el nodo utiliza cgroup V2.En caso contrario, el nodo utiliza cgroup V1.
Comprobar límites en cgroup V2
Construya la ruta mediante el UID del pod y revise el archivo io.max:
/sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod<UID>.slice/io.max
Comprobar límites en cgroup V1
Construya las rutas mediante el UID del pod y revise los siguientes archivos:
|
Métrica |
Ruta de cgroup V1 |
|
|
|
|
|
|
|
|
|
|
|
|