Créer et utiliser un volume avec des disques Azure dans Azure Kubernetes Service (AKS)
Un volume persistant représente un élément de stockage provisionné pour une utilisation dans des pods Kubernetes. Un volume persistant peut être utilisé par un ou plusieurs pods, et être provisionné de façon statique ou dynamique. Cet article vous montre comment créer des volumes persistants de manière dynamique avec des Disques Azure pour permettre à un pod unique de les utiliser, dans un cluster Azure Kubernetes Service (AKS).
Notes
Vous ne pouvez monter un disque Azure qu’avec le type de mode d’accèsReadWriteOnce, qui le rend disponible pour un seul pod dans AKS. S'il vous faut partager un volume persistant entre plusieurs pods, utilisez Azure Files.
Cet article vous montre comment :
- Utilisez un volume persistant dynamique en installant le pilote CSI (Container Storage Interface) et en créant dynamiquement un ou plusieurs disques managés Azure à attacher à un pod.
- Utilisez un volume persistant statique en créant un ou plusieurs disques managés Azure, ou utilisez un disque existant et attachez-le à un pod.
Pour plus d’informations sur les volumes Kubernetes, consultez Options de stockage pour les applications dans AKS.
Avant de commencer
Un compte de stockage Azure.
Azure CLI version 2.0.59 ou ultérieure installé et configuré. Exécutez
az --version
pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
Le pilote CSI de disques Azure a une limite de 32 volumes par nœud. Le nombre de volumes change en fonction de la taille du nœud/pool de nœuds. Exécutez la commande kubectl get pour déterminer le nombre de volumes qui peuvent être alloués par nœud :
kubectl get CSINode <nodename> -o yaml
Provisionner un volume de manière dynamique
Cette section fournit des conseils aux administrateurs de clusters qui veulent provisionner un ou plusieurs volumes persistants qui incluent des détails sur le stockage sur disque Azure utilisé par une charge de travail. Une revendication de volume persistant utilise l’objet de classe de stockage pour provisionner dynamiquement un conteneur de stockage sur disque Azure.
Paramètres d’approvisionnement dynamiques
Nom | Signification | Valeur disponible | Obligatoire | Valeur par défaut |
---|---|---|---|---|
skuName | Type de compte de stockage de disques Azure (alias : storageAccountType ) |
Standard_LRS , Premium_LRS , StandardSSD_LRS , PremiumV2_LRS , UltraSSD_LRS , Premium_ZRS , StandardSSD_ZRS |
Non | StandardSSD_LRS |
fsType | Type de système de fichiers | ext4 , ext3 , ext2 , xfs , btrfs pour Linux, ntfs pour Windows |
Non | ext4 pour Linux, ntfs pour Windows |
cachingMode | Paramètre de cache de l’hôte du disque de données Azure | None , ReadOnly , ReadWrite |
Non | ReadOnly |
location | Spécifie la région Azure dans laquelle les disques Azure seront créés | eastus , westus , etc. |
Non | Si le paramètre est vide, le pilote utilise le même nom d’emplacement que le cluster AKS actuel |
resourceGroup | Spécifie le groupe de ressources dans lequel les disques Azure seront créés | Nom du groupe de ressources existant | Non | Si le paramètre est vide, le pilote utilise le même nom de groupe de ressources que le cluster AKS actuel |
DiskIOPSReadWrite | Capacité d’IOPS du disque UltraSSD (2 IOPS/Gio minimum) | 100 à environ 160000 | Non | 500 |
DiskMBpsReadWrite | Capacité de débit du disque UltraSSD (0,032/Gio minimum) | 1 à environ 2000 | Non | 100 |
LogicalSectorSize | Taille du secteur logique en octets pour le disque Ultra. (valeurs prises en charge : 512 et 4096, par défaut 4096) | 512 , 4096 |
Non | 4096 |
tags | Étiquettes de disque Azure | Format des étiquettes : key1=val1,key2=val2 |
Non | "" |
diskEncryptionSetID | ResourceId du jeu de chiffrement de disque à utiliser pour activer le chiffrement au repos | Format : /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} |
Non | "" |
diskEncryptionType | Type de chiffrement du jeu de chiffrement de disque. | EncryptionAtRestWithCustomerKey (par défaut), EncryptionAtRestWithPlatformAndCustomerKeys |
Non | "" |
writeAcceleratorEnabled | Accélérateur d’écriture sur les disques Azure | true , false |
Non | "" |
networkAccessPolicy | Propriété NetworkAccessPolicy pour empêcher la génération de l’URI SAS d’un disque ou d’un instantané | AllowAll , DenyAll , AllowPrivate |
Non | AllowAll |
diskAccessID | ID de ressource Azure de la ressource DiskAccess pour utiliser des points de terminaison privés sur des disques | Non | `` | |
enableBursting | Activer le bursting à la demande au-delà de la cible de performances approvisionnée du disque. Le bursting à la demande ne doit être appliqué qu’à un disque Premium dont la taille est > à 512 Go. Le disque Ultra et le disque partagé ne sont pas pris en charge. Le bursting est désactivé par défaut. | true , false |
Non | false |
useragent | Agent utilisateur utilisé pour l’attribution de l’utilisation du client | Non | Agent utilisateur généré au format driverName/driverVersion compiler/version (OS-ARCH) |
|
enableAsyncAttach | Autoriser plusieurs opérations d’attachement de disque (en lot) sur un nœud en parallèle. Bien que ce paramètre puisse accélérer l’attachement de disque, il se peut que vous rencontriez une limitation de l’API Azure lorsque le nombre d’attachements en volume est élevé. |
true , false |
Non | false |
subscriptionID | Spécifiez l’ID d’abonnement Azure dans lequel le disque Azure est créé. | ID d’abonnement Azure | Non | Si le paramètre n’est pas vide, resourceGroup doit être fourni. |
--- | Les paramètres suivants sont uniquement pour v2 | --- | --- | --- |
enableAsyncAttach | Le pilote v2 utilise une stratégie différente pour gérer la limitation de l’API Azure et ignore ce paramètre. | Non | ||
maxShares | Nombre total de montages de disques partagés autorisés pour le disque. La définition de la valeur sur 2 ou plus active des réplicas d’attachement. | Les valeurs prises en charge dépendent de la taille du disque. Pour connaître les valeurs prises en charge, consultez Partager un disque managé Azure. | Non | 1 |
maxMountReplicaCount | Nombre d’attachements de réplicas à gérer. | Cette valeur doit être comprise dans la plage [0..(maxShares - 1)] . |
Non | Si accessMode a la valeur ReadWriteMany , la valeur par défaut est 0 . Sinon, la valeur par défaut est maxShares - 1 . |
Classes de stockage intégrées
Une classe de stockage permet de définir la création dynamique d’une unité de stockage avec un volume persistant. Pour plus d’informations sur les classes de stockage Kubernetes, consultez Classes de stockage Kubernetes.
Chaque cluster AKS comprend quatre classes de stockage précréées, dont deux sont configurées pour fonctionner avec des Disques Azure :
- La classe de stockage par défaut approvisionne un Disque SSD Azure standard.
- Le stockage standard s’appuie sur des SSD Standard et offre un stockage économique tout en garantissant des performances fiables.
- La classe de stockage managed-csi-premium approvisionne un Disque Azure Premium.
- Les disques Premium reposent sur un disque SSD à faible latence et hautes performances. Cela convient parfaitement aux machines virtuelles exécutant des charges de travail de production. Lorsque vous utilisez le pilote Azure Disks CSI sur AKS, vous pouvez également utiliser la classe de stockage
managed-csi
, qui est soutenue par le stockage localement redondant (LRS) SSD Standard.
- Les disques Premium reposent sur un disque SSD à faible latence et hautes performances. Cela convient parfaitement aux machines virtuelles exécutant des charges de travail de production. Lorsque vous utilisez le pilote Azure Disks CSI sur AKS, vous pouvez également utiliser la classe de stockage
S’il n’est pas possible de réduire la taille d’un PVC (afin d’éviter la perte de données). Vous pouvez modifier une classe de stockage existante à l’aide de la commande kubectl edit sc
ou créer votre propre classe de stockage personnalisée.
Par exemple, si vous souhaitez utiliser un disque de taille 4 Tio, vous devez créer une classe de stockage qui définit cachingmode: None
, car la mise en cache de disque n’est pas prise en charge pour les disques de 4 Tio ou plus.
Pour plus d’informations sur les classes de stockage et la création de votre propre classe de stockage, consultez Options de stockage pour les applications dans AKS.
Utilisez la commande kubectl get sc pour voir les classes de stockage créées au préalable. L’exemple suivant montre les classes de stockage pré-créées disponibles au sein d’un cluster AKS :
kubectl get sc
La sortie de la commande ressemble à l’exemple suivant :
NAME PROVISIONER AGE
default (default) disk.csi.azure.com 1h
managed-csi disk.csi.azure.com 1h
Notes
Les revendications de volume persistant sont spécifiées dans Gio mais les disques managés Azure sont facturés par référence SKU pour une taille spécifique. Ces références SKU vont de 32 Gio pour les disques S4 ou P4 à 32 Tio pour les disques S80 ou P80 (en préversion). Le débit et les performances d’E/S d’un disque managé Premium dépendent à la fois de la référence SKU et de la taille d’instance des nœuds dans le cluster AKS. Pour plus d’informations, consultez Tarifs et performances de disques managés.
Créer une revendication de volume persistant
Une revendication de volume persistant (PVC) est utilisée pour configurer automatiquement le stockage basé sur une classe de stockage. Dans ce cas, une PVC peut utiliser une des classes de stockage créées au préalable pour créer un disque géré Azure standard ou Premium.
Créez un fichier nommé azure-pvc.yaml
et copiez-y le manifeste suivant. La revendication demande un disque nommé azure-managed-disk
, d’une taille de 5 Go avec un accès ReadWriteOnce. La classe de stockage managed-csi est spécifiée en tant que classe de stockage.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azure-managed-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-csi
resources:
requests:
storage: 5Gi
Conseil
Pour créer un disque qui utilise le stockage standard, préférez storageClassName: managed-csi-premium
plutôt que managed-csi.
Créez la revendication de volume persistant avec la commande kubectl apply et spécifiez votre fichier azure-pvc.yaml :
kubectl apply -f azure-pvc.yaml
La sortie de la commande ressemble à l’exemple suivant :
persistentvolumeclaim/azure-managed-disk created
Utiliser le volume persistant
Une fois la revendication de volume persistant créée, et le disque provisionné convenablement, un pod peut être créé avec un accès au disque. Le manifeste suivant crée un pod NGINX de base qui utilise la revendication de volume persistant nommé azure-managed-disk pour monter le Disque Azure à l’emplacement /mnt/azure
. Pour les conteneurs Windows Server, spécifiez un chemin de montage en utilisant la convention de chemin Windows, par exemple, 'D:' .
Créez un fichier nommé azure-pvc-disk.yaml
et copiez-y le manifeste suivant.
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: mypod
image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
volumeMounts:
- mountPath: "/mnt/azure"
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: azure-managed-disk
Créez le pod avec la commande kubectl apply, comme indiqué dans l’exemple suivant :
kubectl apply -f azure-pvc-disk.yaml
La sortie de la commande ressemble à l’exemple suivant :
pod/mypod created
Vous disposez maintenant d’un pod en cours d’exécution avec le Disque Azure monté dans le répertoire /mnt/azure
. Cette configuration peut être consultée en inspectant votre pod à l’aide de la commande kubectl describe, comme illustré dans l’exemple condensé suivant :
kubectl describe pod mypod
La sortie de la commande ressemble à l’exemple suivant :
[...]
Volumes:
volume:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: azure-managed-disk
ReadOnly: false
default-token-smm2n:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-smm2n
Optional: false
[...]
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m default-scheduler Successfully assigned mypod to aks-nodepool1-79590246-0
Normal SuccessfulMountVolume 2m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "default-token-smm2n"
Normal SuccessfulMountVolume 1m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
[...]
Utiliser des disques Ultra Azure
Pour utiliser un disque Ultra Azure, consultez Utiliser des disques Ultra sur Azure Kubernetes Service (AKS).
Sauvegarder un volume persistant
Pour sauvegarder les données de votre volume persistant, prenez un instantané du disque managé pour le volume. Vous pouvez ensuite utiliser cet instantané pour créer un disque restauré et l’attacher aux pods comme moyen de restauration des données.
Tout d’abord, obtenez le nom du volume à l’aide de la commande kubectl get, par exemple pour la revendication de volume persistant nommée azure-managed-disk :
kubectl get pvc azure-managed-disk
La sortie de la commande ressemble à l’exemple suivant :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
azure-managed-disk Bound pvc-faf0f176-8b8d-11e8-923b-deb28c58d242 5Gi RWO managed-premium 3m
Ce nom de volume constitue le nom du disque Azure sous-jacent. Recherchez l’ID de disque avec az disk list et fournissez votre nom de volume PVC, comme indiqué dans l’exemple suivant :
az disk list --query '[].id | [?contains(@,`pvc-faf0f176-8b8d-11e8-923b-deb28c58d242`)]' -o tsv
/subscriptions/<guid>/resourceGroups/MC_MYRESOURCEGROUP_MYAKSCLUSTER_EASTUS/providers/MicrosoftCompute/disks/kubernetes-dynamic-pvc-faf0f176-8b8d-11e8-923b-deb28c58d242
Utilisez l’ID de disque pour créer un disque de capture instantanée avec az snapshot create. L’exemple suivant crée un instantané nommé pvcSnapshot dans le même groupe de ressources que le cluster AKS MC_myResourceGroup_myAKSCluster_eastus. Vous pouvez rencontrer des problèmes d’autorisation si vous créez des instantanés et restaurez des disques dans des groupes de ressources auxquels le cluster AKS n’a pas accès.
az snapshot create \
--resource-group MC_myResourceGroup_myAKSCluster_eastus \
--name pvcSnapshot \
--source /subscriptions/<guid>/resourceGroups/MC_myResourceGroup_myAKSCluster_eastus/providers/MicrosoftCompute/disks/kubernetes-dynamic-pvc-faf0f176-8b8d-11e8-923b-deb28c58d242
Selon la quantité de données présentes sur votre disque, quelques minutes peuvent être nécessaires pour créer l’instantané.
Restaurer et utiliser un instantané
Pour restaurer le disque et l’utiliser avec un pod Kubernetes, utilisez la capture instantanée comme source lorsque vous créez un disque avec az disk create. Cette opération permet de conserver la ressource d’origine si vous devez ensuite accéder à l’instantané des données d’origine. L’exemple suivant crée un disque nommé pvcRestored à partir de l’instantané nommé pvcSnapshot :
az disk create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name pvcRestored --source pvcSnapshot
Pour utiliser le disque restauré avec un pod, spécifiez l’ID du disque dans le manifeste. Procurez-vous l’ID de disque par le biais de la commande az disk show. L’exemple suivant récupère l’ID de disque pour pvcRestored qui a été créé à l’étape précédente :
az disk show --resource-group MC_myResourceGroup_myAKSCluster_eastus --name pvcRestored --query id -o tsv
Créez un manifeste de pod nommé azure-restored.yaml
et spécifiez l’URI de disque obtenu à l’étape précédente. L’exemple suivant crée un serveur web NGINX de base, avec le disque restauré monté comme volume à l’emplacement /mnt/azure :
kind: Pod
apiVersion: v1
metadata:
name: mypodrestored
spec:
containers:
- name: mypodrestored
image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
volumeMounts:
- mountPath: "/mnt/azure"
name: volume
volumes:
- name: volume
azureDisk:
kind: Managed
diskName: pvcRestored
diskURI: /subscriptions/<guid>/resourceGroups/MC_myResourceGroupAKS_myAKSCluster_eastus/providers/Microsoft.Compute/disks/pvcRestored
Créez le pod avec la commande kubectl apply, comme indiqué dans l’exemple suivant :
kubectl apply -f azure-restored.yaml
La sortie de la commande ressemble à l’exemple suivant :
pod/mypodrestored created
Vous pouvez utiliser kubectl describe pod mypodrestored
pour voir les détails du pod, tel que dans l’exemple condensé suivant qui affiche les informations du volume :
kubectl describe pod mypodrestored
La sortie de la commande ressemble à l’exemple suivant :
[...]
Volumes:
volume:
Type: AzureDisk (an Azure Data Disk mount on the host and bind mount to the pod)
DiskName: pvcRestored
DiskURI: /subscriptions/19da35d3-9a1a-4f3b-9b9c-3c56ef409565/resourceGroups/MC_myResourceGroupAKS_myAKSCluster_eastus/providers/Microsoft.Compute/disks/pvcRestored
Kind: Managed
FSType: ext4
CachingMode: ReadWrite
ReadOnly: false
[...]
Utilisation de balises Azure
Pour plus d’informations sur l’utilisation des balises Azure, consultez Utiliser des étiquettes Azure dans Azure Kubernetes Service (AKS).
Provisionner un volume de manière statique
Cette section fournit des conseils aux administrateurs de clusters qui veulent créer un ou plusieurs volumes persistants qui incluent des détails sur le stockage sur disque utilisé par une charge de travail.
Paramètres d’approvisionnement statiques
Nom | Signification | Valeur disponible | Obligatoire | Valeur par défaut |
---|---|---|---|---|
volumeHandle | URI de disque Azure | /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} |
Oui | N/A |
volumeAttributes.fsType | Type de système de fichiers | ext4 , ext3 , ext2 , xfs , btrfs pour Linux, ntfs pour Windows |
Non | ext4 pour Linux, ntfs pour Windows |
volumeAttributes.partition | Numéro de partition du disque existant (pris en charge uniquement sur Linux) | 1 , 2 , 3 |
Non | Vide (pas de partition) : vérifiez que le format de partition est semblable à -part1 |
volumeAttributes.cachingMode | Paramètre de cache de l’hôte de disque | None , ReadOnly , ReadWrite |
Non | ReadOnly |
Créer un disque Azure
Lorsque vous créez un disque Azure pour une utilisation avec AKS, vous pouvez créer la ressource de disque sur le groupe de ressources de nœuds. Cette approche permet au cluster AKS d’accéder et de gérer la ressource de disque. Si à la place vous créez le disque dans un groupe de ressources distinct, vous devez donner à l’identité managée Azure Kubernetes Service (AKS) de votre cluster le rôle Contributor
dans le groupe de ressources du disque. Dans cet exercice, vous allez créer le disque dans le même groupe de ressources que votre cluster.
Identifiez le nom du groupe de ressources avec la commande az aks show et ajoutez le paramètre
--query nodeResourceGroup
. L’exemple suivant obtient les le groupe de ressources du nœud pour le cluster AKS nommé myAKSCluster dans le groupe de ressources nommé myResourceGroup :az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv MC_myResourceGroup_myAKSCluster_eastus
Créez un disque à l’aide de la commande az disk create. Spécifiez en premier le nom de groupe de ressources de nœuds obtenu dans la commande précédente, puis celui pour la ressource de disque, par exemple myAKSDisk. L’exemple suivant crée un disque de 20 Gio et génère l’ID du disque après sa création. Si vous avez besoin de créer un disque pour une utilisation avec des conteneurs Windows Server, ajoutez le paramètre
--os-type windows
pour formater correctement le disque.az disk create \ --resource-group MC_myResourceGroup_myAKSCluster_eastus \ --name myAKSDisk \ --size-gb 20 \ --query id --output tsv
Notes
Les disques Azure sont facturés par référence SKU pour une taille donnée. Ces références SKU vont de 32 Gio pour les disques S4 ou P4 à 32 Tio pour les disques S80 ou P80 (en préversion). Le débit et les performances d’E/S d’un disque managé Premium dépendent à la fois de la référence SKU et de la taille d’instance des nœuds dans le cluster AKS. Consultez Tarification et performances de la fonctionnalité Disques managés.
L’ID de ressource de disque s’affiche une fois la commande complétée avec succès, comme illustré dans l’exemple de sortie suivant. Cet ID de disque est utilisé pour monter le disque à l’étape suivante.
/subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
Monter le disque en tant que volume
Créez un fichier pv-azuredisk.yaml avec un objet PersistentVolume. Mettez à jour
volumeHandle
avec l’ID de ressource de disque de l’étape précédente. Par exemple :apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: disk.csi.azure.com name: pv-azuredisk spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: managed-csi csi: driver: disk.csi.azure.com readOnly: false volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk volumeAttributes: fsType: ext4
Créez un fichier pvc-azuredisk.yaml avec un objet PersistentVolumeClaim qui utilise PersistentVolume. Par exemple :
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-azuredisk spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi volumeName: pv-azuredisk storageClassName: managed-csi
Utilisez les commandes kubectl apply pour créer PersistentVolume et PersistentVolumeClaim, en référençant les deux fichiers YAML créés précédemment :
kubectl apply -f pv-azuredisk.yaml kubectl apply -f pvc-azuredisk.yaml
Vérifiez que votre PersistentVolumeClaim est créé et lié au PersistentVolume.
kubectl get pvc pvc-azuredisk
La sortie de la commande ressemble à l’exemple suivant :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azuredisk Bound pv-azuredisk 20Gi RWO 5s
Créez un fichier azure-disk-pod.yaml pour référencer votre PersistentVolumeClaim. Par exemple :
apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure volumes: - name: azure persistentVolumeClaim: claimName: pvc-azuredisk
Exécutez la commande kubectl apply pour appliquer la configuration et monter le volume, en référençant le fichier de configuration YAML créé aux étapes précédentes :
kubectl apply -f azure-disk-pod.yaml
Étapes suivantes
- Pour découvrir comment utiliser le pilote CSI pour un stockage sur disque Azure, consultez Utiliser des disques Azure avec le pilote CSI.
- Pour connaître les meilleures pratiques associées, consultez Meilleures pratiques relatives au stockage et aux sauvegardes dans Azure Kubernetes Service (AKS).