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" |
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
-
Créez un fichier nommé
alicloud-disk-topology-essd.yamlavec 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: WaitForFirstConsumerChamps clés :
-
Créez la StorageClass :
kubectl apply -f alicloud-disk-topology-essd.yaml -
Créez un fichier nommé
nginx.yamlavec 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 -
Déployez l'application :
kubectl apply -f nginx.yaml 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
-
Créez un fichier nommé
pv-static.yamlavec le contenu suivant. Remplacezd-****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: FilesystemChamps clés :
-
Créez le PersistentVolume (PV) :
kubectl apply -f pv-static.yaml -
Créez un fichier nommé
pvc-static.yamlavec 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-**** -
Créez le PersistentVolumeClaim (PVC) :
kubectl apply -f pvc-static.yaml -
Créez un fichier nommé
nginx.yamlavec 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 -
Déployez l'application :
kubectl apply -f nginx.yaml 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 |