Kubernetes ne sait pas automatiquement quel disque cloud provisionner pour une charge de travail. Vous devez définir un StorageClass qui mappe vos préférences en matière de type de disque et de zone, puis le référencer dans une revendication de volume persistant (PVC). Lors de la création du PVC, le Disk-Controller provisionne automatiquement le disque et le lie en tant que volume persistant (PV).
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster ACK opérationnel avec kubectl configuré
Les permissions nécessaires pour créer des ressources StorageClass et PVC dans le cluster
StorageClasses par défaut
Les clusters mono-zone incluent les StorageClasses suivants par défaut. Pour les clusters multi-zones, vous devez créer manuellement un StorageClass afin de spécifier la zone cible.
| StorageClass | Type de disque | Idéal pour |
|---|---|---|
alicloud-disk-efficiency |
Disque ultra | Charges de travail sensibles aux coûts avec des exigences d'E/S modérées |
alicloud-disk-ssd |
SSD standard | Charges de travail polyvalentes nécessitant des performances fiables |
alicloud-disk-essd |
SSD amélioré (ESSD) | Charges de production à faible latence et haut débit |
alicloud-disk-available |
Mode haute disponibilité | Charges de travail où la disponibilité du disque est prioritaire sur son type |
alicloud-disk-topology |
Mode WaitForFirstConsumer | Clusters multi-zones où l'ordonnancement des pods détermine la zone du disque |
Pour alicloud-disk-available , le système tente d'abord de créer un SSD standard, puis se rabat sur un disque ultra si les ressources SSD sont épuisées. Pour les versions du Disk-Controller antérieures à v1.14.8.44-c23b62c5-aliyun, l'ordre de repli est le suivant : SSD amélioré (ESSD) → SSD standard → disque ultra.
Créer un StorageClass
Choisissez un type de StorageClass en fonction de la configuration de votre cluster :
Cluster mono-zone ou disque à zone fixe : Créer un StorageClass avec un ID de zone
Cluster multi-zones : Créer un StorageClass en mode WaitForFirstConsumer
Créer un StorageClass avec un ID de zone
Utilisez cette approche pour les clusters mono-zones ou lorsque vous souhaitez épingler la création du disque à une zone spécifique.
-
Créez un fichier nommé
storage-class.yamlavec le contenu suivant :kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: alicloud-disk-ssd-hangzhou-b provisioner: alicloud/disk parameters: type: cloud_ssd regionId: cn-hangzhou zoneId: cn-hangzhou-b reclaimPolicy: Retain # Default is Delete. Set to Retain to prevent accidental data loss.Le tableau suivant décrit les paramètres :
Paramètre Description Obligatoire Valeur par défaut provisionerLe plug-in de volume pour le provisionnement des disques. Définissez-le sur alicloud/disk.Oui — typeLe type de disque. Valeurs valides : cloud_efficiency(disque ultra),cloud_ssd(SSD standard),cloud_essd(ESSD),available(mode haute disponibilité qui sélectionne automatiquement le meilleur type disponible).Oui — regionIdLa région où le disque est créé. Oui — zoneIdLa zone où le disque est créé. Pour les clusters multi-zones, spécifiez plusieurs zones séparées par des virgules : cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c.Oui — reclaimPolicyLa politique de réclamation du disque lors de la suppression du PVC. Retainconserve le disque ;Deletele supprime. Définissez-le surRetainpour éviter la perte de données.Non DeleteencryptedIndique si le disque doit être chiffré. Non false -
Appliquez le StorageClass :
kubectl apply -f storage-class.yaml -
Vérifiez que le StorageClass a été créé :
kubectl get storageclass alicloud-disk-ssd-hangzhou-bLa sortie devrait afficher le StorageClass avec
alicloud/diskcomme provisionneur.
Créer un StorageClass en mode WaitForFirstConsumer
Dans les clusters multi-zones, un PV peut être provisionné avant qu'un pod ne soit ordonnancé, ce qui place le disque dans une zone différente de celle où le pod s'exécute finalement. Dans ce cas, le pod ne parvient pas à démarrer car il ne peut pas attacher un disque provenant d'une autre zone. Le mode WaitForFirstConsumer résout ce problème en retardant le provisionnement du disque jusqu'à ce que le pod consommateur soit ordonnancé, garantissant ainsi que le disque est toujours créé dans la même zone que le pod.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-topology-ssd
provisioner: alicloud/disk
parameters:
type: cloud_ssd
reclaimPolicy: Retain # Default is Delete.
volumeBindingMode: WaitForFirstConsumer
Appliquez le StorageClass :
kubectl apply -f storage-class-topology.yaml
Fonctionnement de la sélection de zone — le tableau suivant résume le comportement de placement des disques en fonction de la configuration de votre StorageClass :
| Configuration | Placement du disque |
|---|---|
Aucun zoneId, aucun WaitForFirstConsumer |
Zone où le composant Disk-Controller est déployé |
zoneId défini, aucun WaitForFirstConsumer |
Zones spécifiées, sélectionnées selon un algorithme round-robin |
WaitForFirstConsumer activé |
Zone du nœud où le pod consommateur est ordonnancé |
Créer un PVC et un Pod
Le manifeste suivant crée un PVC basé sur le StorageClass alicloud-disk-ssd-hangzhou-b et un Pod qui monte le disque :
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: disk-ssd
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-disk-ssd-hangzhou-b
resources:
requests:
storage: 20Gi
---
kind: Pod
apiVersion: v1
metadata:
name: disk-pod-ssd
spec:
containers:
- name: disk-pod
image: nginx
volumeMounts:
- name: disk-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: disk-pvc
persistentVolumeClaim:
claimName: disk-ssd
Appliquez le manifeste :
kubectl apply -f pvc-pod.yaml
Vérifiez que le PVC est lié et que le Pod est en cours d'exécution :
kubectl get pvc disk-ssd
kubectl get pod disk-pod-ssd
Un PVC correctement lié affiche STATUS: Bound. Un Pod en cours d'exécution affiche STATUS: Running.
Créer un StatefulSet multi-instance
Utilisez volumeClaimTemplates pour créer dynamiquement un PVC et un PV distincts pour chaque réplica du StatefulSet. L'exemple suivant crée un StatefulSet nginx à deux réplicas avec un disque de 20 GiB par réplica :
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: disk-ssd
mountPath: /data
volumeClaimTemplates:
- metadata:
name: disk-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-ssd-hangzhou-b"
resources:
requests:
storage: 20Gi
Appliquez le manifeste :
kubectl apply -f statefulset.yaml
Vérifiez que le StatefulSet, les Pods et les PVC sont tous créés :
kubectl get statefulset web
kubectl get pods -l app=nginx
kubectl get pvc -l app=nginx
Chaque Pod (web-0, web-1) obtient son propre PVC (disk-ssd-web-0, disk-ssd-web-1), chacun étant soutenu par un disque provisionné indépendamment.