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.

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.

  1. 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
    
  2. 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

  1. 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:
      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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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