Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Best practice for throttling block storage devices

Última actualización: Sep 04, 2026

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

readIOPS

Máximo de operaciones de lectura por segundo para un pod

"100"

writeIOPS

Máximo de operaciones de escritura por segundo para un pod

"10"

readBPS

Máximo de bytes leídos por segundo para un pod

"100k", "100m"

writeBPS

Máximo de bytes escritos por segundo para un pod

"100k", "100m"

Importante

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

  1. Cree un archivo llamado alicloud-disk-topology-essd.yaml con 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: WaitForFirstConsumer

    Campos clave:

  2. Cree la StorageClass:

    kubectl apply -f alicloud-disk-topology-essd.yaml
  3. Cree un archivo llamado nginx.yaml con 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
  4. Despliegue la aplicación:

    kubectl apply -f nginx.yaml
  5. Compruebe que se aplican los límites de limitación. Consulte Comprobar los límites de limitación.

Aprovisionamiento estático

  1. Cree un archivo llamado pv-static.yaml con el siguiente contenido. Reemplace d-**** 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: Filesystem

    Campos clave:

  2. Cree el PersistentVolume (PV):

    kubectl apply -f pv-static.yaml
  3. Cree un archivo llamado pvc-static.yaml con 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-****
  4. Cree el PersistentVolumeClaim (PVC):

    kubectl apply -f pvc-static.yaml
  5. Cree un archivo llamado nginx.yaml con 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
  6. Despliegue la aplicación:

    kubectl apply -f nginx.yaml
  7. 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

readIOPS

/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_iops_device

writeIOPS

/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_iops_device

readBPS

/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.read_bps_device

writeBPS

/sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod{pod_uid}.slice/blkio.throttle.write_bps_device