Azure Elastic SAN ile Azure Kapsayıcı Depolama kullanma

Azure Container Storage kapsayıcılar için yerel olarak oluşturulmuş bulut tabanlı bir birim yönetimi, dağıtımı ve düzenleme hizmetidir. Bu makalede, Kubernetes iş yükleriniz için arka uç depolama alanı olarak Azure Elastic SAN kullanmak üzere Azure Kapsayıcı Depolama'yı nasıl yapılandırabileceğiniz gösterilmektedir.

Önemli

Bu makale, yerel NVMe disk ve yedekleme depolama türleri olarak Azure Elastic SAN destekleyen Azure Container Storage (sürüm 2.x.x) için geçerlidir. Önceki sürümlerle ilgili ayrıntılar için bkz. Azure Container Storage (sürüm 1.x.x) belgeleri.

Azure Elastic SAN nedir?

Azure Elastic SAN yönetilen, paylaşılan bir blok depolama hizmetidir. IOPS ve aktarım hızı dahil olmak üzere merkezi bir depolama kapasitesi ve performans havuzu sağlar. Bu havuzdan, birden çok birim oluşturur ve bunları birçok işlem kaynağına eklersiniz. Elastik SAN, her iş yükü için ayrı ayrı diskleri sağlamak ve ayarlamak yerine tek bir kapasite havuzundan depolama ayırır ve performansı ekli birimler arasında dağıtır. Bu yaklaşım, talebin zaman içinde değiştiği ve bir birimdeki kullanılmayan performansın diğer birimlere hizmet ettiği birçok dinamik iş yüküne sahip ortamlara uygundur. Elastik SAN genellikle birçok birim veya düğümde paylaşılan, ölçeklenebilir blok depolama için kullanılır. Ayrıca, orkestrasyonlu iş yükleri için daha hızlı birim ekleme ve ayırma, düğüm başına daha yüksek hacim yoğunluğu ve depolama kapasitesi ile performansının merkezi olarak sağlanması ve yönetilmesi konularında destek sunar.

Azure Kapsayıcı Depolama aracılığıyla Elastik SAN kapasitesinin genişletilmesi şu anda desteklenmemektedir. Elastic SAN'ı doğrudan Azure portalından veya Azure CLI kullanarak yeniden boyutlandırabilirsiniz.

Önkoşullar

  • Azure aboneliğiniz yoksa başlamadan önce free hesabı oluşturun.

  • Bu makale Azure CLI sürüm v2.83.0 veya üzerini gerektirir. Daha fazla bilgi için bkz. Azure CLI nasıl yüklenir? Sorunlar oluşursa aks-preview gibi uzantıları devre dışı bırakın. Uzantıları gerektiği gibi yükleyin veya güncelleştirin:

    • az extension add --upgrade --name k8s-extension
    • az extension add --upgrade --name elastic-san (Yalnızca elastik SAN)
  • Kubernetes komut satırı istemcisine ihtiyacınız vardır. kubectl Azure Cloud Shell kullanıyorsanız zaten yüklüdür. komutunu çalıştırarak az aks install-cli yerel olarak yükleyebilirsiniz.

  • Hedef bölgenizin Azure Kapsayıcı Depolama bölgelerinde desteklenip desteklenmediğini denetleyin.

  • yükleme yönergelerine bakın ve Azure Kapsayıcı Depolama'nın düzgün yüklendiğinden emin olun.

  • Elastik SAN'ı abonelikte ilk kez kullanıyorsanız şu tek seferlik kayıt komutunu çalıştırın:

    az provider register --namespace Microsoft.ElasticSan
    

İzinleri ayarlama

Azure Kapsayıcı Depolama'nın Elastik SAN'ı dağıtabilmesi için Azure Container Storage Operator rolünü AKS yönetilen kimliğine atamanız gerekir. Bu adımı tamamlamak için Azure aboneliğinizde Azure Kapsayıcı Depolama Sahibi rolüne veya Azure Kapsayıcı Depolama Katkıda Bulunan rolüne ihtiyacınız vardır.

AKS Yönetilen Kimliğinize Azure Container Storage Operator rolü atamak için aşağıdaki komutları çalıştırın. , <resource-group>ve <cluster-name> değerlerini kendi değerlerinizle değiştirmeyi <azure-subscription-id>unutmayın. Kapsamı, örneğin /subscriptions/<azure-subscription-id>/resourceGroups/<resource-group>kaynak grubunuzla da daraltabilirsiniz.

export AKS_MI_OBJECT_ID=$(az aks show --name <cluster-name> --resource-group <resource-group> --query "identityProfile.kubeletidentity.objectId" -o tsv)
az role assignment create --assignee $AKS_MI_OBJECT_ID --role "Azure Container Storage Operator" --scope "/subscriptions/<azure-subscription-id>"

Sağlama modeli seçme

Azure Kapsayıcı Depolama, Elastik SAN'ı Azure Kubernetes Service (AKS) ile kullanmanın üç yolunu destekler:

  • Dynamic provisioning: Azure Container Storage, elastik SAN birim gruplarını ve birimleri isteğe bağlı olarak oluşturur.
  • Önceden sağlanmış Elastik SAN ve birim grubu: Önce Elastik SAN ve birim grubunu oluşturursunuz, ardından Azure Container Storage bu mevcut kaynaklar içinde birimleri sağlar.
  • Statik sağlama: Elastik SAN, birim grubu ve birimi önceden oluşturur, ardından birimi statik olarak tanımlanmış kalıcı veri birimi (PV) olarak Kubernetes'e sunarsınız.

Aşağıdaki bölümlerde her model için depolama sınıfı yapılandırma gösterilmektedir.

Elastik SAN'ın dinamik sağlanması

Varsayılan depolama sınıfı oluşturma

gibi storageclass.yamlbir YAML bildirim dosyası oluşturun ve aşağıdaki belirtimi kullanın.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

Bu depolama sınıfıyla sağlanan varsayılan Elastik SAN kapasitesi 1 TiB'dir.

Alternatif olarak, Terraform kullanarak depolama sınıfını oluşturabilirsiniz.

  1. Aşağıdaki main.tfgibi bir yapılandırma oluşturarak depolama sınıfını yönetmek için Terraform kullanın. Ortamınız için gerektiğinde sağlayıcı sürümünü veya kubeconfig yolunu güncelleştirin.

    terraform {
      required_version = ">= 1.5.0"
      required_providers {
        kubernetes = {
          source  = "hashicorp/kubernetes"
          version = "~> 3.0"
        }
      }
    }
    
    provider "kubernetes" {
      config_path = "~/.kube/config"
    }
    
    resource "kubernetes_storage_class_v1" "azuresan_csi" {
      metadata {
        name = "azuresan-csi"
      }
    
      storage_provisioner    = "san.csi.azure.com"
      reclaim_policy         = "Delete"
      volume_binding_mode    = "Immediate"
      allow_volume_expansion = true
    }
    
  2. Yapılandırmayı başlatın ve uygulayın.

    terraform init
    terraform apply
    

Özel Elastik SAN kapasitesine sahip bir depolama sınıfı oluşturma

Varsayılan 1 TiB'den farklı bir başlangıç kapasitesine ihtiyacınız varsa, depolama sınıfında parametresini initialStorageTiB ayarlayın.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
parameters:
  initialStorageTiB: "10"

Özel uç nokta ile depolama sınıfı oluşturma

Özel uç nokta, sanal ağınızdaki özel bir IP adresi üzerinden Elastik SAN birim grubunuzla bağlantı kurmanızı sağlar. Özel uç nokta kullanımı için, birim sağlanması sırasında SAN CSI sürücüsünün özel uç noktalar oluşturmasına ve yönetmesine izin vermek üzere, kubelet yönetilen kimliğine AKS tarafından yönetilen kaynak grubunda Network Contributor rolü atanmış olmalıdır.

AKS yönetilen kimliğinize Network Contributor rolünü atamak için aşağıdaki komutları çalıştırın. , <resource-group>ve <cluster-name><azure-subscription-id> değerlerini kendi değerlerinizle değiştirmeyi <your-node-resource-group>unutmayın.

export AKS_MI_OBJECT_ID=$(az aks show --name <cluster-name> --resource-group <resource-group> --query "identityProfile.kubeletidentity.objectId" -o tsv)
az role assignment create --assignee $AKS_MI_OBJECT_ID --role "Network Contributorr" --scope "/subscriptions/<azure-subscription-id><your-node-resource-group>"
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
parameters:
  volumegroup: "esan-vg"
  networkEndpointType: "privateEndpoint"  

Note

Ağ uç noktası türü birim grubu oluşturma zamanında belirlenir ve daha sonra değiştirilemez. Birim grubu varsayılan hizmet uç noktası yapılandırması kullanılarak oluşturulduysa, özel uç nokta isteyen bir StorageClass ile kullanılamaz. Benzer şekilde, özel uç nokta kullanılarak oluşturulan birim grubu, hizmet uç noktasına dayalı StorageClasses ile kullanılamaz.

Farklı bir abonelikte Elastik SAN sağlamak için bir depolama sınıfı oluşturma

Azure Kapsayıcı Depolama, AKS kümesinden farklı bir abonelikte bulunan Elastik SAN'dan birimleri sağlamayı ve eklemeyi destekler. Bu, uyumluluk, idare veya paylaşılan altyapı modelleri için işlem ve depolamanın abonelikler arasında yalıtıldığı senaryolara olanak tanır.

Abonelikler arası sağlamayı kullanmadan önce aşağıdakilerden emin olun:

  • Hedef abonelik, Elastik SAN kaynakları için mevcut bir kaynak grubunu içerir.
  • AKS kümesi kubelet yönetilen kimliği, hedef kaynak grubunda aşağıdaki rollerden birine sahiptir:
    • Contributor
    • Azure Kapsayıcı Depolama İşleci
  • AKS kümesi ile Elastik SAN arasındaki ağ bağlantısı, özellikle özel uç nokta senaryoları için düzgün yapılandırılır.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
parameters:
  subscriptionId: <external-subcriptionId> # Target subscription Id for which you have admin access
  resourceGroup: <external-rg>  # Existing resource group in target subscription

Önceden sağlanan Elastik SAN ve birim grupları

Elastik SAN veya Elastik SAN ve birim grubu oluşturup depolama sınıfındaki bu kaynaklara başvurabilirsiniz.

Önceden sağlanan Elastik SAN için depolama sınıfı oluşturma

Henüz Azure Container Storage yüklü değilse yükleyin.

  1. AKS kümesinin yönetilen kaynak grubunu tanımlayın.

    kubectl get node -o jsonpath={range .items[*]}{.spec.providerID}{"\n"}{end}
    

    Sağlayıcı kimliğinde /resourceGroup/ sonrasında düğüm kaynak grubu görünür.

  2. Yönetilen kaynak grubunda bir Elastik SAN oluşturun.

    az elastic-san create --resource-group <node-resource-group> --name <san-name> --location <node-region> --sku "{name:Premium_LRS,tier:Premium}" --base-size-tib 1 --extended-capacity-size-tib 1
    
  3. Elastik SAN'a başvuran bir depolama sınıfı oluşturun:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azuresan-csi
    provisioner: san.csi.azure.com
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    parameters:
      san: <san-name> # replace with the name of your precreated Elastic SAN
    

Önceden sağlanan Elastik SAN ve birim grubu için depolama sınıfı oluşturma

  1. Önceden sağlanan Elastik SAN için depolama sınıfı oluşturma bölümünde yer alan adımları izleyerek yönetilen kaynak grubunda bir Elastik SAN oluşturun.

  2. Birim grubu oluşturun.

  3. Sanal ağ (VNet) bilgilerini alın.

    az network vnet list -g <node-resource-group> --query [].name -o tsv
    
  4. Alt ağ bilgilerini alın.

    az network vnet subnet list -g <node-resource-group> --vnet-name <vnet-name> --query [].name -o tsv
    
  5. Hizmet uç noktasını güncelleştirin.

    az network vnet subnet update -g <node-resource-group> --vnet-name <vnet-name> --name <subnet-name> --service-endpoints "Microsoft.Storage"
    

    Önemli

    AKS kümeniz farklı alt ağlarda birden çok düğüm havuzu kullanıyorsa, Elastik SAN birim grubu ağ ACL'lerine tüm düğüm havuzu alt ağ kimliklerini eklemeniz gerekir. Elastik SAN birim grupları yalnızca birim grubu kurallarında açıkça yetkilendirilmiş sanal ağ alt ağlarından erişime izin verir ve diğer alt ağlardan gelen istekler varsayılan olarak engellenir.

  6. Birim grubunu oluşturun.

    az elastic-san volume-group create --resource-group <node-resource-group> --elastic-san-name <san-name> --name <volume-group-name> --network-acls '{"virtual-network-rules":[{"id":"<subnet-id>","action":"Allow"}]}'
    
  7. Elastik SAN ve birim grubuna başvuran bir depolama sınıfı oluşturun:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azuresan-csi
    provisioner: san.csi.azure.com
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    parameters:
      san: <san-name> # replace with the name of your precreated Elastic SAN
      volumegroup: <volume-group-name> # replace with the name of your precreated volume group
    

Manifesti uygula ve depolama sınıfı oluşturmayı doğrula

Bildirimi uygulayın:

kubectl apply -f storageclass.yaml

Depolama sınıfının oluşturulduğunu doğrulayın:

kubectl get storageclass azuresan-csi

Aşağıdakine benzer bir çıktı görmeniz gerekir:

NAME           PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
azuresan-csi   san.csi.azure.com    Delete          Immediate           true                   10s

Kalıcı birim talebi oluştur

Kalıcı birim talebi (PVC), depolama sınıfına göre depolamayı otomatik olarak sağlar. Yeni depolama sınıfını kullanarak bir PVC oluşturmak için bu adımları izleyin.

  1. gibi acstor-pvc.yamlbir YAML bildirim dosyası oluşturun.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: managedpvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: azuresan-csi
    
  2. PVC'yi oluşturmak için manifesti uygulayın.

    kubectl apply -f acstor-pvc.yaml
    

    Aşağıdakine benzer bir çıktı görmeniz gerekir:

    persistentvolumeclaim/managedpvc created
    

Aşağıdaki komutu çalıştırarak PVC'nin durumunu doğrulayabilirsiniz:

kubectl describe pvc managedpvc

PVC oluşturulduğunda, pod tarafından kullanılmaya hazır olur.

Pod kurma ve kalıcı birim bağlama

Performans değerlendirme ve iş yükü simülasyonu için Esnek G/Ç Testi (fio) kullanarak bir pod oluşturun ve kalıcı birim için bir bağlantı yolu belirtin. claimName için, PVC'yi oluştururken kullandığınız ad değerini kullanın.

  1. gibi acstor-pod.yamlbir YAML bildirim dosyası oluşturun.

    apiVersion: v1
    kind: Pod
    metadata:
      name: fiopod
    spec:
      containers:
        - name: fio
          image: mayadata/fio
          args: ["sleep", "1000000"]
          volumeMounts:
            - mountPath: "/volume"
              name: iscsi-volume
      volumes:
        - name: iscsi-volume
          persistentVolumeClaim:
            claimName: managedpvc
    
  2. Podu dağıtmak için bildirimi uygulayın.

    kubectl apply -f acstor-pod.yaml
    

    Bu örneğe benzer bir çıktı görmeniz gerekir:

    pod/fiopod created
    
  3. Pod'un çalışıp çalışmadığını ve PVC'nin bağlı olup olmadığını denetleyin:

    kubectl describe pod fiopod
    kubectl describe pvc managedpvc
    
  4. Geçerli durumunu görmek için fio testini denetleyin:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

Artık depolama için Elastik SAN kullanan bir poda sahipsiniz.

Elastik SAN biriminin statik sağlanması

Elastik SAN'da birimi önceden oluşturabilir ve statik PV olarak Kubernetes'e sunabilirsiniz. Elastik SAN ve birim grubunu oluşturmak için, Önceden sağlanan bir Elastik SAN ve birim grubu için depolama sınıfı oluşturma adımlarını kullanın. Bu adımları Azure portalında Elastic SAN hizmeti dikey penceresini kullanarak da gerçekleştirebilirsiniz.

Varsayılan Elastik SAN depolama sınıfı oluşturma

Varsayılan elastik SAN depolama sınıfını oluşturmak için aşağıdaki YAML bildirimini kullanın:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azuresan-csi
provisioner: san.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

Depolama sınıfını oluşturmak için bildirimi uygulayın:

kubectl apply -f storageclass.yaml

Depolama sınıfını doğrulayın:

kubectl get storageclass azuresan-csi

Elastik SAN birimi oluşturma

az elastic-san volume create -g <node-resource-group> -e <san-name> -v <volume-group-name> -n <volume-name> --size-gib 5

Elastik SAN biriminin Azure Resource Manager (ARM) kimliğini not edin. Kalıcı birim YAML'deki değer için volumeHandle kullanın.

Elastik SAN biriminizin iSCSI Tam Adını (IQN) ve targetPortal değerlerini alın:

az elastic-san volume show --name <volume-name> --resource-group <rg-name> --elastic-san-name <san-name>

Kalıcı birim oluştur

gibi pv_static.yamlbir YAML bildirim dosyası oluşturun.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-san
  annotations:
    pv.kubernetes.io/provisioned-by: san.csi.azure.com
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: azuresan-csi
  csi:
    driver: san.csi.azure.com
    volumeHandle: #{rg}#{san}#{vg}#{vol}
    volumeAttributes:
      # iqn: "<retrieved from pre-provisioned volume>"
      # targetPortal: "<retrieved from pre-provisioned volume>"
      numsessions: "8"

Manifesti uygulayarak kalıcı birimi oluşturun.

kubectl apply -f pv_static.yaml

Statik bir kalıcı birim talebi oluşturun

gibi pvc_static.yamlbir YAML bildirim dosyası oluşturun.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-san
spec:
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  volumeName: pv-san
  storageClassName: azuresan-csi

PVC'yi oluşturmak için manifesti uygulayın.

kubectl apply -f pvc_static.yaml

Statik hacmi kullanan bir pod oluşturun

gibi pod.yamlbir YAML bildirim dosyası oluşturun.

apiVersion: v1
kind: Pod
metadata:
  name: pod-san-static
spec:
  nodeSelector:
    kubernetes.io/os: linux
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
      name: nginx
      ports:
        - containerPort: 80
          protocol: TCP
      volumeMounts:
        - mountPath: /var/www
          name: iscsi-volume
  volumes:
    - name: iscsi-volume
      persistentVolumeClaim:
        claimName: pvc-san

Pod oluşturmak için manifest dosyasını uygulayın.

kubectl apply -f pod.yaml

Ayrıca bakınız