Azure Kubernetes Service'te (AKS) ağaç içi depolama sınıfından CSI sürücülerine geçiş

Kapsayıcı Depolama Arabirimi (CSI) sürücüsünün uygulanması, 1.21 sürümünden itibaren Azure Kubernetes Service'te (AKS) kullanıma sunulmuştur. CSI'yi standart olarak benimseyerek ve kullandığınızda, ağaç içi Kalıcı Birimleri (PV) kullanan mevcut durum bilgisi olan iş yükleriniz CSI sürücüsünü kullanacak şekilde geçirilmelidir veya yükseltilmelidir.

Bu işlemi olabildiğince basit hale getirmek ve veri kaybı olmamasını sağlamak için bu makalede farklı geçiş seçenekleri sağlanır. Bu seçenekler arasında ağaç içinden Azure Disklere ve Azure Dosyalar CSI sürücülerine sorunsuz bir geçiş sağlamaya yardımcı olan betikler bulunur.

Başlamadan önce

  • Azure CLI sürüm 2.37.0 veya üzeri. Sürümü bulmak için komutunu az --version çalıştırın ve sürümü yükseltmek için komutunu çalıştırın az upgrade . Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.
  • Kubectl ve küme yöneticileri pvc veya PV, birim anlık görüntüsü veya birim anlık görüntüsü içeriği oluşturma, alma, listeleme, silme erişimine sahiptir. Microsoft Entra RBAC özellikli bir kümede, Azure Kubernetes Service RBAC Kümesi Yöneticisi rolünün bir üyesisiniz.

Disk birimlerini geçirme

Not

ve etiketleri failure-domain.beta.kubernetes.io/zone failure-domain.beta.kubernetes.io/region AKS 1.24'te kullanım dışı bırakıldı ve 1.28'de kaldırıldı. Mevcut kalıcı birimleriniz hala bu iki etiketle eşleşen nodeAffinity kullanıyorsa, bunları yeni kalıcı birim ayarında ve topology.kubernetes.io/region etiketleri olarak topology.kubernetes.io/zone değiştirmeniz gerekir.

Ağaç içi geçişten CSI'ye geçiş iki geçiş seçeneği kullanılarak desteklenir:

  • Statik birim oluşturma
  • Dinamik birim oluşturma

Statik birim oluşturma

Bu seçeneği kullanarak, daha sonra oluşturacağınız yeni bir PVC'ye statik olarak atayarak claimRef bir PV oluşturur ve PersistentVolumeClaim için öğesini volumeName belirtirsiniz.

Statik birim iş akışı diyagramı.

Bu yaklaşımın avantajları şunlardır:

  • Basit bir işlemdir ve otomatikleştirilebilir.
  • Ağaç içi depolama sınıfını kullanarak özgün yapılandırmayı temizlemeye gerek yoktur.
  • Kubernetes PV/PVC’nin yalnızca mantıksal silme işlemini gerçekleştirdiğinizden ve gerçek fiziksel veriler silinmediğinden risk düşüktür.
  • Disk, anlık görüntüler vb. gibi ek Azure nesneleri oluşturmak zorunda kalmama nedeniyle ek maliyet oluşmaz.

Değerlendirmede dikkat edilmesi gereken önemli noktalar şunlardır:

  • Özgün dinamik stildeki birimlerden statik birimlere geçişi tüm seçenekler için pv nesnelerinin el ile yapılmasını ve yönetilmesi gerekir.
  • YPVC nesnesine istinaden yeni uygulama yeniden dağıtılırken uygulamanın olası kapalı kalma süresi.

Geçiş

  1. Aşağıdaki komutu çalıştırarak mevcut PV'yi ReclaimPolicy Delete'den Koru'ya güncelleştirin:

    kubectl patch pv pvName -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    

    pvName değerini seçtiğiniz PersistentVolume adıyla değiştirin. Alternatif olarak, birden çok PC için reclaimPolicy'yi güncelleştirmek istiyorsanız, patchReclaimPVs.sh adlı bir dosya oluşturun ve aşağıdaki kodu kopyalayın.

    #!/bin/bash
    # Patch the Persistent Volume in case ReclaimPolicy is Delete
    NAMESPACE=$1
    i=1
    for PVC in $(kubectl get pvc -n $NAMESPACE | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        PV="$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.spec.volumeName}')"
        RECLAIMPOLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
        echo "Reclaim Policy for Persistent Volume $PV is $RECLAIMPOLICY"
        if [[ $RECLAIMPOLICY == "Delete" ]]; then
          echo "Updating ReclaimPolicy for $pv to Retain"
          kubectl patch pv $PV -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
        fi
      fi
    done
    

    Betiği parametresiyle yürüterek namespace küme ad alanını ./PatchReclaimPolicy.sh <namespace>belirtin.

  2. Aşağıdaki komutu çalıştırarak ad alanında creationTimestamp'a göre sıralanmış tüm PVC'lerin listesini alın. Gerçek küme ad alanıyla birlikte bağımsız değişkenini kullanarak --namespace ad alanını ayarlayın.

    kubectl get pvc -n <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    

    Bu adım, geçirilmesi gereken çok sayıda PC'niz varsa ve bir kerede birkaç tane geçirmek istiyorsanız yararlıdır. Bu komutu çalıştırmak, belirli bir zaman diliminde hangi PVC'lerin oluşturulduğunu belirlemenizi sağlar. CreatePV.sh betiğini çalıştırdığınızda, parametrelerin ikisi yalnızca bu süre boyunca PVC'leri geçirmenizi sağlayan başlangıç saati ve bitiş saatidir.

  3. CreatePV.sh adlı bir dosya oluşturun ve aşağıdaki kodu kopyalayın. Betik aşağıdakileri yapar:

    • depolama sınıfı storageClassNameiçin ad alanları içindeki tüm PersistentVolumes için adlı existing-pv-csi yeni bir PersistentVolume oluşturur.
    • Yeni PVC adını olarak existing-pvc-csiyapılandırın.
    • Belirttiğiniz PV adıyla yeni bir PVC oluşturur.
    #!/bin/bash
    #kubectl get pvc -n <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    # TimeFormat 2022-04-20T13:19:56Z
    NAMESPACE=$1
    FILENAME=$(date +%Y%m%d%H%M)-$NAMESPACE
    EXISTING_STORAGE_CLASS=$2
    STORAGE_CLASS_NEW=$3
    STARTTIMESTAMP=$4
    ENDTIMESTAMP=$5
    i=1
    for PVC in $(kubectl get pvc -n $NAMESPACE | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        PVC_CREATION_TIME=$(kubectl get pvc  $PVC -n $NAMESPACE -o jsonpath='{.metadata.creationTimestamp}')
        if [[ $PVC_CREATION_TIME >= $STARTTIMESTAMP ]]; then
          if [[ $ENDTIMESTAMP > $PVC_CREATION_TIME ]]; then
            PV="$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.spec.volumeName}')"
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            STORAGECLASS="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.storageClassName}')"
            echo $PVC
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            if [[ $RECLAIM_POLICY == "Retain" ]]; then
              if [[ $STORAGECLASS == $EXISTING_STORAGE_CLASS ]]; then
                STORAGE_SIZE="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.capacity.storage}')"
                SKU_NAME="$(kubectl get storageClass $STORAGE_CLASS_NEW -o jsonpath='{.parameters.skuname}')"
                DISK_URI="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.azureDisk.diskURI}')"
                PERSISTENT_VOLUME_RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
    
                cat >$PVC-csi.yaml <<EOF
        apiVersion: v1
        kind: PersistentVolume
        metadata:
          annotations:
            pv.kubernetes.io/provisioned-by: disk.csi.azure.com
          name: $PV-csi
        spec:
          accessModes:
          - ReadWriteOnce
          capacity:
            storage: $STORAGE_SIZE
          claimRef:
            apiVersion: v1
            kind: PersistentVolumeClaim
            name: $PVC-csi
            namespace: $NAMESPACE
          csi:
            driver: disk.csi.azure.com
            volumeAttributes:
              csi.storage.k8s.io/pv/name: $PV-csi
              csi.storage.k8s.io/pvc/name: $PVC-csi
              csi.storage.k8s.io/pvc/namespace: $NAMESPACE
              requestedsizegib: "$STORAGE_SIZE"
              skuname: $SKU_NAME
            volumeHandle: $DISK_URI
          persistentVolumeReclaimPolicy: $PERSISTENT_VOLUME_RECLAIM_POLICY
          storageClassName: $STORAGE_CLASS_NEW
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: $PVC-csi
      namespace: $NAMESPACE
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: $STORAGE_CLASS_NEW
      resources:
        requests:
          storage: $STORAGE_SIZE
      volumeName: $PV-csi
    EOF
                kubectl apply -f $PVC-csi.yaml
                LINE="PVC:$PVC,PV:$PV,StorageClassTarget:$STORAGE_CLASS_NEW"
                printf '%s\n' "$LINE" >>$FILENAME
              fi
            fi
          fi
        fi
      fi
    done
    
  4. Ad alanında tüm PersistentVolumes için yeni bir PersistentVolume oluşturmak için betiği aşağıdaki parametrelerle CreatePV.sh yürütür:

    • namespace - Küme ad alanı
    • sourceStorageClass - Ağaç içi depolama sürücüsü tabanlı StorageClass
    • targetCSIStorageClass- Sağlamayı disk.csi.azure.com veya file.csi.azure.com olarak ayarlanmış varsayılan depolama sınıflarından biri olabilecek CSI depolama sürücüsü tabanlı StorageClass. Ya da bu iki hazırlayıcıdan birine ayarlı olduğu sürece özel bir depolama sınıfı oluşturabilirsiniz.
    • startTimeStamp- PVC oluşturma zamanından önce yyyy-mm-ddthh:mm:ssz biçiminde bir başlangıç zamanı sağlayın
    • endTimeStamp- yyyy-mm-ddthh:mm:ssz biçiminde bir bitiş zamanı sağlayın.
    ./CreatePV.sh <namespace> <sourceIntreeStorageClass> <targetCSIStorageClass> <startTimestamp> <endTimestamp>
    
  5. Uygulamanızı yeni PVC'yi kullanacak şekilde güncelleştirin.

Dinamik birim oluşturma

Bu seçeneği kullanarak, Kalıcı Birim Talebi'nden dinamik olarak Kalıcı Birim oluşturursunuz.

Dinamik birim iş akışı diyagramı.

Bu yaklaşımın avantajları şunlardır:

  • Tüm yeni nesneler, anlık görüntülerle diğer kopyalar korurken oluşturulduğu için risk daha azdır.

  • PC’leri ayrı olarak oluşturmanıza ve PVC bildiriminde birim adı eklemenize gerek yoktur.

Değerlendirmede dikkat edilmesi gereken önemli noktalar şunlardır:

  • Bu yaklaşım daha az riskli olsa da depolama maliyetlerinizi artıracak birden çok nesne oluşturur.

  • Yeni birimlerin oluşturulması sırasında uygulamanız kullanılamaz.

  • Silme adımları dikkatle gerçekleştirilmelidir. Geçiş tamamlanana ve uygulamanız başarıyla doğrulanana kadar kaynak grubunuz için geçici kaynak kilitleri uygulanabilir.

  • Anlık görüntülerden yeni diskler oluşturulurken veri doğrulama işlemi gerçekleştirin.

Geçiş

Devam etmeden önce aşağıdakileri doğrulayın:

  • Diske yazılmadan önce verilerin belleğe yazıldığı belirli iş yükleri için uygulama durdurulmalı ve bellek içi verilerin diske boşaltılmasını sağlamalıdır.

  • VolumeSnapshot sınıfı, aşağıdaki ÖRNEK YAML'de gösterildiği gibi mevcut olmalıdır:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: custom-disk-snapshot-sc
    driver: disk.csi.azure.com
    deletionPolicy: Delete
    parameters:
      incremental: "false"
    
  1. Aşağıdaki komutu çalıştırarak belirtilen ad alanında creationTimestamp'a göre sıralanmış tüm PVC'lerin listesini alın. Gerçek küme ad alanıyla birlikte bağımsız değişkenini kullanarak --namespace ad alanını ayarlayın.

    kubectl get pvc --namespace <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    

    Bu adım, geçirilmesi gereken çok sayıda PC'niz varsa ve bir kerede birkaç tane geçirmek istiyorsanız yararlıdır. Bu komutu çalıştırmak, belirli bir zaman diliminde hangi PVC'lerin oluşturulduğunu belirlemenizi sağlar. MigrateCSI.sh betiğini çalıştırdığınızda, parametrelerin ikisi yalnızca bu süre boyunca PVC'leri geçirmenizi sağlayan başlangıç zamanı ve bitiş saatidir.

  2. MigrateToCSI.sh adlı bir dosya oluşturun ve aşağıdaki kodda kopyalayın. Betik aşağıdakileri yapar:

    • Azure CLI kullanarak tam disk anlık görüntüsü oluşturur
    • Oluşturur VolumesnapshotContent
    • Oluşturur VolumeSnapshot
    • Yeni bir PVC oluşturur VolumeSnapshot
    • Temizlenmesi gereken tüm eski kaynakların listesini içeren dosya adıyla <namespace>-timestampyeni bir dosya oluşturur.
    #!/bin/bash
    #kubectl get pvc -n <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    # TimeFormat 2022-04-20T13:19:56Z
    NAMESPACE=$1
    FILENAME=$NAMESPACE-$(date +%Y%m%d%H%M)
    EXISTING_STORAGE_CLASS=$2
    STORAGE_CLASS_NEW=$3
    VOLUME_STORAGE_CLASS=$4
    START_TIME_STAMP=$5
    END_TIME_STAMP=$6
    i=1
    for PVC in $(kubectl get pvc -n $NAMESPACE | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        PVC_CREATION_TIME=$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.metadata.creationTimestamp}')
        if [[ $PVC_CREATION_TIME > $START_TIME_STAMP ]]; then
          if [[ $END_TIME_STAMP > $PVC_CREATION_TIME ]]; then
            PV="$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.spec.volumeName}')"
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            STORAGE_CLASS="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.storageClassName}')"
            echo $PVC
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            if [[ $STORAGE_CLASS == $EXISTING_STORAGE_CLASS ]]; then
              STORAGE_SIZE="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.capacity.storage}')"
              SKU_NAME="$(kubectl get storageClass $STORAGE_CLASS_NEW -o jsonpath='{.parameters.skuname}')"
              DISK_URI="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.azureDisk.diskURI}')"
              TARGET_RESOURCE_GROUP="$(cut -d'/' -f5 <<<"$DISK_URI")"
              echo $DISK_URI
              SUBSCRIPTION_ID="$(echo $DISK_URI | grep -o 'subscriptions/[^/]*' | sed 's#subscriptions/##g')"
              echo $TARGET_RESOURCE_GROUP
              PERSISTENT_VOLUME_RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
              az snapshot create --resource-group $TARGET_RESOURCE_GROUP --name $PVC-$FILENAME --source "$DISK_URI" --subscription ${SUBSCRIPTION_ID}
              SNAPSHOT_PATH=$(az snapshot list --resource-group $TARGET_RESOURCE_GROUP --query "[?name == '$PVC-$FILENAME'].id | [0]" --subscription ${SUBSCRIPTION_ID})
              SNAPSHOT_HANDLE=$(echo "$SNAPSHOT_PATH" | tr -d '"')
              echo $SNAPSHOT_HANDLE
              sleep 10
              # Create Restore File
              cat <<EOF >$PVC-csi.yml
        apiVersion: snapshot.storage.k8s.io/v1
        kind: VolumeSnapshotContent
        metadata:
          name: $PVC-$FILENAME
        spec:
          deletionPolicy: 'Delete'
          driver: 'disk.csi.azure.com'
          volumeSnapshotClassName: $VOLUME_STORAGE_CLASS
          source:
            snapshotHandle: $SNAPSHOT_HANDLE
          volumeSnapshotRef:
            apiVersion: snapshot.storage.k8s.io/v1
            kind: VolumeSnapshot
            name: $PVC-$FILENAME
            namespace: $1
    ---
        apiVersion: snapshot.storage.k8s.io/v1
        kind: VolumeSnapshot
        metadata:
          name: $PVC-$FILENAME
          namespace: $1
        spec:
          volumeSnapshotClassName: $VOLUME_STORAGE_CLASS
          source:
            volumeSnapshotContentName: $PVC-$FILENAME
    ---
        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: csi-$PVC
          namespace: $1
        spec:
          accessModes:
          - ReadWriteOnce
          storageClassName: $STORAGE_CLASS_NEW
          resources:
            requests:
              storage: $STORAGE_SIZE
          dataSource:
            name: $PVC-$FILENAME
            kind: VolumeSnapshot
            apiGroup: snapshot.storage.k8s.io
    
    EOF
              kubectl create -f $PVC-csi.yml
              LINE="OLDPVC:$PVC,OLDPV:$PV,VolumeSnapshotContent:volumeSnapshotContent-$FILENAME,VolumeSnapshot:volumesnapshot$FILENAME,OLDdisk:$DISK_URI"
              printf '%s\n' "$LINE" >>$FILENAME
            fi
          fi
        fi
      fi
    done
    
  3. Disk birimlerini geçirmek için betik MigrateToCSI.sh aşağıdaki parametrelerle yürütür:

    • namespace - Küme ad alanı
    • sourceStorageClass - Ağaç içi depolama sürücüsü tabanlı StorageClass
    • targetCSIStorageClass - CSI depolama sürücüsü tabanlı StorageClass
    • volumeSnapshotClass - Birim anlık görüntü sınıfının adı. Örneğin, custom-disk-snapshot-sc.
    • startTimeStamp- yyyy-mm-ddthh:mm:ssz biçiminde bir başlangıç zamanı sağlayın.
    • endTimeStamp- yyyy-mm-ddthh:mm:ssz biçiminde bir bitiş zamanı sağlayın.
    ./MigrateToCSI.sh <namespace> <sourceStorageClass> <TargetCSIstorageClass> <VolumeSnapshotClass> <startTimestamp> <endTimestamp>
    
  4. Uygulamanızı yeni PVC'yi kullanacak şekilde güncelleştirin.

  5. Ağaç içi PVC/PV, VolumeSnapshot ve VolumeSnapshotContent gibi eski kaynakları el ile silin. Aksi takdirde ağaç içi PVC/PC ve anlık görüntü nesnelerinin korunması daha fazla maliyete neden olacaktır.

Dosya paylaşımı birimlerini geçirme

Ağaç içi birimden CSI'ye geçiş, statik birim oluşturularak desteklenir:

  • Ağaç içi depolama sınıfını kullanarak özgün yapılandırmayı temizlemeye gerek yoktur.
  • Kubernetes PV/PVC’nin yalnızca mantıksal silme işlemini gerçekleştirdiğinizden ve gerçek fiziksel veriler silinmediğinden risk düşüktür.
  • Dosya paylaşımları gibi ek Azure nesneleri oluşturmak zorunda kalmama nedeniyle ek maliyet oluşmaz.

Geçiş

  1. Aşağıdaki komutu çalıştırarak mevcut PV'yi ReclaimPolicy Delete'den Koru'ya güncelleştirin:

    kubectl patch pv pvName -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    

    pvName değerini seçtiğiniz PersistentVolume adıyla değiştirin. Alternatif olarak, birden çok PC için reclaimPolicy'yi güncelleştirmek istiyorsanız, patchReclaimPVs.sh adlı bir dosya oluşturun ve aşağıdaki kodu kopyalayın.

    #!/bin/bash
    # Patch the Persistent Volume in case ReclaimPolicy is Delete
    namespace=$1
    i=1
    for pvc in $(kubectl get pvc -n $namespace | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        pv="$(kubectl get pvc $pvc -n $namespace -o jsonpath='{.spec.volumeName}')"
        reclaimPolicy="$(kubectl get pv $pv -n $namespace -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
        echo "Reclaim Policy for Persistent Volume $pv is $reclaimPolicy"
        if [[ $reclaimPolicy == "Delete" ]]; then
          echo "Updating ReclaimPolicy for $pv to Retain"
          kubectl patch pv $pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
        fi
      fi
    done
    

    Betiği parametresiyle yürüterek namespace küme ad alanını ./PatchReclaimPolicy.sh <namespace>belirtin.

  2. Hazırlayıcı olarak ayarlanmış file.csi.azure.comyeni bir Depolama Sınıfı oluşturun veya CSI dosya hazırlayıcısı ile varsayılan StorageClasses'lerden birini kullanabilirsiniz.

  3. secretName Aşağıdaki komutu çalıştırarak mevcut PersistentVolumes'den ve shareName değerini alın:

    kubectl describe pv pvName
    
  4. Yeni StorageClass'ı ve shareName ağaç içi PV'den ve secretName öğesini kullanarak yeni bir BD oluşturun. azurefile-mount-pv.yaml adlı bir dosya oluşturun ve aşağıdaki kodu kopyalayın. altında csi, , volumeHandleve shareNamegüncelleştirinresourceGroup. Bağlama seçenekleri için fileMode ve dirMode için varsayılan değer 0777'dir.

    ve için varsayılan değer 0777'dir.fileMode dirMode

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: file.csi.azure.com
      name: azurefile
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: azurefile-csi
      csi:
        driver: file.csi.azure.com
        readOnly: false
        volumeHandle: unique-volumeid  # make sure volumeid is unique for every identical share in the cluster
        volumeAttributes:
          resourceGroup: EXISTING_RESOURCE_GROUP_NAME  # optional, only set this when storage account is not in the same resource group as the cluster nodes
          shareName: aksshare
        nodeStageSecretRef:
          name: azure-secret
          namespace: default
      mountOptions:
        - dir_mode=0777
        - file_mode=0777
        - uid=0
        - gid=0
        - mfsymlinks
        - cache=strict
        - nosharesock
        - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
    
  5. Aşağıdaki kodu kullanarak PersistentVolumeClaim kullanan bir PersistentVolumeClaim ile azurefile-mount-pvc.yaml adlı bir dosya oluşturun.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurefile
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: azurefile-csi
      volumeName: azurefile
      resources:
        requests:
          storage: 5Gi
    
  6. kubectl PersistentVolume'u oluşturmak için komutunu kullanın.

    kubectl apply -f azurefile-mount-pv.yaml
    
  7. kubectl PersistentVolumeClaim oluşturmak için komutunu kullanın.

    kubectl apply -f azurefile-mount-pvc.yaml
    
  8. Aşağıdaki komutu çalıştırarak PersistentVolumeClaim'inizin oluşturulduğunu ve PersistentVolume'a bağlı olduğunu doğrulayın.

    kubectl get pvc azurefile
    

    Çıkış aşağıdakine benzer:

    NAME        STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    azurefile   Bound    azurefile   5Gi        RWX            azurefile      5s
    
  9. PersistentVolumeClaim'inize başvurmak için kapsayıcı belirtiminizi güncelleştirin ve podunuzu güncelleştirin. Örneğin, aşağıdaki kodu kopyalayın ve azure-files-pod.yaml adlı bir dosya oluşturun.

    ...
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    
  10. Pod belirtimi yerinde güncelleştirilemez. Pod'u silmek ve sonra yeniden oluşturmak için aşağıdaki kubectl komutları kullanın.

    kubectl delete pod mypod
    
    kubectl apply -f azure-files-pod.yaml
    

Sonraki adımlar