Utiliser un pilote CSI (Container Storage interface) pour Azure Files dans Azure Kubernetes Service (AKS)

Le pilote CSI (Container Storage Interface) pour Azure Files est un pilote conforme à la spécification CSI utilisé par Azure Kubernetes Service (AKS) pour gérer le cycle de vie des partages Azure Files. CSI est une norme pour exposer des systèmes de stockage de blocs et de fichiers arbitraires à des charges de travail en conteneur sur Kubernetes.

En adoptant et en utilisant CSI, AKS peut désormais écrire, déployer et itérer les plug-ins pour exposer de nouveaux systèmes de stockage ou améliorer les existants dans Kubernetes. L’utilisation de pilotes CSI dans AKS permet d’éviter de toucher au code Kubernetes de base et d’attendre ses cycles de mise en production.

Pour créer un cluster AKS avec prise en charge des pilotes CSI, consultez Activation des pilotes CSI sur AKS.

Notes

Les pilotes dans l’arborescence font référence aux pilotes de stockage actuels, qui font partie du code Kubernetes principal, par opposition aux nouveaux pilotes CSI, qui sont des plug-ins.

Nouvelles fonctionnalités du pilote CSI Azure Files

En plus des fonctionnalités de pilote d’origine dans l’arborescence, le pilote CSI Azure Files prend en charge les nouvelles fonctionnalités suivantes :

  • NFS (Network File System) version 4.1
  • Point de terminaison privé
  • Création d’un grand montage de partages de fichiers en parallèle.

Utiliser un volume persistant avec Azure Files

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. Si plusieurs pods doivent accéder simultanément au même volume de stockage, vous pouvez utiliser Azure Files pour la connexion avec le protocole SMB (Server Message Block) ou NFS. Cet article vous montre comment créer un partage Azure Files de manière dynamique utilisé par plusieurs pods dans un cluster AKS. Pour l’approvisionnement statique, consultez Créer et utiliser manuellement un volume avec un partage Azure Files.

Avec les partages Azure Files, il n’existe aucune limite quant au nombre de partages pouvant être montés sur un nœud.

Pour plus d’informations sur les volumes Kubernetes, consultez Options de stockage pour les applications dans AKS.

Créer dynamiquement des PV Azure Files à l’aide des classes de stockage intégrées

Une classe de stockage permet de définir la façon dont un partage de fichiers Azure est créé. Un compte de stockage est automatiquement créé dans le groupe de ressources de nœud pour être utilisé avec la classe de stockage afin de contenir le partage de fichiers Azure. Faites votre choix parmi les références SKU de redondance de stockage Azure suivantes pour skuName :

  • Standard_LRS : Stockage localement redondant standard
  • Standard_GRS : Stockage géo-redondant standard
  • Standard_ZRS : Stockage redondant dans une zone standard
  • Standard_RAGRS : Stockage géo-redondant avec accès en lecture standard
  • Standard_RAGZRS : stockage géo-redondant interzone avec accès en lecture Standard
  • Premium_LRS : Stockage Premium localement redondant
  • Premium_ZRS : stockage redondant interzone (ZRS) Premium

Remarque

Azure Files prend en charge les partages de fichier Premium Azure. La capacité du partage de fichiers minimal est de 100 Gio. Nous vous recommandons d’utiliser des partages de fichiers Azure Premium au lieu de partages de fichiers Standard, car les partages de fichiers Premium offrent des performances supérieures et une prise en charge des disques à faible latence pour les charges de travail nécessitant beaucoup d’E/S.

Quand vous utilisez des pilotes de stockage CSI sur AKS, il y a deux autres StorageClasses intégrées qui utilisent les pilotes de stockage CSI Azure Files. Les autres classes de stockage CSI sont créées avec le cluster en même temps que les classes de stockage par défaut dans l’arborescence.

  • azurefile-csi : utilise le stockage Standard Azure pour créer un partage de fichiers Azure.
  • azurefile-csi-premium : utilise le stockage Premium Azure pour créer un partage de fichiers Azure.

La stratégie de récupération sur les deux classes de stockage garantit que le partage de fichiers Azure sous-jacent est supprimé lorsque le volume persistant respectif est supprimé. Les classes de stockage configurent également les partages de fichiers pour qu’ils soient extensibles. Il vous suffit de modifier la revendication de volume persistant (PVC) avec la nouvelle taille.

Pour utiliser ces classes de stockage, créez un PVC et un pod respectif qui les référence et les utilise. Une revendication de volume persistant est utilisée pour configurer automatiquement le stockage basé sur une classe de stockage. Une revendication de volume persistant peut utiliser l’une des classes de stockage précréées ou une classe de stockage définie par l’utilisateur pour créer un partage de fichiers Azure pour le niveau tarifaire et la taille de votre choix. Quand vous créez une définition de pod, la revendication de volume persistant est spécifiée pour demander le stockage souhaité.

Créez un exemple de PVC et de pod qui imprime la date actuelle dans un outfile en exécutant les commandes kubectl apply :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/pvc-azurefile-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/nginx-pod-azurefile.yaml

La sortie de la commande ressemble à l’exemple suivant :

persistentvolumeclaim/pvc-azurefile created
pod/nginx-azurefile created

Une fois que le pod est en cours d’exécution, vous pouvez vérifier que le partage de fichiers est correctement monté en exécutant la commande suivante et en vérifiant que la sortie contient outfile :

kubectl exec nginx-azurefile -- ls -l /mnt/azurefile

La sortie de la commande ressemble à l’exemple suivant :

total 29
-rwxrwxrwx 1 root root 29348 Aug 31 21:59 outfile

Créer une classe de stockage personnalisée

Les classes de stockage par défaut sont adaptées aux scénarios les plus courants, mais pas à tous. Dans certains cas, vous souhaiterez peut-être personnaliser votre propre classe de stockage avec vos propres paramètres. Par exemple, utilisez le manifeste suivant pour configurer les mountOptions du partage de fichiers.

La valeur par défaut de fileMode et dirMode est 0777 pour les partages de fichiers montés Kubernetes. Vous pouvez spécifier les différentes options de montage sur l’objet de classe de stockage.

Créez un fichier nommé azure-file-sc.yaml et copiez-y l’exemple de manifeste suivant :

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0640
  - file_mode=0640
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict # https://linux.die.net/man/8/mount.cifs
  - nosharesock
parameters:
  skuName: Standard_LRS

Créez la classe de stockage en exécutant la commande kubectl apply :

kubectl apply -f azure-file-sc.yaml

La sortie de la commande ressemble à l’exemple suivant :

storageclass.storage.k8s.io/my-azurefile created

Le pilote CSI pour Azure Files prend en charge la création de captures instantanées de volumes persistants et des partages de fichiers sous-jacents.

Notes

Ce pilote prend uniquement en charge la création d’instantanés, la restauration à partir d’un instantané n’est pas prise en charge par ce pilote. Les instantanés peuvent être restaurés à partir du portail Azure ou de l’interface CLI. Pour plus d’informations sur la création et la restauration d’un instantané, consultez Vue d’ensemble des instantanés de partage pour Azure Files.

Créez une classe d’instantané de volume avec la commande kubectl apply :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshotclass-azurefile.yaml

La sortie de la commande ressemble à l’exemple suivant :

volumesnapshotclass.snapshot.storage.k8s.io/csi-azurefile-vsc created

Créez un instantané de volume à partir du PVC que nous avons créé de façon dynamique au début de ce tutoriel, pvc-azurefile.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshot-azurefile.yaml

La sortie de la commande ressemble à l’exemple suivant :

volumesnapshot.snapshot.storage.k8s.io/azurefile-volume-snapshot created

Vérifiez que l’instantané a été créé correctement en exécutant la commande suivante :

kubectl describe volumesnapshot azurefile-volume-snapshot

La sortie de la commande ressemble à l’exemple suivant :

Name:         azurefile-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T22:37:41Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  955091
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot
  UID:               c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azurefile
  Volume Snapshot Class Name:      csi-azurefile-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
  Ready To Use:                        false
Events:                                <none>

Redimensionner un volume persistant

Vous pouvez demander un volume plus important pour un PVC. Modifiez l’objet PVC et spécifiez une taille supérieure. Cette modification déclenche l’expansion du volume sous-jacent qui stocke le PV.

Notes

Un nouveau PV n’est jamais créé pour satisfaire la revendication. Au lieu de cela, un volume existant est redimensionné.

La réduction des volumes persistants n’est actuellement pas prise en charge.

Dans AKS, la classe de stockage intégrée azurefile-csi prend déjà en charge l’expansion, vous pouvez donc utiliser le PVC créé précédemment avec cette classe de stockage. Le PVC a demandé un partage de fichiers de 100 Gio. Nous pouvons confirmer cela en exécutant :

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile

La sortie de la commande ressemble à l’exemple suivant :

Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  100G  128K  100G   1% /mnt/azurefile

Développez le PVC en augmentant le champ spec.resources.requests.storage :

kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'

La sortie de la commande ressemble à l’exemple suivant :

persistentvolumeclaim/pvc-azurefile patched

Vérifiez que le PVC et le système de fichiers à l’intérieur du pod affichent la nouvelle taille :

kubectl get pvc pvc-azurefile
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
pvc-azurefile   Bound    pvc-5e5d9980-da38-492b-8581-17e3cad01770   200Gi      RWX            azurefile-csi   64m

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile
Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  200G  128K  200G   1% /mnt/azurefile

Utiliser un volume persistant avec un stockage Azure Files privé (point de terminaison privé)

Si vos ressources Azure Files sont protégées par un point de terminaison privé, vous devez créer votre propre classe de stockage. Vérifiez que vous avez configuré vos paramètres DNS pour changer l’adresse IP du point de terminaison privé par le nom de domaine complet (FQDN) de la chaîne de connexion. Personnaliser les paramètres suivants :

  • resourceGroup : groupe de ressources dans lequel le compte de stockage est déployé.
  • storageAccount : nom du compte de stockage.
  • server : nom de domaine complet du point de terminaison privé du compte de stockage.

Créez un fichier nommé private-azure-file-sc.yaml, puis collez l’exemple de manifeste suivant dans le fichier. Remplacez les valeurs de <resourceGroup> et <storageAccountName>.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: private-azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  resourceGroup: <resourceGroup>
  storageAccount: <storageAccountName>
  server: <storageAccountName>.file.core.windows.net
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduce probability of reconnect race
  - actimeo=30  # reduce latency for metadata-heavy workload

Créez la classe de stockage en utilisant la commande kubectl apply :

kubectl apply -f private-azure-file-sc.yaml

La sortie de la commande ressemble à l’exemple suivant :

storageclass.storage.k8s.io/private-azurefile-csi created

Créez un fichier nommé private-pvc.yaml, puis collez l’exemple de manifeste suivant dans le fichier :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: private-azurefile-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: private-azurefile-csi
  resources:
    requests:
      storage: 100Gi

Créez le PVC en utilisant la commande kubectl apply :

kubectl apply -f private-pvc.yaml

Partages de fichiers NFS

Azure Files prend en charge le protocole NFS v 4.1. La prise en charge de la version 4.1 du protocole NFS pour Azure Files vous donne un système de fichiers NFS complètement managé en tant que service, reposant sur une plateforme de stockage résiliente et distribuée hautement disponible et durable.

Cette option est optimisée pour les charges de travail à accès aléatoire avec des mises à jour de données sur place et fournit une prise en charge complète du système de fichiers POSIX. Cette section vous montre comment utiliser des partages NFS avec le pilote CSI d’Azure Files sur un cluster AKS.

Prérequis

  • L’identité de Plan de contrôle de votre cluster AKS (autrement dit, le nom de votre cluster AKS) est ajoutée au rôle Contributeur sur le réseau virtuel et NetworkSecurityGroup.
  • Votre principal de service ou votre identité MSI (Managed Service Identity) du cluster AKS doivent être ajoutés au rôle Contributeur sur le compte de stockage.

Notes

Vous pouvez utiliser un point de terminaison privé au lieu d’autoriser l’accès au réseau virtuel sélectionné.

Optimisation des options des tailles de lecture et d’écriture

Cette section fournit des informations sur le réglage des performances NFS avec le pilote CSI Azure Files en utilisant les options rsize et wsize. Les options rsize et wsize définissent la taille de transfert maximale d’une opération NFS. Si rsize ou wsize ne sont pas spécifiés au montage, le client et le serveur négocient la plus grande taille prise en charge par les deux. À l’heure actuelle, Azure NetApp Files et les distributions Linux modernes prennent en charge des tailles de lecture et d’écriture pouvant aller jusqu’à 1 048 576 octets (1 Mio).

Les performances optimales sont basées sur une communication client-serveur efficace. L’augmentation ou la diminution des valeurs de taille des options de lecture et d’écriture de montage peut améliorer les performances NFS. La taille par défaut des paquets de lecture/d’écriture transférés entre le client et le serveur est de 8 Ko pour NFS version 2, et de 32 Ko pour NFS versions 3 et 4. Ces valeurs par défaut peuvent être trop grandes ou trop petites. La réduction de rsize et wsize peut améliorer les performances NFS dans un réseau saturé en envoyant des paquets plus petits pour chaque demande d’écriture et de lecture de réponse NFS. Toutefois, cela peut augmenter le nombre de paquets nécessaires pour envoyer des données sur le réseau, ce qui augmente le trafic réseau total, et l’utilisation du processeur sur le client et le serveur.

Vous devez donc faire des tests pour trouver des valeurs de rsize et wsize qui favorisent un transfert de paquets efficace, sans réduire le débit ni augmenter la latence.

Pour plus d’informations sur l’optimisation de rsize et wsize, consultez Bonnes pratiques des options de montage NFS Linux pour Azure NetApp Files.

Par exemple, pour configurer des valeurs de rsize et wsize maximales de 256 Kio, configurez les mountOptions dans la classe de stockage de la façon suivante :

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30
  - rsize=262144
  - wsize=262144

Créer une classe de stockage pour les partages de fichiers NFS

Créez un fichier nommé nfs-sc.yaml et copiez le manifeste ci-dessous. Pour obtenir la liste des mountOptions pris en charge, consultez les options de montage NFS.

Remarque

vers, minorversion, sec sont configurés par le pilote CSI de fichier Azure. La spécification d’une valeur dans votre manifeste pour ces propriétés n’est pas prise en charge.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30

Après avoir modifié et enregistré le fichier, créez la classe de stockage à l’aide de la commande kubectl apply :

kubectl apply -f nfs-sc.yaml

La sortie de la commande ressemble à l’exemple suivant :

storageclass.storage.k8s.io/azurefile-csi-nfs created

Créer un déploiement avec un partage de fichiers sauvegardé sur NFS

Vous pouvez déployer un exemple StatefulSet qui enregistre les horodatages (timestamps) dans un fichier data.txt à l’aide de la commande kubectl apply :

kubectl apply -f

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-azurefile
  labels:
    app: nginx
spec:
  podManagementPolicy: Parallel  # default is OrderedReady
  serviceName: statefulset-azurefile
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-azurefile
          image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/azurefile
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
      spec:
        storageClassName: azurefile-csi-nfs
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 100Gi

La sortie de la commande ressemble à l’exemple suivant :

statefulset.apps/statefulset-azurefile created

Validez le contenu du volume en exécutant la commande suivante :

kubectl exec -it statefulset-azurefile-0 -- df -h

La sortie de la commande ressemble à l’exemple suivant :

Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1                                                                                 29G   11G   19G  37% /etc/hosts
accountname.file.core.windows.net:/accountname/pvc-fa72ec43-ae64-42e4-a8a2-556606f5da38  100G     0  100G   0% /mnt/azurefile
...

Notes

Notez que la taille du partage de fichiers minimale est de 100 Gio, car le partage de fichiers NFS se trouve dans un compte Premium. Si vous créez un PVC avec une petite taille de stockage, vous risquez de rencontrer une erreur de type : impossible de créer le partage de fichiers ... taille (5)....

Conteneurs Windows

Le pilote CSI pour Azure Files prend également en charge les nœuds et conteneurs Windows. Pour utiliser des conteneurs Windows, suivez le Guide de démarrage rapide sur les conteneurs Windows afin d’ajouter un pool de nœuds Windows.

Dès que vous avez un pool de nœuds Windows, utilisez les classes de stockage intégrées comme azurefile-csi ou créez des classes personnalisées. Vous pouvez déployer un exemple d’ensemble avec état basé sur Windows qui enregistre les horodatages dans un fichier data.txt en exécutant la commande kubectl apply suivante :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yaml

La sortie de la commande ressemble à l’exemple suivant :

statefulset.apps/busybox-azurefile created

Validez le contenu du volume en exécutant la commande kubectl exec suivante :

kubectl exec -it busybox-azurefile-0 -- cat c:\\mnt\\azurefile\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azurefile-0 -- cat c:\mnt\azurefile\data.txt # on Windows Powershell/CMD

La sortie des commandes ressemble à l’exemple suivant :

2020-08-27 22:11:01Z
2020-08-27 22:11:02Z
2020-08-27 22:11:04Z
(...)

Étapes suivantes