CSI-stuurprogramma (Azure Files Container Storage Interface) gebruiken in Azure Kubernetes Service (AKS)

Het CSI-stuurprogramma (Azure Files Container Storage Interface) is een CSI-stuurprogramma dat voldoet aan de specificatie die wordt gebruikt door Azure Kubernetes Service (AKS) om de levenscyclus van Azure-bestandsshares te beheren. De CSI is een standaard voor het beschikbaar maken van willekeurige blok- en bestandsopslagsystemen voor workloads in containers in Kubernetes.

Door CSI te gebruiken en te gebruiken, kan AKS nu invoegtoepassingen schrijven, implementeren en herhalen om nieuwe of verbeterde bestaande opslagsystemen in Kubernetes beschikbaar te maken of te verbeteren. Als u CSI-stuurprogramma's in AKS gebruikt, hoeft u de kubernetes-kerncode niet aan te raken en te wachten op de releasecycli.

Zie CSI-stuurprogramma's inschakelen op AKS als u een AKS-cluster wilt maken met ondersteuning voor CSI-stuurprogramma's.

Notitie

Stuurprogramma's in de structuur verwijzen naar de huidige opslagstuurprogramma's die deel uitmaken van de kubernetes-kerncode en de nieuwe CSI-stuurprogramma's, die invoegtoepassingen zijn.

Nieuwe functies voor Het CSI-stuurprogramma van Azure Files

Naast de oorspronkelijke functies van stuurprogramma's in de structuur ondersteunt het Azure Files CSI-stuurprogramma de volgende nieuwe functies:

  • Network File System (NFS) versie 4.1
  • Privé-eindpunt
  • Het maken van een grote koppeling van bestandsshares parallel.

Een permanent volume gebruiken met Azure Files

Een permanent volume (PV) vertegenwoordigt een stuk opslag dat is ingericht voor gebruik met Kubernetes-pods. Een HW kan worden gebruikt door een of meer pods en kan dynamisch of statisch worden ingericht. Als meerdere pods gelijktijdige toegang tot hetzelfde opslagvolume nodig hebben, kunt u Azure Files gebruiken om verbinding te maken met behulp van het SMB - of NFS-protocol (Server Message Block). In dit artikel leest u hoe u dynamisch een Azure Files-share maakt voor gebruik door meerdere pods in een AKS-cluster. Zie Voor statische inrichting handmatig een volume maken en gebruiken met een Azure Files-share.

Met Azure Files-shares is er geen limiet voor het aantal dat op een knooppunt kan worden gekoppeld.

Zie Opslagopties voor toepassingen in AKS voor meer informatie over Kubernetes-volumes.

Dynamisch Azure Files-VM's maken met behulp van de ingebouwde opslagklassen

Er wordt een opslagklasse gebruikt om te definiëren hoe een Azure-bestandsshare wordt gemaakt. Er wordt automatisch een opslagaccount gemaakt in de knooppuntresourcegroep voor gebruik met de opslagklasse voor het opslaan van de Azure-bestandsshare. Kies een van de volgende Azure Storage-redundantie-SKU's voor skuName:

  • Standard_LRS: Lokaal redundante standaardopslag
  • Standard_GRS: Standaard geografisch redundante opslag
  • Standard_ZRS: Standaard zone-redundante opslag
  • Standard_RAGRS: Geografisch redundante opslag met leestoegang
  • Standard_RAGZRS: Geografisch zone-redundante opslag met leestoegang
  • Premium_LRS: Lokaal redundante Premium-opslag
  • Premium_ZRS: Premium zone-redundante opslag

Notitie

Azure Files ondersteunt Azure Premium-bestandsshares. De minimale bestandssharecapaciteit is 100 GiB. We raden u aan Om Azure Premium-bestandsshares te gebruiken in plaats van Standard-bestandsshares, omdat Premium-bestandsshares hogere prestaties bieden, schijfondersteuning met lage latentie voor I/O-intensieve workloads.

Wanneer u CSI-stuurprogramma's voor opslag in AKS gebruikt, zijn er nog twee ingebouwde stuurprogramma's die gebruikmaken van de Azure Files CSI-opslagstuurprogramma's StorageClasses . De andere CSI-opslagklassen worden gemaakt met het cluster naast de standaardopslagklassen in de structuur.

  • azurefile-csi: Maakt gebruik van Azure Standard Storage om een Azure-bestandsshare te maken.
  • azurefile-csi-premium: Maakt gebruik van Azure Premium Storage om een Azure-bestandsshare te maken.

Het claimbeleid voor beide opslagklassen zorgt ervoor dat de onderliggende Azure-bestandsshare wordt verwijderd wanneer de respectieve HW wordt verwijderd. De opslagklassen configureren ook dat de bestandsshares kunnen worden uitgebreid. U hoeft alleen de permanente volumeclaim (PVC) te bewerken met de nieuwe grootte.

Als u deze opslagklassen wilt gebruiken, maakt u een PVC en de respectieve pod die ernaar verwijst en gebruikt. Een PVC wordt gebruikt om automatisch opslag in te richten op basis van een opslagklasse. Een PVC kan een van de vooraf gemaakte opslagklassen of een door de gebruiker gedefinieerde opslagklasse gebruiken om een Azure-bestandsshare te maken voor de gewenste SKU en grootte. Wanneer u een poddefinitie maakt, wordt het PVC opgegeven om de gewenste opslag aan te vragen.

Maak een voorbeeld van PVC en pods die de huidige datum in een outfile afdrukt door de kubectl-opdrachten uit te voeren:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Nadat de pod de status Actief heeft, kunt u controleren of de bestandsshare correct is gekoppeld door de volgende opdracht uit te voeren en te controleren of de uitvoer het outfilevolgende bevat:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Een aangepaste opslagklasse maken

De standaardopslagklassen zijn geschikt voor de meest voorkomende scenario's, maar niet allemaal. In sommige gevallen wilt u mogelijk uw eigen opslagklasse aanpassen met uw eigen parameters. Gebruik bijvoorbeeld het volgende manifest om de mountOptions bestandsshare te configureren.

De standaardwaarde voor fileMode en dirMode is 0777 voor gekoppelde Kubernetes-bestandsshares. U kunt de verschillende koppelingsopties voor het opslagklasseobject opgeven.

Maak een bestand met de naam azure-file-sc.yamlen plak het volgende voorbeeldmanifest:

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

Maak de opslagklasse door de opdracht kubectl apply uit te voeren:

kubectl apply -f azure-file-sc.yaml

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Het CSI-stuurprogramma van Azure Files ondersteunt het maken van momentopnamen van permanente volumes en de onderliggende bestandsshares.

Notitie

Dit stuurprogramma biedt alleen ondersteuning voor het maken van momentopnamen, herstellen vanuit momentopnamen wordt niet ondersteund door dit stuurprogramma. Momentopnamen kunnen worden hersteld vanuit Azure Portal of CLI. Zie Overzicht van momentopnamen voor Azure Files voor meer informatie over het maken en herstellen van een momentopname.

Maak een volumemomentopnameklasse met de opdracht kubectl apply :

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Maak een volumemomentopname van het PVC dat we dynamisch aan het begin van deze zelfstudiepvc-azurefile hebben gemaakt.

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Controleer of de momentopname juist is gemaakt door de volgende opdracht uit te voeren:

kubectl describe volumesnapshot azurefile-volume-snapshot

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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>

Het formaat van een permanent volume wijzigen

U kunt een groter volume aanvragen voor een PVC. Bewerk het PVC-object en geef een groter formaat op. Deze wijziging resulteert in de uitbreiding van het onderliggende volume dat het PV ondersteuning biedt.

Notitie

Er wordt nooit een nieuwe PV gemaakt om aan de claim te voldoen. In plaats daarvan wordt het formaat van een bestaand volume gewijzigd.

Het verkleinen van permanente volumes wordt momenteel niet ondersteund.

In AKS ondersteunt de ingebouwde azurefile-csi opslagklasse al uitbreiding, dus gebruik het PVC dat eerder is gemaakt met deze opslagklasse. De PVC heeft een 100 GiB-bestandsshare aangevraagd. We kunnen dit bevestigen door het volgende uit te voeren:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Vouw het PVC uit door het spec.resources.requests.storage veld te vergroten:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

persistentvolumeclaim/pvc-azurefile patched

Controleer of zowel het PVC als het bestandssysteem in de pod de nieuwe grootte tonen:

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

Een permanent volume gebruiken met persoonlijke Azure Files-opslag (privé-eindpunt)

Als uw Azure Files-resources zijn beveiligd met een privé-eindpunt, moet u uw eigen opslagklasse maken. Zorg ervoor dat u uw DNS-instellingen hebt geconfigureerd om het IP-adres van het privé-eindpunt om te zetten in de FQDN van de verbindingsreeks. Pas de volgende parameters aan:

  • resourceGroup: De resourcegroep waarin het opslagaccount is geïmplementeerd.
  • storageAccount: de naam van het opslagaccount.
  • server: de FQDN van het privé-eindpunt van het opslagaccount.

Maak een bestand met de naam private-azure-file-sc.yamlen plak het volgende voorbeeldmanifest in het bestand. Vervang de waarden voor <resourceGroup> en <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

Maak de opslagklasse met behulp van de kubectl apply opdracht:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Maak een bestand met de naam private-pvc.yamlen plak het volgende voorbeeldmanifest in het bestand:

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

Maak de PVC met behulp van de opdracht kubectl apply :

kubectl apply -f private-pvc.yaml

NFS-bestandsshares

Azure Files ondersteunt het NFS v4.1-protocol. Ondersteuning voor NFS versie 4.1 voor Azure Files biedt u een volledig beheerd NFS-bestandssysteem als een service die is gebouwd op een maximaal beschikbaar en zeer duurzaam gedistribueerd opslagplatform.

Deze optie is geoptimaliseerd voor workloads voor willekeurige toegang met in-place gegevensupdates en biedt volledige ondersteuning voor het POSIX-bestandssysteem. In deze sectie wordt beschreven hoe u NFS-shares gebruikt met het Azure File CSI-stuurprogramma op een AKS-cluster.

Vereisten

  • De identiteit van het AKS-clusterbesturingsvlak (dat wil gezegd de naam van uw AKS-cluster) wordt toegevoegd aan de rol Inzender in het VNet en NetworkSecurityGroup.
  • De service-principal of managed service identity (MSI) van uw AKS-cluster moet worden toegevoegd aan de rol Inzender voor het opslagaccount.

Notitie

U kunt een privé-eindpunt gebruiken in plaats van toegang tot het geselecteerde VNet toe te staan.

Opties voor lees- en schrijfgrootte optimaliseren

In deze sectie vindt u informatie over het benaderen van prestatieafstemming van NFS met het Azure Files CSI-stuurprogramma met de rsize - en wsize-opties . Met de opties voor rsize en wsize wordt de maximale overdrachtsgrootte van een NFS-bewerking ingesteld. Als rsize of wsize niet is opgegeven bij koppelen, onderhandelen de client en server over de grootste grootte die door de twee wordt ondersteund. Momenteel ondersteunen zowel Azure NetApp Files als moderne Linux-distributies lees- en schrijfgrootten zo groot als 1.048.576 bytes (1 MiB).

Optimale prestaties zijn gebaseerd op efficiënte client-servercommunicatie. Als u de waarden voor lees - en schrijfbewerkingen voor koppelen verhoogt of verlaagt, kunnen de prestaties van NFS worden verbeterd. De standaardgrootte van de lees-/schrijfpakketten die worden overgedragen tussen client en server, zijn 8 kB voor NFS versie 2 en 32 KB voor NFS versie 3 en 4. Deze standaardwaarden kunnen te groot of te klein zijn. Het verminderen van de rsize en wsize kan de NFS-prestaties in een overbelast netwerk verbeteren door kleinere pakketten te verzenden voor elke NFS-leesantwoord- en schrijfaanvraag. Dit kan echter het aantal pakketten verhogen dat nodig is om gegevens over het netwerk te verzenden, waardoor het totale netwerkverkeer en het CPU-gebruik op de client en server worden verhoogd.

Het is belangrijk dat u tests uitvoert om een rsize en wsize te vinden die de efficente pakketoverdracht ondersteunt, waarbij de doorvoer niet wordt verlaagd en de latentie toeneemt.

Zie de aanbevolen procedures voor koppelen van Linux NFS voor Azure NetApp Files voor meer informatie over het optimaliseren van rsize en wsize.

Als u bijvoorbeeld een maximale rsize en wsize van 256-KiB wilt configureren, configureert u de mountOptions opslagklasse als volgt:

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

Opslagklasse voor NFS-bestandsshares maken

Maak een bestand met de naam nfs-sc.yaml en kopieer het onderstaande manifest. Zie NFS-koppelingsopties voor een lijst met ondersteunde mountOptionsopties.

Notitie

vers, minorversionsec worden geconfigureerd door het Azure File CSI-stuurprogramma. Het opgeven van een waarde in uw manifest voor deze eigenschappen wordt niet ondersteund.

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

Nadat u het bestand hebt bewerkt en opgeslagen, maakt u de opslagklasse met de opdracht kubectl apply :

kubectl apply -f nfs-sc.yaml

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Een implementatie maken met een bestandsshare met NFS-ondersteuning

U kunt een voorbeeld van een stateful set implementeren waarmee tijdstempels worden opgeslagen in een bestand data.txt met de opdracht 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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

statefulset.apps/statefulset-azurefile created

Valideer de inhoud van het volume door de volgende opdracht uit te voeren:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

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

Notitie

Omdat de NFS-bestandsshare zich in een Premium-account bevindt, is de minimale bestandsgrootte 100 GiB. Als u een PVC maakt met een kleine opslaggrootte, kan er een fout optreden die vergelijkbaar is met het volgende: kan geen bestandsshare maken ... grootte (5)....

Windows-containers

Het CSI-stuurprogramma van Azure Files ondersteunt ook Windows-knooppunten en -containers. Als u Windows-containers wilt gebruiken, volgt u de quickstart voor Windows-containers om een Windows-knooppuntgroep toe te voegen.

Nadat u een Windows-knooppuntgroep hebt, gebruikt u de ingebouwde opslagklassen, zoals azurefile-csi of maakt u een aangepaste. U kunt een voorbeeld van een stateful set op basis van Windows implementeren waarmee tijdstempels in een bestand data.txt worden opgeslagen door de opdracht kubectl apply uit te voeren:

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

De uitvoer van de opdracht lijkt op het volgende voorbeeld:

statefulset.apps/busybox-azurefile created

Valideer de inhoud van het volume door de volgende kubectl exec-opdracht uit te voeren:

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

De uitvoer van de opdrachten lijkt op het volgende voorbeeld:

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

Volgende stappen