Erstellen und Verwalten persistenter Volumes (PVs) mit Azure Blob Storage in Azure Kubernetes Service (AKS)

Wenn mehrere Pods gleichzeitigen Zugriff auf dasselbe Speichervolume benötigen, können Sie Azure Blob Storage verwenden, um eine Verbindung mit Blobfuse oder Network File System (NFS) herzustellen.

In diesem Artikel erfahren Sie, wie Sie Azure Blob Storage-Container dynamisch und statisch erstellen, die von mehreren Pods in einem Azure Kubernetes Service (AKS)-Cluster verwendet werden.

Voraussetzungen

  • Der Azure Blob Storage CSI-Treiber , der auf Ihrem AKS-Cluster aktiviert ist.

  • Ein Speicherkonto, das NFS v3 aktiviert ist, damit Sie ein persistentes Volume mithilfe des NFS-Protokolls bereitstellen können. Sie können NFS v3 nicht für ein vorhandenes Speicherkonto aktivieren. Weitere Informationen finden Sie unter Erstellen eines NFS v3-Kontos.

  • Führen Sie die folgenden Aufgaben aus, um ein Azure Data Lake Storage Konto bei Verwendung der Blobfuse-Bereitstellung zu unterstützen:

    • Geben Sie isHnsEnabled: "true" zum Erstellen eines Data Lake Storage Kontos mithilfe des Treibers in der dynamischen Bereitstellung in den Parametern der Speicherklasse an.
    • Wenn Sie den Blobfuse-Zugriff auf ein Data Lake Storage Konto in der statischen Bereitstellung aktivieren möchten, geben Sie die Bereitstellungsoption --use-adls=true im persistenten Volume an.
    • Wenn Sie ein Speicherkonto mit hierarchischem Namespace aktivieren möchten, sollten vorhandene persistente Volumes mittels der Einbindungsoption --use-adls=true erneut eingebunden werden.
  • Standardmäßig befindet sich der Blobfuse-Cache im /mnt Verzeichnis. Wenn die VM-SKU einen temporären Datenträger bereitstellt, wird das /mnt Verzeichnis auf dem temporären Datenträger bereitgestellt. Wenn die VM-SKU jedoch keinen temporären Datenträger bereitstellt, wird das /mnt Verzeichnis auf dem Betriebssystemdatenträger bereitgestellt, können Sie die Mount-Option --tmp-path= festlegen, um ein anderes Cacheverzeichnis anzugeben.

Verwenden von integrierten Speicherklassen zum Erstellen dynamischer PVs mit Azure Blob Storage

Eine Speicherklasse wird verwendet, um zu definieren, wie ein Azure-Blobspeichercontainer erstellt wird. In der Knotenressourcengruppe wird automatisch ein Speicherkonto erstellt, das mit der Speicherklasse verwendet wird, um den Azure-Blobspeichercontainer aufzunehmen. Wenn Sie CSI-Speichertreiber in AKS verwenden, gibt es zwei zusätzliche integrierte Speicherklassen StorageClasses, die den Azure Blob Storage-CSI-Treiber verwenden.

Die Freigaberichtlinie für beide Speicherklassen stellt sicher, dass beim Löschen eines persistenten Volumes auch der zugrunde liegende Azure-Blobspeicher gelöscht wird. Die Speicherklassen konfigurieren den Container auch so, dass er standardmäßig erweiterbar ist, da der Parameter set allowVolumeExpansion auf true festgelegt ist.

Hinweis

Das Verkleinern persistenter Volumes wird nicht unterstützt.

Sie können einen der folgenden Azure Storage-Redundanz-SKUs für den skuname Parameter in der Speicherklassendefinition auswählen:

  • Standard_LRS: Lokal redundanter Standardspeicher
  • Premium_LRS: Lokal redundanter Premium-Speicher
  • Standard_ZRS: Standard – zonenredundanter Speicher
  • Premium_ZRS: zonenredundanter Premiumspeicher (ZRS)
  • Standard_GRS: Standardmäßiger georedundanter Speicher
  • Standard_RAGRS: Standardmäßiger georedundanter Lesezugriffsspeicher

Erstellen benutzerdefinierter Speicherklassen für dynamische PVs mit Azure Blob Storage

Die Standardspeicherklassen eignen sich für die meisten Szenarien. In einigen Fällen sollten Sie ihre eigene Speicherklasse mit Ihren eigenen Parametern anpassen lassen. In diesem Abschnitt stellen wir zwei Beispiele bereit: eine mit DEM NFS-Protokoll und eine mit Blobfuse.

Beispiel für eine benutzerdefinierte Speicherklasse mithilfe des NFS-Protokolls

Das Manifest in diesem Beispiel bindet einen Blob-Speichercontainer mithilfe des NFS-Protokolls ein. Sie können ihn verwenden, um den tags Parameter hinzuzufügen.

  1. Erstellen Sie eine Datei namens blob-nfs-sc.yaml und fügen Sie sie in das folgende Beispielmanifest ein:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: blob-nfs
    provisioner: blob.csi.azure.com
    parameters:
      protocol: nfs
      tags: environment=Development
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  2. Erstellen Sie die Speicherklasse mit dem kubectl apply Befehl:

    kubectl apply -f blob-nfs-sc.yaml
    

    Ihre Ausgabe sollte in etwa wie die folgende Beispielausgabe aussehen:

    storageclass.storage.k8s.io/blob-nfs created
    

Beispiel für eine benutzerdefinierte Speicherklasse mit Blobfuse

Das Manifest in diesem Beispiel verwendet Blobfuse und bindet einen Blob-Speichercontainer ein. Sie können ihn verwenden, um den skuName Parameter zu aktualisieren.

  1. Erstellen Sie eine Datei namens blobfuse-sc.yaml und fügen Sie sie in das folgende Beispielmanifest ein:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: blob-fuse
    provisioner: blob.csi.azure.com
    parameters:
      skuName: Standard_GRS  # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - -o allow_other
      - --file-cache-timeout-in-seconds=120
      - --use-attr-cache=true
      - --cancel-list-on-mount-seconds=10  # prevent billing charges on mounting
      - -o attr_timeout=120
      - -o entry_timeout=120
      - -o negative_timeout=120
      - --log-level=LOG_WARNING  # LOG_WARNING, LOG_INFO, LOG_DEBUG
      - --cache-size-mb=1000  # Default will be 80% of available memory, eviction will happen beyond that.
    
  2. Erstellen Sie die Speicherklasse mit dem kubectl apply Befehl:

    kubectl apply -f blobfuse-sc.yaml
    

    Ihre Ausgabe sollte in etwa wie die folgende Beispielausgabe aussehen:

    storageclass.storage.k8s.io/blob-fuse created
    

Speicherklassenparameter für dynamische PVs mit Azure Blob Storage

Verwenden Sie die folgenden Parametergruppen, um eine benutzerdefinierte Speicherklasse für Ihre persistenten Volumeansprüche (PVCs) mit Azure Blob-Speicher zu definieren:

  • Speicherkonto: skuName, , location, resourceGroup, storageAccountsubscriptionID, networkEndpointType, accessTier, allowBlobPublicAccesspublicNetworkAccesstagsallowSharedKeyAccessrequireInfraEncryptionund .matchTags
  • Container und Endpunkt: protocol, , containerNamePrefixuseDataPlaneAPIservercontainerNamestorageEndpointSuffix, softDeleteBlobs, und . softDeleteContainersenableBlobVersioning
  • BlobFuse: storeAccountKey, , getLatestAccountKey, secretName, secretNamespace, und isHnsEnabled.
  • NFS: mountPermissions und fsGroupChangePolicy.
  • Virtuelles Netzwerk: vnetResourceGroup, vnetName, , subnetNameund vnetLinkName.

Konfigurieren von Speicherkontoparametern für dynamische PVs mit Azure Blob-Speicher

Verwenden Sie die folgenden Parameter, um das Azure Speicherkonto für ein dynamisch bereitgestelltes PV zu konfigurieren:

Name Bedeutung Verfügbare Werte Erforderlich Standardwert
skuName Geben Sie einen Azure-Speicherkontotyp an (Alias: storageAccountType). Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS, , Standard_ZRS, Premium_ZRS Nein Standard_LRS
location Geben Sie einen Azure-Speicherort an. eastus Nein Wenn er leer ist, verwendet der Treiber denselben Speicherortnamen wie der aktuelle Cluster.
resourceGroup Geben Sie einen Azure-Ressourcengruppennamen an. myResourceGroup Nein Ohne Angabe verwendet der Treiber den gleichen Ressourcengruppennamen wie der aktuelle Cluster.
subscriptionID Geben Sie die Azure-Abonnement-ID an, in der das BLOB-Speicherverzeichnis erstellt wird. Azure-Abonnement-ID Nein Ist dieser Wert nicht leer, muss resourceGroup angegeben werden.
storageAccount Geben Sie einen Azure-Speicherkontonamen an. storageAccountName Nein Wenn kein bestimmter Speicherkontoname angegeben wird, sucht der Treiber nach einem geeigneten Speicherkonto, das den Kontoeinstellungen innerhalb derselben Ressourcengruppe entspricht. Wenn ein übereinstimmende Speicherkonto nicht gefunden werden kann, wird ein neues Konto erstellt. Falls jedoch ein Speicherkontoname angegeben wird, muss das Speicherkonto bereits vorhanden sein.
networkEndpointType Geben Sie den Netzwerkendpunkttyp für das vom Treiber erstellte Speicherkonto an. Wenn Sie angeben privateEndpoint, erstellt der Treiber einen privaten Endpunkt für das Speicherkonto. In anderen Fällen erstellt der Treiber einen Dienstendpunkt für das NFS-Protokoll. "", privateEndpoint Nein "". Für einen AKS-Cluster fügen Sie den Namen des AKS-Clusters der Contributor-Rolle in der Ressourcengruppe hinzu, die das virtuelle Netzwerk hostet.
accessTier Geben Sie die Zugriffsebene für das Speicherkonto an. Hot, CoolPremium Nein Verwendet die Standardebene für den ausgewählten Speicherkontotyp. Premium-Konten unterstützen nur Premium.
allowBlobPublicAccess Zulassen oder Verbieten des öffentlichen Zugriffs auf alle Blobs oder Container für ein vom Treiber erstelltes Speicherkonto. true, false Nein false
allowSharedKeyAccess Zulassen oder Verbieten des Zugriffs auf gemeinsam genutzte Schlüssel für ein speicherkonto, das vom Treiber erstellt wurde. Dieser Parameter gilt für NFS-Bereitstellungen und BlobFuse-Bereitstellungen, die verwaltete Identität verwenden. true, false Nein true
requireInfraEncryption Erfordert eine sekundäre Ebene der plattformverwalteten Verschlüsselung für ruhende Daten in einem Speicherkonto, das vom Treiber erstellt wurde. true, false Nein false
publicNetworkAccess Legen Sie die Eigenschaft für den Zugriff auf das öffentliche Netzwerk für ein Speicherkonto fest, das vom Treiber erstellt wurde. Enabled, DisabledSecuredByPerimeter Nein Verwendet die Azure Storage Standardeinstellung.
tags Erstellen Sie Tags für ein neues Speicherkonto. Tagformat: foo=aaa,bar=bbb Nein ""
matchTags Stimmen Sie Tags ab, wenn der Treiber nach einem geeigneten Speicherkonto sucht. true, false Nein false

Konfigurieren von Container- und Endpunktparametern für dynamische PVs mit Azure Blob Storage

Verwenden Sie die folgenden Parameter, um den Container, das Bereitstellungsprotokoll, den Speicherendpunkt und tags für eine dynamisch bereitgestellte PV zu konfigurieren:

Name Beschreibung Verfügbare Werte Erforderlich Standardwert
protocol Geben Sie BlobFuse, BlobFuse2 oder NFS v3 mount an. fuse, fuse2nfs Nein fuse
containerName Geben Sie den Namen des vorhandenen Containers (Verzeichnisses) an. container Nein Wenn der Treiber leer ist, erstellt der Treiber einen neuen Containernamen, beginnend mit pvc-fuse blobfuse oder pvc-nfs für NFS v3.
containerNamePrefix Geben Sie das Vom Treiber erstellte Azure-Speicherverzeichnispräfix an. Darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten und darf maximal 21 Zeichen lang sein. Nein
server Geben Sie den Domänennamen des Azure-Speicherkontos an. Vorhandener DNS-Domänenname des Speicherkontos, z. B <storage-account>.blob.core.windows.net. . Nein Wenn leer, verwendet der Treiber standardmäßige <storage-account>.blob.core.windows.net oder andere souveräne Cloudspeicherkonto-DNS-Domänennamen.
storageEndpointSuffix Geben Sie das Suffix für den Azure-Speicherendpunkt an. core.windows.net Nein Ohne Angabe verwendet der Treiber das Standardsuffix für den Speicherendpunkt gemäß der Cloudumgebung.
useDataPlaneAPI Verwenden Sie die Azure Storage Datenebenen-API zum Erstellen und Löschen von Containern. Diese Option kann die Drosselung von Speicherressourcenanbietern vermeiden, schlägt jedoch fehl, wenn die Firewall des Speicherkontos oder virtuelle Netzwerkregeln den Zugriff auf die Datenebene blockieren. true, false Nein false
softDeleteBlobs Aktivieren Sie das vorläufige Löschen für Blobs, und geben Sie den Aufbewahrungszeitraum in Tagen an. Ein Aufbewahrungszeitraum, z. B. 7 Nein Deaktiviert
softDeleteContainers Aktivieren Sie das vorläufige Löschen für Container, und geben Sie den Aufbewahrungszeitraum in Tagen an. Ein Aufbewahrungszeitraum, z. B. 7 Nein Deaktiviert
enableBlobVersioning Blob-Versionsverwaltung aktivieren. Sie können die Versionsverwaltung nicht aktivieren, wenn protocol das ist nfs oder isHnsEnabled ist true. true, false Nein false

Konfigurieren von BlobFuse-Parametern für dynamische PVs mit Azure Blob Storage

Die folgenden Parameter gelten nur, wenn Sie BlobFuse für eine dynamisch bereitgestellte PV verwenden:

Name Beschreibung Verfügbare Werte Erforderlich Standardwert
storeAccountKey Geben Sie den Speicherkontoschlüssel für Kubernetes geheim an.

Hinweis:
false bedeutet, dass der Treiber die Kubelet-Identität verwendet, um den Kontoschlüssel zu erhalten.
true,false Nein true
getLatestAccountKey Rufen Sie den neuesten Speicherkontoschlüssel basierend auf der Erstellungszeit ab, anstatt den ersten Schlüssel zu verwenden. true, false Nein false
secretName Geben Sie den geheimen Namen zum Speichern des Kontoschlüssels an. Nein
secretNamespace Geben Sie den Namespace des Geheimnisses zum Speichern des Kontoschlüssels an. default,kube-system, usw. Nein PVC-Namespace
isHnsEnabled Aktivieren Hierarchical namespace sie für ein Azure Data Lake Storage Konto. true,false Nein false

Konfigurieren von NFS-Parametern für dynamische PVs mit Azure Blob Storage

Der folgende Parameter gilt nur, wenn Sie NFS für eine dynamisch bereitgestellte PV verwenden:

Name Beschreibung Verfügbare Werte Erforderlich Standardwert
mountPermissions Geben Sie Berechtigungen für bereitgestellte Ordner an. Der Standardwert lautet 0777. Wenn auf 0 gesetzt, führt der Treiber chmod nach dem Mounten nicht aus. Nein 0777
fsGroupChangePolicy Geben Sie an, wie der Treiber den Volumenbesitz ändert. Der Treiber ignoriert securityContext.fsGroupChangePolicy in der Podspezifikation. OnRootMismatch, AlwaysNone Nein OnRootMismatch

Konfigurieren von Parametern für virtuelle Netzwerke für dynamische PVs mit Azure Blob-Speicher

Verwenden Sie die folgenden Parameter, wenn der Treiber den Virtuellen Netzwerkzugriff für eine dynamisch bereitgestellte PV konfiguriert:

Name Beschreibung Verfügbare Werte Erforderlich Standardwert
vnetResourceGroup Geben Sie die Ressourcengruppe an, die das virtuelle Netzwerk enthält. Vorhandener Ressourcengruppenname Nein Verwendet den vnetResourceGroup Wert in der Azure Cloudkonfiguration.
vnetName Geben Sie den Namen des virtuellen Netzwerks an. Vorhandener Name des virtuellen Netzwerks Nein Verwendet den vnetName Wert in der Azure Cloudkonfiguration.
subnetName Geben Sie ein oder mehrere vorhandene AKS-Knoten-Subnetze an. Trennen Sie mehrere Subnetznamen durch Kommas. Vorhandene Subnetznamen Nein Aktualisiert alle Subnetze im virtuellen Clusternetzwerk.
vnetLinkName Geben Sie die virtuelle Netzwerkverbindung an, die der privaten DNS-Zone zugeordnet ist. Vorhandener oder neuer Name der virtuellen Netzwerkverbindung Nein <vnetName>-vnetlink

Konfigurieren privater Endpunkte für dynamische PVs mit Azure Blob-Speicher

Hinweis

Wenn das Speicherkonto vom Treiber erstellt wird, müssen Sie nur den Parameter in der Speicherklasse angeben networkEndpointType: privateEndpoint . Der CSI-Treiber erstellt zusammen mit dem Konto den privaten Endpunkt und die private DNS-Zone (benannt privatelink.blob.core.windows.net). Wenn Sie Ihr eigenes Speicherkonto verwenden, müssen Sie den privaten Endpunkt für das Speicherkonto erstellen. Wenn Sie Azure Blob Storage in einem isolierten Netzwerkcluster verwenden, müssen Sie eine benutzerdefinierte Speicherklasse mit "networkEndpointType: privateEndpoint" erstellen. Sie können das folgende Beispielmanifest als Verweis verwenden:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: blob-fuse
provisioner: blob.csi.azure.com
parameters:
  skuName: Premium_LRS  # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS, Standard_ZRS, Premium_ZRS
  protocol: fuse2
  networkEndpointType: privateEndpoint
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - -o allow_other
  - --file-cache-timeout-in-seconds=120
  - --use-attr-cache=true
  - --cancel-list-on-mount-seconds=10  # prevent billing charges on mounting
  - -o attr_timeout=120
  - -o entry_timeout=120
  - -o negative_timeout=120
  - --log-level=LOG_WARNING  # LOG_WARNING, LOG_INFO, LOG_DEBUG
  - --cache-size-mb=1000  # Default will be 80% of available memory, eviction will happen beyond that.

Erstellen eines PVC für dynamische Bereitstellung

Ein PVC verwendet das Speicherklassenobjekt, um einen Azure Blob Storage dynamisch bereitzustellen. Sie können das Beispiel-YAML-Manifest in diesem Abschnitt verwenden, um ein PVC zu erstellen, das mit ReadWriteMany-Zugriff5 GB groß ist. Weitere Informationen zu Zugriffsmodi finden Sie unter Kubernetes PV-Zugriffsmodi.

  1. Erstellen Sie eine Datei mit dem Namen blob-nfs-pvc.yaml und fügen Sie das folgende YAML-Manifest darin ein:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azure-blob-storage
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: azureblob-nfs-premium
      resources:
        requests:
          storage: 5Gi
    
  2. Erstellen Sie das PVC mit dem kubectl create Befehl:

    kubectl create -f blob-nfs-pvc.yaml
    
  3. Sehen Sie sich den Status des PVC mit dem kubectl get Befehl an:

    kubectl get pvc azure-blob-storage
    

    Ihre Ausgabe sollte der folgenden Beispielausgabe ähneln, die zeigt, dass sich das PVC in einem Bound Zustand befindet:

    NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    azure-blob-storage   Bound    pvc-aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb   5Gi        RWX            azureblob-nfs-premium       92m
    

Bereitstellen eines dynamisch bereitgestellten BLOB-Speichervolumes in einem Pod

Mit der folgenden YAML wird ein Pod erstellt, der den Anspruch azure-blob-storage verwendet, um den Azure Blob Storage unter dem Pfad /mnt/blob zu mounten.

  1. Erstellen Sie eine Datei namens blob-nfs-pv, und fügen Sie das folgende YAML-Manifest ein. Stellen Sie sicher, dass die claimName Übereinstimmung mit dem PVC übereinstimmt, das Sie zuvor erstellt haben (azure-blob-storage).

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
        - mountPath: "/mnt/blob"
          name: volume
          readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-blob-storage
    
  2. Erstellen Sie den Pod mithilfe des kubectl apply Befehls:

    kubectl apply -f blob-nfs-pv.yaml
    
  3. Nachdem der Pod erfolgreich ausgeführt wurde, erstellen Sie eine neue Datei test.txt mit dem folgenden Befehl:

    kubectl exec mypod -- touch /mnt/blob/test.txt
    
  4. Überprüfen Sie, ob der Datenträger ordnungsgemäß bereitgestellt wird, indem Sie den folgenden Befehl verwenden, um die Dateien im bereitgestellten Verzeichnis auflisten zu können:

    kubectl exec mypod -- ls /mnt/blob
    

    Ihre Ausgabe sollte der folgenden Beispielausgabe ähneln, die die test.txt Datei zeigt, die Sie im eingebundenen Azure Blob Storage erstellt haben.

    test.txt
    

Verwenden eines StatefulSet zum Verwalten des Lebenszyklus eines Volumes mit Azure Blob Storage

Sie können ein StatefulSet verwenden, um ein Speichervolumen für Ihre Workload beizubehalten. Dieser Status erleichtert die Zuordnung vorhandener Volumes zu neuen Pods, die ausgefallene Volumes ersetzen. Die folgenden Beispiele veranschaulichen, wie Ein StatefulSet für Blob-Speicher mit dem NFS-Protokoll oder Blobfuse eingerichtet wird.

Hinweis

Wenn Sie das NFS-Protokoll verwenden, muss Ihre AKS-Cluster-Steuerebene-Identität (Ihr AKS-Cluster-Name) der Mitwirkenden-Rolle in der virtuellen Netzwerk- und Netzwerksicherheitsgruppe hinzugefügt werden.

  1. Erstellen Sie eine Datei mit dem Namen azure-blob-nfs-ss.yaml und fügen Sie das folgende YAML-Manifest darin ein:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: statefulset-blob-nfs
      labels:
        app: nginx
    spec:
      serviceName: statefulset-blob-nfs
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
            - name: statefulset-blob-nfs
              image: mcr.microsoft.com/azurelinux/base/nginx:1.25
              volumeMounts:
                - name: persistent-storage
                  mountPath: /mnt/blob
      updateStrategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app: nginx
      volumeClaimTemplates:
        - metadata:
            name: persistent-storage
          spec:
            storageClassName: azureblob-nfs-premium
            accessModes: ["ReadWriteMany"]
            resources:
              requests:
                storage: 100Gi
    
  2. Erstellen Sie das StatefulSet mithilfe des kubectl create Befehls:

    kubectl create -f azure-blob-nfs-ss.yaml
    

Erstellen einer statischen PV mit Azure Blob Storage

Die folgenden Abschnitte enthalten Anweisungen zum Erstellen einer statischen PV mit Azure Blob Storage. Ein statisches PV ist ein persistentes Volume, das ein Administrator manuell erstellt. Diese PV ist für die Verwendung durch Pods im Cluster verfügbar. Um eine statische PV zu verwenden, erstellen Sie ein PVC, das auf die PV verweist, und dann erstellen Sie einen Pod, der auf das PVC verweist.

CSI-Volumeparameter für statische PVs mit Azure Blob-Speicher

In der folgenden Tabelle sind Parameter aufgeführt, die Sie in der CSI-Volumequelle für eine statische PV mit Azure Blob-Speicher verwenden können:

Name Bedeutung Verfügbare Werte Erforderlich Standardwert
volumeHandle Geben Sie einen Wert an, den der Treiber verwenden kann, um den Speicher-BLOB-Container im Cluster eindeutig zu identifizieren. Eine empfohlene Möglichkeit zum Erstellen eines eindeutigen Werts besteht darin, den Namen und den Containernamen des global eindeutigem Speicherkontos zu kombinieren: {account-name}_{container-name}.
Hinweis: Die #, / Zeichen sind für die interne Verwendung reserviert und können nicht in einem Volume-Handle verwendet werden.
Ja
volumeAttributes.subscriptionID Geben Sie die Azure Abonnement-ID an, in der sich das Speicherkonto befindet. Azure-Abonnement-ID Nein Ist dieser Wert nicht leer, muss volumeAttributes.resourceGroup angegeben werden.
volumeAttributes.resourceGroup Geben Sie den Namen der Azure-Ressourcengruppe an. myResourceGroup Nein Ohne Angabe verwendet der Treiber den gleichen Ressourcengruppennamen wie der aktuelle Cluster.
volumeAttributes.storageAccount Geben Sie den Namen eines vorhandenen Azure-Speicherkontos an. storageAccountName Ja
volumeAttributes.containerName Geben Sie den vorhandenen Containernamen an. container Ja
volumeAttributes.protocol Geben Sie BlobFuse, BlobFuse2 oder NFS v3 mount an. fuse, fuse2nfs Nein fuse
volumeAttributes.server Geben Sie die Serveradresse des Azure-Speicherkontos an. Vorhandene Serveradresse, z. B. <storage-account>.blob.core.windows.net Nein Verwendet die Standardserveradresse für die aktuelle Cloudumgebung.
volumeAttributes.storageEndpointSuffix Geben Sie das Suffix des Azure Speicherendpunkts an. core.windows.netoder das Suffix für eine andere Azure Cloud Nein Verwendet das Standardsuffix für die aktuelle Cloudumgebung.
--- Die folgenden Parameter gelten nur für Blobfuse --- --- ---
volumeAttributes.secretName Geheimer Name, der den Speicherkontonamen und den Schlüssel speichert (gilt nur für SMB). Nein
volumeAttributes.secretNamespace Geben Sie den Namespace des Secrets zum Speichern des Kontoschlüssels an. default Nein PVC-Namespace
volumeAttributes.getLatestAccountKey Rufen Sie den neuesten Speicherkontoschlüssel basierend auf der Erstellungszeit ab, anstatt den ersten Schlüssel zu verwenden. true, false Nein false
nodeStageSecretRef.name Geben Sie den Namen des geheimen Kubernetes-Schlüssels an, der Anmeldeinformationen für das Staging des Volumes enthält. Vorhandener Kubernetes geheimer Name. Das Geheimnis muss einen der folgenden Schlüssel enthalten: azurestorageaccountkey, , azurestorageaccountsastoken, , msisecretoder azurestoragespnclientsecret. Nein
nodeStageSecretRef.namespace Geben Sie den Namespace des Secrets an. Kubernetes-Namespace Ja
--- Die folgenden Parameter gelten nur für das NFS-Protokoll. --- --- ---
volumeAttributes.mountPermissions Geben Sie Berechtigungen für bereitgestellte Ordner an. 0777 Nein
volumeAttributes.fsGroupChangePolicy Geben Sie an, wie der Treiber den Volumenbesitz ändert. Der Treiber ignoriert securityContext.fsGroupChangePolicy in der Podspezifikation. OnRootMismatch, AlwaysNone Nein OnRootMismatch
--- Die folgenden Parameter gelten nur für das Feature: blobfuse
Verwaltete Identitäts- und Dienstprinzipalnamenauthentifizierung
--- --- ---
volumeAttributes.AzureStorageAuthType Gibt den Authentifizierungstyp an. Key SAS MSI SPN Nein Key
volumeAttributes.AzureStorageIdentityClientID Geben Sie die Identitätsclient-ID an. Nein
volumeAttributes.AzureStorageIdentityObjectID Geben Sie die Id des Identitätsobjekts an. Dieser Parameter ist veraltet. Nein
volumeAttributes.AzureStorageIdentityResourceID Geben Sie die Identitätsressourcen-ID an. Nein
volumeAttributes.MSIEndpoint Geben Sie den MSI-Endpunkt an. Nein
volumeAttributes.AzureStorageSPNClientID Geben Sie die Azure Service Principal Name (SPN)-Client-ID an. Nein
volumeAttributes.AzureStorageSPNTenantID Geben Sie die Mandanten-ID von Azure SPN an. Nein
volumeAttributes.AzureStorageAADEndpoint Geben Sie den Microsoft Entra-Endpunkt an. Nein
--- Die folgenden Parameter gelten nur für die Identitätsauthentifizierung der Blobfuse-Workload --- --- ---
volumeAttributes.ClientID Geben Sie die Client-ID der verwalteten Identität an, die für die Workloadidentitätsauthentifizierung verwendet wird. Client-ID für verwaltete Identität Nein
volumeAttributes.mountWithWorkloadIdentityToken Mount BlobFuse with a workload identity token. Diese Funktion befindet sich in der Vorschauphase. Geben Sie den Wert als Zeichenfolge an. "true", "false" Nein "false"
--- Die folgenden Parameter gelten nur für das Feature: Blobfuse liest den Kontoschlüssel oder SAS-Token aus dem Schlüsseltresor --- --- ---
volumeAttributes.keyVaultURL Geben Sie den DNS-Namen des Azure Key Vault an. {vault-name}.vault.azure.net Nein
volumeAttributes.keyVaultSecretName Geben Sie den geheimen Azure Key Vault-Namen an. Vorhandener geheimer Name von Azure Key Vault. Nein
volumeAttributes.keyVaultSecretVersion Version des Azure Key Vault-Geheimnisses. Vorhandene Version Nein Wenn leer, verwendet der Treiber die aktuelle Version.

Erstellen eines Blobspeichercontainers

Wenn Sie eine Azure Blob Storage-Ressource für die Verwendung mit AKS erstellen, können Sie die Ressource in der Knotenressourcengruppe erstellen. Mit diesem Ansatz kann der AKS-Cluster auf die BLOB-Speicherressource zugreifen und diese verwalten.

  1. Rufen Sie den Namen der Knotenressourcengruppe Ihres AKS-Clusters mithilfe des az aks show Befehls mit dem --query nodeResourceGroup Parameter ab.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

    Die Ausgabe des Befehls sieht in etwa wie im folgenden Beispiel aus:

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. Wenn Sie das Speicherkonto in der Knotenressourcengruppe erstellen, verwenden Sie den im vorherigen Schritt zurückgegebenen Knotenressourcengruppennamen (z. B MC_myResourceGroup_myAKSCluster_eastus. ). Führen Sie dann die Schritte unter "Blob-Speicher verwalten " aus, um den Zugriff zu autorisieren und einen Container in diesem Speicherkonto zu erstellen.

Volume einbinden

In diesem Abschnitt binden Sie ein persistentes Volume mithilfe des NFS-Protokolls oder Blobfuse ein.

Für das Speicherkonto muss NFS v3 und hierarchischer Namespace aktiviert sein. Das Einbinden von BLOB-Speicher mithilfe des NFS v3-Protokolls authentifiziert sich nicht mithilfe eines Kontoschlüssels. Das Subnetz des AKS-Knotens muss netzwerkzugriff auf das NFS-fähige Speicherkonto über ein ausgewähltes virtuelles Netzwerk oder einen privaten Endpunkt verfügen. Stellen Sie sicher, dass Netzwerksicherheitsgruppen NFS-Datenverkehr an den Ports 111 und 2048 zulassen. Weitere Informationen zum Einrichten des NFS-Zugriffs auf Ihr Speicherkonto finden Sie unter Mount Blob Storage mithilfe des Network File System (NFS) 3.0-Protokolls.

Im folgenden Beispiel wird veranschaulicht, wie sie einen BLOB-Speichercontainer mithilfe des NFS-Protokolls als persistentes Volume bereitstellen.

  1. Erstellen Sie eine Datei mit dem Namen pv-blob-nfs.yaml , und fügen Sie den folgenden YAML-Code ein. Unter spec.csi.volumeAttributes, aktualisieren Sie resourceGroup, storageAccountund containerName.

    Hinweis

    Der Wert volumeHandle sollte eine eindeutige volumeID für jeden identischen Speicherblobcontainer im Cluster sein. Das Zeichen # und / sind für die interne Verwendung reserviert und können nicht verwendet werden.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: blob.csi.azure.com
      name: pv-blob
    spec:
      capacity:
        storage: 1Pi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain  # If set as "Delete" container would be removed after pvc deletion
      storageClassName: azureblob-nfs-premium
      csi:
        driver: blob.csi.azure.com
        # make sure volumeid is unique for every identical storage blob container in the cluster
        # character `#` and `/` are reserved for internal use and cannot be used in volumehandle
        volumeHandle: account-name_container-name
        volumeAttributes:
          resourceGroup: resourceGroupName
          storageAccount: storageAccountName
          containerName: containerName
          protocol: nfs
    

    Hinweis

    Während das Kubernetes-API-Kapazitätsattribut obligatorisch ist, verwendet der Azure Blob Storage CSI-Treiber diesen Wert nicht, da Sie Daten flexibel schreiben können, bis Sie das Kapazitätslimit Ihres Speicherkontos erreicht haben. Der Wert wird nur für den Größenabgleich zwischen PVs und PVCs verwendet. Im Beispiel wird ein fiktiver Wert von 1Pi; dieser Wert legt nicht die Kapazität des Blob-Speichercontainers fest.

  2. Erstellen Sie das PV mithilfe des kubectl create Befehls:

    kubectl create -f pv-blob-nfs.yaml
    
  3. Erstellen Sie eine Datei namens pvc-blob-nfs.yaml , und fügen Sie sie in das folgende YAML ein. Aktualisieren Sie unter volumeName den Wert so, dass er dem Namen der PV entspricht, die im vorherigen Schritt erstellt wurde.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-blob
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-blob
      storageClassName: azureblob-nfs-premium
    
  4. Erstellen Sie das PVC mit dem kubectl create Befehl:

    kubectl create -f pvc-blob-nfs.yaml
    

Verwenden Sie das persistente Volume

Mit dem folgenden YAML wird ein Pod erstellt, der das zuvor erstellte PV oder PVC mit dem Namen pvc-blob verwendet, um den Azure Blob-Speicher im Pfad /mnt/blob einzubinden.

  1. Erstellen Sie eine Datei mit dem Namen nginx-pod-blob.yaml , und fügen Sie sie im folgenden YAML-Manifest ein. Stellen Sie sicher, dass die claimName Übereinstimmung mit dem zuvor erstellten PVC (pvc-blob) übereinstimmt.

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-blob
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
          name: nginx-blob
          volumeMounts:
            - name: blob01
              mountPath: "/mnt/blob"
              readOnly: false
      volumes:
        - name: blob01
          persistentVolumeClaim:
            claimName: pvc-blob
    
  2. Erstellen Sie den Pod, und fügen Sie das PVC mit dem kubectl create Befehl an:

    kubectl create -f nginx-pod-blob.yaml
    
  3. Erstellen Sie eine interaktive Shellsitzung mit dem Pod, um zu überprüfen, ob der Blob-Speicher ordnungsgemäß bereitgestellt wird, indem Sie den folgenden kubectl exec Befehl verwenden:

    kubectl exec -it nginx-blob -- df -h
    

    Die Ausgabe sollte der folgenden Beispielausgabe ähneln, die zeigt, dass der Blob-Speicher am /mnt/blob Pfad bereitgestellt wird:

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    blobfuse         14G   41M   13G   1% /mnt/blob
    ...