Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

Container Service for Kubernetes (ACK) vous permet de définir des limites d'E/S sur les périphériques de stockage par blocs montés sur un pod, tels qu'un disque cloud ou un disque local virtualisé avec Logical Volume Manager (LVM). Kubernetes open source ne prend pas en charge cette fonctionnalité. La limitation du débit empêche un pod unique de monopoliser les E/S disque et de dégrader les performances des autres charges de travail exécutées sur le même nœud.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un système d'exploitation hôte Alibaba Cloud Linux 2 ou version ultérieure

  • Un cluster ACK exécutant Kubernetes 1.20 ou version ultérieure

  • Le plug-in Container Storage Interface (CSI) version 1.22 ou ultérieure. Pour plus de détails, consultez la rubrique csi-provisioner

Paramètres de limitation du débit

Définissez les paramètres suivants dans une StorageClass (provisionnement dynamique) ou dans la section volumeAttributes d'un PersistentVolume (provisionnement statique) :

Paramètre Description Exemple de valeur
readIOPS Nombre maximal d'opérations de lecture par seconde pour un pod "100"
writeIOPS Nombre maximal d'opérations d'écriture par seconde pour un pod "10"
readBPS Nombre maximal d'octets lus par seconde pour un pod "100k", "100m"
writeBPS Nombre maximal d'octets écrits par seconde pour un pod "100k", "100m"
Important

Les paramètres de limitation du débit configurés pour un disque cloud ne peuvent pas être modifiés après la création du disque. L'ajustement des paramètres de limitation dans une StorageClass s'applique uniquement aux nouveaux disques cloud ; les disques existants ne sont pas affectés.

Limiter le débit d'un disque cloud

Les sections suivantes expliquent comment configurer la limitation du débit pour un disque cloud monté en tant que volume provisionné dynamiquement ou statiquement.

Provisionnement dynamique

  1. Créez un fichier nommé alicloud-disk-topology-essd.yaml avec le contenu suivant :

    • parameters.readIOPS / parameters.writeIOPS : Limites d'IOPS appliquées à chaque pod utilisant cette StorageClass.

    • parameters.readBPS / parameters.writeBPS : Limites de débit.

    • volumeBindingMode: WaitForFirstConsumer : Retarde la création du volume jusqu'à la planification d'un pod, garantissant ainsi que le disque est créé dans la bonne zone de disponibilité.

    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

    Champs clés :

  2. Créez la StorageClass :

    kubectl apply -f alicloud-disk-topology-essd.yaml
  3. Créez un fichier nommé nginx.yaml avec le contenu suivant. Le StatefulSet référence la StorageClass pour provisionner dynamiquement un disque cloud ESSD en tant que volume.

    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. Déployez l'application :

    kubectl apply -f nginx.yaml
  5. Vérifiez que les limites de limitation du débit sont appliquées. Consultez la section Vérifier les limites de limitation du débit.

Provisionnement statique

  1. Créez un fichier nommé pv-static.yaml avec le contenu suivant. Remplacez d-**** par l'ID de votre disque cloud.

    • volumeAttributes.readIOPS / volumeAttributes.readBPS : Paramètres de limitation du débit pour ce disque spécifique.

    • volumeHandle : ID du disque cloud existant à utiliser.

    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

    Champs clés :

  2. Créez le PersistentVolume (PV) :

    kubectl apply -f pv-static.yaml
  3. Créez un fichier nommé pvc-static.yaml avec le contenu suivant :

    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. Créez le PersistentVolumeClaim (PVC) :

    kubectl apply -f pvc-static.yaml
  5. Créez un fichier nommé nginx.yaml avec le contenu suivant. Le Deployment utilise le PVC pour monter le disque cloud provisionné statiquement.

    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. Déployez l'application :

    kubectl apply -f nginx.yaml
  7. Vérifiez que les limites de limitation du débit sont appliquées. Consultez la section Vérifier les limites de limitation du débit.

Vérifier les limites de limitation du débit

Utilisez les chemins cgroup sur le nœud pour confirmer que les limites d'IOPS et de BPS sont correctement définies.

Vérifier la version de cgroup

Connectez-vous au nœud et exécutez la commande suivante :

stat -fc %T /sys/fs/cgroup
  • Si la sortie est cgroup2fs, le nœud utilise cgroup V2.

  • Sinon, le nœud utilise cgroup V1.

Vérifier les limites sur cgroup V2

Construisez le chemin en utilisant l'UID du pod et vérifiez le fichier io.max :

/sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod<UID>.slice/io.max

Vérifier les limites sur cgroup V1

Construisez les chemins en utilisant l'UID du pod et vérifiez les fichiers suivants :

Métrique Chemin 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