Creare e usare un volume con i dischi di Azure nel servizio Azure Kubernetes (ASK)

Un volume permanente rappresenta una parte di risorsa di archiviazione di cui è stato effettuato il provisioning da usare con i pod Kubernetes. È possibile usare un volume permanente con uno o più pod ed effettuarne il provisioning in modo dinamico o statico. Questo articolo illustra come creare in modo dinamico volumi permanenti con Dischi di Azure in un cluster del servizio Azure Kubernetes.

Nota

Un disco di Azure può essere montato solo con la modalità di accessoReadWriteOnce, che lo rende disponibile solo a un nodo nel servizio Azure Kubernetes. Questa modalità di accesso consente comunque a più pod di accedere al volume quando i pod vengono eseguiti nello stesso nodo. Per altre informazioni, vedere le modalità di accesso Kubernetes PersistentVolume.

Questo articolo illustra come:

  • Usare un volume permanente dinamico installando il driver CSI (Container Storage Interface) e creando dinamicamente uno o più dischi gestiti di Azure da collegare a un pod.
  • Usare un volume permanente statico creando uno o più dischi gestiti di Azure oppure usandone uno esistente e collegandolo a un pod.

Per altre informazioni sui volumi Kubernetes, vedere Opzioni di archiviazione per le applicazioni nel servizio Azure Kubernetes.

Operazioni preliminari

  • Assicurarsi che sia installata e configurata l'interfaccia della riga di comando di Azure versione 2.0.59 o successiva. Eseguire az --version per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

  • Il driver CSI del disco di Azure ha un limite di volume per nodo. Il numero di volumi cambia in base alle dimensioni del nodo/pool di nodi. Eseguire il comando kubectl get per determinare il numero di volumi che possono essere allocati per nodo:

    kubectl get CSINode <nodename> -o yaml
    

Effettuare il provisioning dinamico di un volume

Questa sezione fornisce indicazioni per gli amministratori dei cluster che vogliono effettuare il provisioning di uno o più volumi permanenti che includono i dettagli dell'archiviazione su disco di Azure per l'uso da parte di un carico di lavoro. Un'attestazione di volume permanente usa l'oggetto classe di archiviazione per effettuare il provisioning dinamico di un contenitore di archiviazione su disco di Azure.

Archiviazione parametri di classe per PersistentVolumes dinamici

La tabella seguente include parametri che è possibile usare per definire una classe di archiviazione personalizzata per PersistentVolumeClaim.

Nome Significato Valore disponibile Obbligatorio Default value
skuName Tipo di account di archiviazione di Dischi di Azure (alias: storageAccountType) Standard_LRS, Premium_LRS, StandardSSD_LRS, PremiumV2_LRSUltraSSD_LRS, , Premium_ZRSStandardSSD_ZRS No StandardSSD_LRS
fsType Tipo di file system ext4, ext3, ext2, xfs, btrfs per Linux, ntfs per Windows No ext4 per Linux, ntfs per Windows
cachingMode Impostazione della cache dell'host del disco dati di Azure None, ReadOnly, ReadWrite No ReadOnly
resourceGroup Specificare il gruppo di risorse per Dischi di Azure Nome del gruppo di risorse esistente No Se vuoto, il driver usa lo stesso nome del gruppo di risorse del cluster del servizio Azure Kubernetes
DiskIOPSReadWrite Funzionalità di I/O al secondo UltraSSD o SSD Premium v2 (minima: 2 operazioni di I/O al secondo/GiB) 100~160000 No 500
DiskMBpsReadWrite Capacità di velocità effettiva UltraSSD o ssd Premium v2 (minimo: 0.032/GiB) 1~2000 No 100
LogicalSectorSize Dimensioni del settore logico in byte per il disco Ultra. I valori supportati sono 512 e 4096. 4096 è il valore predefinito. 512, 4096 No 4096
tag Tag del disco di Azure Formato tag: key1=val1,key2=val2 No ""
diskEncryptionSetID ResourceId del set di crittografia dischi da usare per l'abilitazione della crittografia dei dati inattivi Formato: /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} No ""
diskEncryptionType Tipo di crittografia del set di crittografia dischi. EncryptionAtRestWithCustomerKey (per impostazione predefinita), EncryptionAtRestWithPlatformAndCustomerKeys No ""
writeAcceleratorEnabled Acceleratore di scrittura in Dischi di Azure true, false No ""
networkAccessPolicy Proprietà NetworkAccessPolicy per impedire la generazione dell'URI di firma di accesso condiviso per un disco o uno snapshot AllowAll, DenyAll, AllowPrivate No AllowAll
diskAccessID ID risorsa di Azure della risorsa DiskAccess per l'uso di endpoint privati nei dischi No ``
enableBursting Abilitare il bursting su richiesta oltre a soglia di prestazioni di cui è stato effettuato il provisioning del disco. Il bursting su richiesta deve essere applicato solo al disco Premium e quando le dimensioni del disco sono > 512 GB. Il disco Ultra e condiviso non è supportato. Il bursting è disabilitato per impostazione predefinita. true, false No false
userAgent Agente utente usato per l'attribuzione dell'utilizzo dei clienti No Useragent generato formattato driverName/driverVersion compiler/version (OS-ARCH)
subscriptionid Specificare l'ID sottoscrizione di Azure in cui vengono creati i dischi di Azure. ID sottoscrizione di Azure No Se non è vuoto, resourceGroup deve essere specificato.
--- I parametri seguenti sono solo per v2 --- --- ---
maxShares Numero totale di montaggi del disco condiviso consentiti per il disco. L'impostazione del valore su 2 o su un valore superiore abilita le repliche degli allegati. I valori supportati dipendono dalle dimensioni del disco. Vedere Condividere un disco gestito di Azure per i valori supportati. No 1
maxMountReplicaCount Numero di allegati di repliche da gestire. Questo valore deve essere compreso nell'intervallo [0..(maxShares - 1)] No Se accessMode è ReadWriteMany, il valore predefinito è 0. In caso contrario, il valore predefinito è maxShares - 1

Classi di archiviazione predefinite

Le classi di archiviazione definiscono il modo in cui un'unità di archiviazione viene creata dinamicamente con un volume permanente. Per altre informazioni sulle classi di archiviazione Kubernetes, vedere le classi di archiviazione Kubernetes.

Ogni cluster del servizio Azure Kubernetes include quattro classi di archiviazione predefinite, due delle quali configurate per l'uso con Dischi di Azure:

  1. La classe di archiviazione predefinita effettua il provisioning di un disco SSD di Azure standard.
    • Le unità SSD Standard supportano l'Archiviazione Standard e offrono un'archiviazione conveniente pur fornendo prestazioni affidabili.
  2. La classe di archiviazione managed-csi-premium effettua il provisioning di un disco di Azure Premium.
    • I dischi a bassa latenza e ad alte prestazioni basati su unità SSD supportano i dischi Premium. Sono ideali per le macchine virtuali che eseguono carichi di lavoro di produzione. Quando si usa il driver CSI del disco di Azure nel servizio Azure Kubernetes, è anche possibile usare la classe di archiviazione managed-csi, supportata dall'archiviazione con ridondanza locale di SSD Standard.
  3. A partire dalla versione 1.29 di Kubernetes, quando si distribuiscono cluster servizio Azure Kubernetes (AKS) in più zone di disponibilità, il servizio Azure Kubernetes usa ora l'archiviazione con ridondanza della zona per creare dischi gestiti all'interno di classi di archiviazione predefinite.
    • L'archiviazione con ridondanza della zona garantisce la replica sincrona dei dischi gestiti di Azure in più zone di disponibilità di Azure nell'area scelta. Questa strategia di ridondanza migliora la resilienza delle applicazioni e protegge i dati dagli errori del data center.
    • Tuttavia, è importante notare che l'archiviazione con ridondanza della zona (ZRS) comporta un costo più elevato rispetto all'archiviazione con ridondanza locale. Se l'ottimizzazione dei costi è una priorità, è possibile creare una nuova classe di archiviazione con il parametro nome SKU LRS e usarla nell'attestazione del volume persistente (PVC).

La riduzione delle dimensioni di un PVC non è supportata a causa del rischio di perdita di dati. È possibile modificare una classe di archiviazione esistente usando il comando kubectl edit sc oppure è possibile creare una classe di archiviazione personalizzata. Ad esempio, se si vuole usare un disco di dimensioni pari a 4 TiB, è necessario creare una classe di archiviazione che definisce cachingmode: None perché la memorizzazione nella cache del disco non è supportata per i dischi da 4 TiB e di dimensioni maggiori. Per altre informazioni sulle classi di archiviazione e sulla creazione di una classe di archiviazione personalizzata, vedere Opzioni di archiviazione per le applicazioni nel servizio Azure Kubernetes.

È possibile visualizzare le classi di archiviazione predefinite usando il comando kubectl get sc. L'esempio seguente illustra le classi di archiviazione predefinite disponibili all'interno di un cluster del servizio Azure Kubernetes:

kubectl get sc

L'output del comando è simile all'esempio seguente:

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

Nota

Le attestazioni di volumi permanenti sono specificate in GiB, ma i dischi gestiti di Azure vengono fatturati in base al codice SKU per una dimensione specifica. Questi SKU spaziano da 32 GiB per i dischi S4 o P4 a 32 TiB per i dischi S80 o P80 (in anteprima). La velocità effettiva e le prestazioni delle operazioni di I/O al secondo per un disco gestito Premium dipendono sia dallo SKU sia dalla dimensione dell'istanza dei nodi nel cluster servizio Azure Kubernetes. Per altre informazioni, vedere Prezzi e prestazioni dei dischi gestiti.

Creare un'attestazione di volume permanente

Un'attestazione di volume permanente effettua automaticamente il provisioning dell'archiviazione in base a una classe di archiviazione. In questo caso un'attestazione di volume permanente può usare una delle classi di archiviazione predefinite per creare un disco gestito di Azure Standard o Premium.

  1. Creare un file denominato azure-pvc.yaml e copiarlo nel manifesto seguente. L'attestazione richiede un disco denominato azure-managed-disk di 5 GB con accesso ReadWriteOnce. Come classe di archiviazione è specificata managed-csi.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: azure-managed-disk
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-csi
      resources:
        requests:
          storage: 5Gi
    

Suggerimento

Per creare un disco con archiviazione Premium, usare storageClassName: managed-csi-premium anziché managed-csi.

  1. Creare l'attestazione di volume permanente usando il comando kubectl apply e specificare il file azure-pvc.yaml.

    kubectl apply -f azure-pvc.yaml
    

    L'output del comando è simile all'esempio seguente:

    persistentvolumeclaim/azure-managed-disk created
    

Usare il volume permanente

Dopo aver creato l'attestazione di volume permanente, è necessario verificare che abbia lo stato Pending. Lo stato Pending indica che è pronta per essere usata da un pod.

  1. Verificare lo stato dell'attestazione di volume permanente usando il comando kubectl describe pvc.

    kubectl describe pvc azure-managed-disk
    

    L'output del comando è simile all'esempio condensato seguente:

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. Creare un file denominato azure-pvc-disk.yaml e copiarlo nel manifesto seguente. Questo manifesto crea un pod NGINX di base che usa l'attestazione di volume permanente denominata azure-managed-disk per montare il disco di Azure nel percorso /mnt/azure. Per i contenitori Windows Server specificare un valore per mountPath usando la convenzione di percorso di Windows, ad esempio 'D:'.

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  3. Creare il pod usando il comando kubectl apply.

     kubectl apply -f azure-pvc-disk.yaml
    

    L'output del comando è simile all'esempio seguente:

    pod/mypod created
    
  4. A questo punto è disponibile un pod in esecuzione con il disco di Azure montato nella directory /mnt/azure. Controllare la configurazione del pod usando il comando kubectl describe.

     kubectl describe pod mypod
    

    L'output del comando è simile all'esempio seguente:

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
       default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
     Events:
      Type    Reason                 Age   From                               Message
      ----    ------                 ----  ----                               -------
      Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-79590246-0
      Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "default-token-smm2n"
      Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
    [...]
    

Usare Dischi Ultra di Azure

Per usare il disco Ultra di Azure, vedere Usare dischi Ultra nel servizio Azure Kubernetes.

Uso dei tag di Azure

Per altre informazioni sull'uso dei tag di Azure, vedere Usare i tag di Azure nel servizio Azure Kubernetes.

Effettuare il provisioning statico di un volume

Questa sezione fornisce indicazioni per gli amministratori del cluster che vogliono creare uno o più volumi persistenti che includono i dettagli dei dischi di Azure per l'uso da parte di un carico di lavoro.

Parametri di provisioning statici per un volume permanente

La tabella seguente include i parametri che è possibile usare per definire un volume permanente.

Nome Significato Valore disponibile Obbligatorio Default value
volumeHandle URI del disco di Azure /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} N/D
volumeAttributes.fsType Tipo di file system ext4, ext3, ext2, xfs, btrfs per Linux, ntfs per Windows No ext4 per Linux, ntfs per Windows
volumeAttributes.partition Numero di partizione del disco esistente (supportato solo in Linux) 1, 2, 3 No Vuoto (nessuna partizione)
Assicurarsi che il formato della partizione sia simile a -part1
volumeAttributes.cachingMode Impostazione della cache dell'host del disco None, ReadOnly, ReadWrite No ReadOnly

Creare un disco di Azure

Quando si crea un disco di Azure da usare con il servizio Azure Kubernetes, è possibile creare la risorsa disco nel gruppo di risorse del nodo. Questo approccio consente al cluster del servizio Azure Kubernetes di accedere e gestire la risorsa disco. Se invece si crea il disco in un gruppo di risorse separato, è necessario concedere all'identità gestita del servizio Azure Kubernetes per il cluster il ruolo Contributor nel gruppo di risorse del disco.

  1. Individuare il nome del gruppo di risorse usando il comando az aks show e aggiungere il parametro --query nodeResourceGroup.

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

    L'output del comando è simile all'esempio seguente:

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. Creare un disco usando il comando az disk create. Specificare il nome del gruppo di risorse del nodo e un nome per la risorsa disco, ad esempio myAKSDisk. L'esempio seguente crea un disco da 20 GiB e restituisce l'ID del disco dopo la creazione. Se è necessario creare un disco da usare con i contenitori di Windows Server, aggiungere il parametro --os-type windows per formattare correttamente il disco.

    az disk create \
      --resource-group MC_myResourceGroup_myAKSCluster_eastus \
      --name myAKSDisk \
      --size-gb 20 \
      --query id --output tsv
    

    Nota

    I dischi di Azure vengono fatturati per SKU in base alle dimensioni specifiche. Questi SKU spaziano da 32 GiB per i dischi S4 o P4 a 32 TiB per i dischi S80 o P80 (in anteprima). La velocità effettiva e le prestazioni delle operazioni di I/O al secondo per un disco gestito Premium dipendono sia dallo SKU sia dalla dimensione dell'istanza dei nodi nel cluster del servizio Azure Kubernetes. Vedere Prezzi per Managed Disks.

    L'ID risorsa del disco viene visualizzato dopo aver completato correttamente il comando, come illustrato nell'output di esempio seguente. L'ID del disco viene usato per montare il disco nella sezione successiva.

    /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
    

Montare il disco come volume

  1. Creare un file pv-azuredisk.yaml con PersistentVolume. Aggiornare volumeHandle con l'ID della risorsa del disco del passaggio precedente. Per i contenitori di Windows Server, specificare ntfs per il parametro fsType.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: disk.csi.azure.com
      name: pv-azuredisk
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
        volumeAttributes:
          fsType: ext4
    
  2. Creare un file pvc-azuredisk.yaml con PersistentVolumeClaim che usa PersistentVolume.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. Creare PersistentVolume e PersistentVolumeClaim usando il comando kubectl apply e fare riferimento ai due file YAML creati.

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. Verificare che PersistentVolumeClaim sia stato creato e associato a PersistentVolume usando il comando kubectl get pvc.

    kubectl get pvc pvc-azuredisk
    

    L'output del comando è simile all'esempio seguente:

    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    
  5. Creare un file azure-disk-pod.yaml per fare riferimento a PersistentVolumeClaim. Per i contenitori Windows Server specificare un valore per mountPath usando la convenzione di percorso di Windows, ad esempio 'D:'.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  6. Applicare la configurazione e montare il volume usando il comando kubectl apply.

    kubectl apply -f azure-disk-pod.yaml
    

Pulire le risorse

Quando le risorse create in questo articolo non sono più necessarie, è possibile rimuoverle usando il comando kubectl delete.

# Remove the pod
kubectl delete -f azure-pvc-disk.yaml

# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml

Passaggi successivi