Définissez des seuils dans une StorageAutoScalerPolicy pour que le composant storage-auto-expander du module storage-operator étende automatiquement les volumes de disque.
Fonctionnement
Lorsque le composant storage-auto-expander détecte que l'utilisation du disque PVC dépasse le seuil défini, il étend le volume selon la séquence suivante :
Il surveille l'utilisation du disque sur les PVC correspondant au sélecteur d'étiquettes de la politique.
Lorsque l'utilisation dépasse le seuil, il sélectionne la première action correspondante et envoie une demande de redimensionnement au pilote CSI (Container Storage Interface).
Le pilote CSI redimensionne le disque cloud et signale à Kubernetes la nécessité de redimensionner le système de fichiers.
La capacité du PVC est mise à jour une fois le redimensionnement du système de fichiers terminé.
Contraintes de temporisation : L'intervalle de vérification du déclencheur est d'au plus 2 minutes et l'extension prend environ 1 minute. Ne saturez pas le disque dans les 3 minutes suivant une extension précédente.
Limitations
| Limitation | Détail |
|---|---|
| Version Kubernetes | Nécessite Kubernetes 1.16 ou version ultérieure. Mettez à niveau le cluster si nécessaire. |
| Type de disque | Les disques de base ne sont pas pris en charge. Consultez ResizeDisk pour connaître les types de disques éligibles. |
| StorageClass | La StorageClass du PVC doit avoir allowVolumeExpansion: true. Les StorageClasses fournies par ACK activent cette option par défaut. Pour les StorageClasses personnalisées, définissez ce paramètre lors de la création ; il n'est pas possible de modifier les StorageClasses existantes. |
| État du pod | Le pod d'application utilisant le disque doit être dans l'état Running. |
Activer le module storage-auto-expander
Le module storage-auto-expander intégré au module storage-operator gère l'expansion automatique. Pour vérifier si storage-operator est installé et connaître sa version, accédez à Operations > Add-ons > Volumes.
v1.33.1 et versions ultérieures : Le module est activé par défaut. Aucune action n'est requise.
-
Antérieur à v1.33.1 : Activez le module :
kubectl patch configmap/storage-operator \ -n kube-system \ --type merge \ -p '{"data":{"storage-auto-expander":"{\"imageRep\":\"acs/storage-auto-expander\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-auto-expander/install.yaml\",\"type\":\"deployment\"}"}}'Pour mettre à niveau
storage-operator, consultez Mettre à niveau les modules complémentaires.
Configurer une politique d'expansion automatique
Étape 1 : Vérifier que l'expansion de volume est activée sur votre StorageClass
kubectl get sc
La colonne ALLOWVOLUMEEXPANSION doit afficher true. Exemple de sortie :
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
alicloud-disk-efficiency diskplugin.csi.alibabacloud.com Delete Immediate true 26h
alicloud-disk-essd diskplugin.csi.alibabacloud.com Delete Immediate true 26h
alicloud-disk-ssd diskplugin.csi.alibabacloud.com Delete Immediate true 26h
alicloud-disk-topology-alltype diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 26h
Utilisez alicloud-disk-topology-alltype lorsque cela est possible. Cette classe sélectionne automatiquement le type de disque en fonction du type d'instance et de la disponibilité de la zone, ce qui réduit les échecs de provisionnement. Consultez Utiliser des volumes provisionnés dynamiquement .
Étape 2 : Créer une StorageAutoScalerPolicy
Créez un fichier nommé StorageAutoScalerPolicy.yaml :
apiVersion: storage.alibabacloud.com/v1alpha1
kind: StorageAutoScalerPolicy
metadata:
name: hybrid-expand-policy
spec:
pvcSelector:
matchLabels:
app: nginx
namespaces:
- default
- nginx
conditions:
- name: condition1
key: volume-capacity-used-percentage
operator: Gt
values:
- "80"
actions:
- name: action1
type: volume-expand
params:
scale: 50Gi
limits: 100Gi
- name: action2
type: volume-expand
params:
scale: 50%
limits: 300Gi
Champs clés :
| Champ | Description |
|---|---|
pvcSelector |
Sélectionne les PVC par étiquette. Exemple : app: nginx. |
namespaces |
Espaces de noms cibles des PVC. Plusieurs valeurs utilisent une logique OU. Par défaut : default. |
conditions |
Conditions de déclenchement. Plusieurs conditions utilisent une logique ET. key : métrique (volume-capacity-used-percentage = pourcentage d'utilisation du disque). operator : Gt (supérieur à), Lt (inférieur à), Eq (égal) ou Ne (différent de) — sensible à la casse. values : seuil sous forme de chaîne. |
actions |
Actions à exécuter lorsque les conditions sont remplies. La première action correspondante s'exécute ; les autres sont ignorées. type : doit être volume-expand. params.scale : montant de l'extension — absolu (par exemple, 50Gi) ou en pourcentage (par exemple, 50%). params.limits : taille maximale du PVC pour cette action. |
La politique se déclenche lorsque l'utilisation du PVC dépasse 80 % :
action1 ajoute 50 GiB (max 100 GiB). S'applique tant que le PVC est inférieur à 100 GiB.
action2 ajoute 50 % de la taille actuelle (max 300 GiB). S'applique une fois que le PVC atteint 100 GiB.
Étape 3 : Appliquer la politique
kubectl create -f StorageAutoScalerPolicy.yaml
Vérifier l'expansion automatique
Les étapes suivantes déclenchent cinq événements d'expansion avec un StatefulSet de test, en utilisant la politique définie ci-dessus.
Étape 1 : Créer un StatefulSet de test
Créez un fichier nommé StatefulSet.yaml :
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
serviceName: nginx
replicas: 1
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: pvc-disk
mountPath: /data
volumes:
- name: pvc-disk
persistentVolumeClaim:
claimName: disk-pvc
volumeClaimTemplates:
- metadata:
name: pvc-disk
labels:
app: nginx
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-topology-alltype"
resources:
requests:
storage: 25Gi
Appliquez-le et confirmez que le pod est en cours d'exécution :
kubectl create -f StatefulSet.yaml
kubectl get pod -l app=nginx
Sortie attendue :
NAME READY STATUS RESTARTS AGE
nginx-0 1/1 Running 0 99s
Vérifiez la capacité initiale du disque :
kubectl exec -it nginx-0 -- df -h /data
Sortie attendue :
Filesystem Size Used Avail Use% Mounted on
/dev/vdb 25G 24K 25G 1% /data
Étape 2 : Déclencher la première expansion (de 25 GiB à 75 GiB)
Écrivez 22 Go de données pour faire dépasser l'utilisation de 80 % :
kubectl exec -it nginx-0 -- fallocate -l 22G /data/test1
Vérifiez les événements d'expansion :
kubectl get events
Le disque fait 25 GiB et l'utilisation dépasse 80 %, donc action1 ajoute 50 GiB :
2m1s Warning StartExpand persistentvolumeclaim/pvc-disk-nginx-0 Start to expand of pvc pvc-disk-nginx-0 from 25Gi to 75Gi, usedCapacityPercentage:90%, freeSize:2498MB.
2m1s Normal ExternalExpanding persistentvolumeclaim/pvc-disk-nginx-0 waiting for an external controller to expand this PVC
2m1s Normal Resizing persistentvolumeclaim/pvc-disk-nginx-0 External resizer is resizing volume d-uf66kkzltnq6xgi9****
118s Normal FileSystemResizeRequired persistentvolumeclaim/pvc-disk-nginx-0 Require file system resize of volume on node
116s Warning SkipExpand persistentvolumeclaim/pvc-disk-nginx-0 Pvc pvc-disk-nginx-0 is expanding status from 25Gi to 75Gi, this action action2 will skip.
Vérifiez la capacité du PVC :
kubectl get pvc
Sortie attendue :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-disk-nginx-0 Bound d-uf66kkzltnq6xgi9**** 75Gi RWO alicloud-disk-topology-alltype <unset> 26m
Étape 3 : Déclencher la deuxième expansion (de 75 GiB à 100 GiB)
Écrivez 40 Go pour faire dépasser à nouveau l'utilisation de 80 % :
kubectl exec -it nginx-0 -- fallocate -l 40G /data/test2
action1 se déclenche à nouveau, mais sa limite de 100 GiB plafonne l'expansion à 100 GiB :
kubectl get events
7m4s Warning StartExpand persistentvolumeclaim/pvc-disk-nginx-0 Start to expand of pvc pvc-disk-nginx-0 from 75Gi to 100Gi, usedCapacityPercentage:84%, freeSize:11927MB.
7m4s Normal ExternalExpanding persistentvolumeclaim/pvc-disk-nginx-0 waiting for an external controller to expand this PVC
7m4s Normal Resizing persistentvolumeclaim/pvc-disk-nginx-0 External resizer is resizing volume d-uf66kkzltnq6xgi9****
7m1s Normal FileSystemResizeRequired persistentvolumeclaim/pvc-disk-nginx-0 Require file system resize of volume on node
5m59s Warning SkipExpand persistentvolumeclaim/pvc-disk-nginx-0 Pvc pvc-disk-nginx-0 is expanding status from 75Gi to 100Gi, this action action2 will skip.
Étape 4 : Déclencher la troisième expansion (de 100 GiB à 150 GiB)
À 100 GiB, la limite d'action1 est atteinte, donc action2 prend le relais et ajoute 50 % de la taille actuelle :
kubectl exec -it nginx-0 -- fallocate -l 20G /data/test3
kubectl get events
2m40s Warning StartExpand persistentvolumeclaim/pvc-disk-nginx-0 Start to expand of pvc pvc-disk-nginx-0 from 100Gi to 150Gi, usedCapacityPercentage:83%, freeSize:16637MB.
2m40s Normal ExternalExpanding persistentvolumeclaim/pvc-disk-nginx-0 waiting for an external controller to expand this PVC
2m40s Normal Resizing persistentvolumeclaim/pvc-disk-nginx-0 External resizer is resizing volume d-uf66kkzltnq6xgi9****
2m37s Normal FileSystemResizeRequired persistentvolumeclaim/pvc-disk-nginx-0 Require file system resize of volume on node
109s Warning SkipExpand persistentvolumeclaim/pvc-disk-nginx-0 Pvc pvc-disk-nginx-0 is expanding status from 100Gi to 150Gi, this action action2 will skip.
Étape 5 : Déclencher la quatrième expansion (de 150 GiB à 225 GiB)
action2 se déclenche à nouveau, ajoutant 50 % de 150 GiB = 75 GiB :
kubectl exec -it nginx-0 -- fallocate -l 50G /data/test4
kubectl get events
2m42s Warning StartExpand persistentvolumeclaim/pvc-disk-nginx-0 Start to expand of pvc pvc-disk-nginx-0 from 150Gi to 225Gi, usedCapacityPercentage:87%, freeSize:19621MB.
2m42s Normal ExternalExpanding persistentvolumeclaim/pvc-disk-nginx-0 waiting for an external controller to expand this PVC
2m42s Normal Resizing persistentvolumeclaim/pvc-disk-nginx-0 External resizer is resizing volume d-uf66kkzltnq6xgi9****
2m38s Normal FileSystemResizeRequired persistentvolumeclaim/pvc-disk-nginx-0 Require file system resize of volume on node
114s Warning SkipExpand persistentvolumeclaim/pvc-disk-nginx-0 Pvc pvc-disk-nginx-0 is expanding status from 150Gi to 225Gi, this action action2 will skip.
Étape 6 : Déclencher la cinquième expansion (de 225 GiB à 300 GiB)
action2 se déclenche une dernière fois, plafonnée à sa limite de 300 GiB :
kubectl exec -it nginx-0 -- fallocate -l 50G /data/test5
kubectl get events
17m Warning StartExpand persistentvolumeclaim/pvc-disk-nginx-0 Start to expand of pvc pvc-disk-nginx-0 from 225Gi to 300Gi, usedCapacityPercentage:82%, freeSize:40351MB.
17m Normal ExternalExpanding persistentvolumeclaim/pvc-disk-nginx-0 waiting for an external controller to expand this PVC
17m Normal Resizing persistentvolumeclaim/pvc-disk-nginx-0 External resizer is resizing volume d-uf66kkzltnq6xgi9****
17m Normal FileSystemResizeRequired persistentvolumeclaim/pvc-disk-nginx-0 Require file system resize of volume on node
Les deux actions ont atteint leurs limits. Aucune autre expansion ne se produit.
Étapes suivantes
Pour les problèmes liés aux volumes de disque cloud, consultez FAQ sur les volumes de disque cloud.