Partager via


Résoudre les problèmes liés au stockage dans Azure Container Storage

Azure Container Storage est un service cloud de gestion, de déploiement et d’orchestration de volumes conçu de manière native pour les conteneurs. Utilisez cet article pour résoudre les problèmes courants liés à Azure Container Storage et trouver des solutions aux problèmes.

Résoudre les problèmes d’installation

Impossible d’installer le Stockage de conteneurs Azure en raison d’une configuration manquante

Une fois l’exécution terminée az aks create, le message Impossible d’installer Azure Container Storage s’affiche. Le cluster AKS est créé. Exécutez az aks update avec --enable-azure-container-storage pour activer Azure Container Storage.

Ce message signifie qu’Azure Container Storage n’a pas été installé, mais que votre cluster AKS (Azure Kubernetes Service) a été créé correctement.

Pour installer Azure Container Storage sur le cluster et créer un pool de stockage, exécutez la commande suivante. Remplacez <cluster-name> et <resource-group> par vos propres valeurs. Remplacez <storage-pool-type> par azureDisk, ephemeraldisk ou elasticSan.

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type>

Impossible d’installer le Stockage de conteneurs Azure en raison de restrictions d’Azure Policy

L’installation d’Azure Container Storage peut échouer si des restrictions d’Azure Policy sont en place. Plus précisément, Azure Container Storage s’appuie sur des conteneurs privilégiés. Vous pouvez configurer Azure Policy pour bloquer les conteneurs privilégiés. Lorsqu'ils sont bloqués, l'installation d'Azure Container Storage peut expirer ou échouer, et vous pouvez voir des erreurs dans les journaux gatekeeper-controller telles que :

$ kubectl logs -n gatekeeper-system deployment/gatekeeper-controller
... 
{"level":"info","ts":1722622443.9484184,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: prereq, securityContext: {\"privileged\": true, \"runAsUser\": 0}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-prereq-gt58x","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622443.9839077,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: metrics-exporter, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-metrics-exporter-286np","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622444.0515249,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: csi-node, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-csi-node-7hcd7","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622444.0729053,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: io-engine, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-io-engine-84hwx","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622444.0742755,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: ndm, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-ndm-x6q5n","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622449.2412128,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: ndm, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-ndm-b5nfg","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}

Pour résoudre le blocage, vous devez ajouter l’espace de noms acstor à la liste d’exclusion de votre stratégie Azure. Azure Policy est utilisé pour créer et appliquer des règles de gestion des ressources au sein d’Azure, y compris les clusters AKS. Dans certains cas, les stratégies peuvent bloquer la création de pods et de composants de Stockage de conteneurs Azure. Vous pouvez trouver plus de détails sur le fonctionnement d’Azure Policy pour Kubernetes en consultant Azure Policy pour Kubernetes.

Pour ajouter l’espace de noms acstor à la liste d’exclusion, procédez de la manière suivante :

  1. Créer votre cluster Azure Kubernetes.
  2. Activez Azure Policy pour AKS.
  3. Créez une stratégie que vous soupçonnez de bloquer l’installation du Stockage de conteneurs Azure.
  4. Essayez d’installer le Stockage de conteneurs Azure dans le cluster AKS.
  5. Vérifiez les journaux du pod gatekeeper-controller pour confirmer toute violation de stratégie.
  6. Ajoutez l’espace de noms acstor et l’espace de noms azure-extensions-usage-system à la liste d’exclusion de la politique.
  7. Essayez une nouvelle fois d’installer le Stockage de conteneurs Azure dans le cluster AKS.

Impossible d'installer et d'activer Azure Container Storage dans des pools de nœuds avec des taches

Vous pouvez configurer des taches de nœuds sur les pools de nœuds pour empêcher la planification des pods sur ces pools de nœuds. L’installation et l’activation d’Azure Container Storage sur ces pools de nœuds peuvent être bloquées car les pods requis ne peuvent pas être créés dans ces pools de nœuds. Le comportement s'applique à la fois au pool de nœuds système lors de l'installation et aux pools de nœuds utilisateur lors de l'activation.

Vous pouvez vérifier les taches de nœuds avec l'exemple suivant :

$ az aks nodepool list -g $resourceGroup --cluster-name $clusterName --query "[].{PoolName:name, nodeTaints:nodeTaints}"
[
...
  {
    "PoolName": "nodepoolx",
    "nodeTaints": [
      "sku=gpu:NoSchedule"
    ]
  }
]

Vous pouvez supprimer temporairement ces souillures pour les débloquer et les reconfigurer après les avoir installées et activées avec succès. Vous pouvez accéder aux pools de nœuds du cluster > Azure Portal AKS >, cliquer sur votre pool de nœuds, supprimer les souillures dans la section « Souillures et étiquettes ». Ou vous pouvez utiliser la commande suivante pour supprimer les souillures et confirmer la modification.

$ az aks nodepool update -g $resourceGroup --cluster-name $clusterName --name $nodePoolName --node-taints ""
$ az aks nodepool list -g $resourceGroup --cluster-name $clusterName --query "[].{PoolName:name, nodeTaints:nodeTaints}"
[
...
  {
    "PoolName": "nodepoolx",
    "nodeTaints": null
  }
]

Réessayez l'installation ou l'activation après avoir supprimé avec succès les taches de nœud. Une fois l'opération terminée avec succès, vous pouvez reconfigurer les nœuds contaminés pour reprendre les contraintes de planification du pod.

Impossible de définir le type de pool de stockage sur NVMe

Si vous essayez d’installer Azure Container Storage avec un disque éphémère, en particulier avec NVMe local sur un cluster où la référence SKU de la machine virtuelle ne dispose pas de lecteurs NVMe, vous obtenez le message d’erreur suivant : Impossible de définir --storage-pool-option comme NVMe, car aucun des pools de nœuds ne peut prendre en charge le disque NVMe éphémère.

Pour corriger ce problème, créez un pool de nœuds avec une référence SKU de machine virtuelle qui possède des lecteurs NVMe et réessayez. Consultez Machines virtuelles à stockage optimisé.

Résoudre les problèmes de pool de stockage

Pour vérifier l’état de vos pools de stockage, exécutez kubectl describe sp <storage-pool-name> -n acstor. Voici quelques problèmes que vous pourriez rencontrer.

Le pool de stockage éphémère ne revendique pas la capacité lorsque les disques éphémères sont utilisés par d'autres ensembles de démons

L'activation d'un pool de stockage éphémère sur un pool de nœuds avec des disques SSD temporaires ou NVMe locaux peut ne pas réclamer de capacité à partir de ces disques si d'autres ensembles de démons les utilisent.

Exécutez les étapes suivantes pour permettre à Azure Container Storage de gérer exclusivement ces disques locaux :

  1. Exécutez la commande suivante pour voir la capacité revendiquée par pool de stockage éphémère :

    $ kubectl get sp -A
    NAMESPACE   NAME                 CAPACITY   AVAILABLE   USED   RESERVED   READY   AGE
    acstor      ephemeraldisk-nvme   0          0           0      0          False   82s
    

    Cet exemple montre une capacité nulle revendiquée par le pool de stockage ephemeraldisk-nvme.

  2. Exécutez la commande suivante pour confirmer l’état non réclamé de ces périphériques de bloc locaux et vérifier le système de fichiers existant sur les disques :

    $ kubectl get bd -A
    NAMESPACE   NAME                                           NODENAME                               SIZE            CLAIMSTATE   STATUS   AGE
    acstor      blockdevice-1f7ad8fa32a448eb9768ad8e261312ff   aks-nodepoolnvme-38618677-vmss000001   1920383410176   Unclaimed    Active   22m
    acstor      blockdevice-9c8096fc47cc2b41a2ed07ec17a83527   aks-nodepoolnvme-38618677-vmss000000   1920383410176   Unclaimed    Active   23m
    $ kubectl describe bd -n acstor blockdevice-1f7ad8fa32a448eb9768ad8e261312ff
    Name:         blockdevice-1f7ad8fa32a448eb9768ad8e261312ff
    …
      Filesystem:
        Fs Type:  ext4
    …
    

    Cet exemple montre que les périphériques de bloc sont en état Unclaimed et qu'il existe un système de fichiers sur le disque.

  3. Confirmez que vous souhaitez utiliser Azure Container Storage pour gérer exclusivement les disques de données locaux avant de continuer.

  4. Arrêtez et supprimez les daemonsets ou les composants qui gèrent les disques de données locaux.

  5. Connectez-vous à chaque nœud disposant de disques de données locaux.

  6. Supprimez les systèmes de fichiers existants de tous les disques de données locaux.

  7. Redémarrez ndm daemonset pour découvrir les disques de données locaux inutilisés.

    $ kubectl rollout restart daemonset -l app=ndm -n acstor
    daemonset.apps/azurecontainerstorage-ndm restarted
    $ kubectl rollout status daemonset -l app=ndm -n acstor --watch
    …
    daemon set "azurecontainerstorage-ndm" successfully rolled out
    
  8. Attendez quelques secondes et vérifiez si le pool de stockage éphémère revendique la capacité des disques de données locaux.

    $ kubectl wait -n acstor sp --all --for condition=ready
    storagepool.containerstorage.azure.com/ephemeraldisk-nvme condition met
    $ kubectl get bd -A
    NAMESPACE   NAME                                           NODENAME                               SIZE            CLAIMSTATE   STATUS   AGE
    acstor      blockdevice-1f7ad8fa32a448eb9768ad8e261312ff   aks-nodepoolnvme-38618677-vmss000001   1920383410176   Claimed      Active   4d16h
    acstor      blockdevice-9c8096fc47cc2b41a2ed07ec17a83527   aks-nodepoolnvme-38618677-vmss000000   1920383410176   Claimed      Active   4d16h
    $ kubectl get sp -A
    NAMESPACE   NAME                 CAPACITY        AVAILABLE       USED          RESERVED      READY   AGE
    acstor      ephemeraldisk-nvme   3840766820352   3812058578944   28708241408   26832871424   True    4d16h
    

    Cet exemple montre que le pool de stockage ephemeraldisk-nvme revendique avec succès la capacité des disques NVMe locaux sur les nœuds.

Erreur lors de la tentative d’extension d’un pool de stockage Disques Azure

Si votre pool de stockage existant est inférieur à 4 Tio (4096 Gio), vous ne pouvez l’étendre qu’à 4095 Gio. Si vous essayez d'étendre au-delà de la limite, le PVC interne affiche un message d'erreur concernant les limitations de taille du disque ou de type de mise en cache. Arrêtez votre VM ou détachez le disque et réessayez l'opération.

Pour éviter les erreurs, n'essayez pas d'étendre votre pool de stockage actuel au-delà de 4 095 Gio s'il est initialement inférieur à 4 Tio (4 096 Gio). Les pools de stockage de taille supérieure à 4 Tio peuvent être étendus jusqu’à la capacité de stockage maximale disponible.

Cette limitation s’applique uniquement lors de l’utilisation des références SKU de disque Premium_LRS, Standard_LRS, StandardSSD_LRS, Premium_ZRS et StandardSSD_ZRS.

Échec de la création de Elastic SAN

Si vous essayez de créer un pool de stockage Elastic SAN, vous pourriez voir le message « Échec de la création de Azure Elastic SAN : nombre maximal possible de Elastic SAN pour l’abonnement déjà créé » s’afficher. Cela signifie que vous atteignez la limite du nombre de ressources Elastic SAN pouvant être déployées dans une région par abonnement. Vous pouvez vérifier la limite ici : objectifs de scalabilité et de performances de Elastic SAN. Envisagez de supprimer de l’abonnement les ressources Elastic SAN existantes qui ne sont plus utilisées, ou essayez de créer le pool de stockage dans une autre région.

Aucun appareil de bloc trouvé

Si vous voyez ce message, vous essayez probablement de créer un pool de stockage de disque éphémère sur un cluster où la référence SKU de machine virtuelle ne dispose pas de lecteurs NVMe.

Pour corriger ce problème, créez un pool de nœuds avec une référence SKU de machine virtuelle qui possède des lecteurs NVMe et réessayez. Consultez Machines virtuelles à stockage optimisé.

Type de pool de stockage déjà activé

Si vous essayez d’activer un type de pool de stockage existant, vous obtenez le message suivant : Valeur Non valide --enable-azure-container-storage. Azure Container Storage est déjà activé pour le type de pool de stockage <storage-pool-type> dans le cluster. Vous pouvez vérifier si vous disposez de pools de stockage existants créés en exécutant kubectl get sp -n acstor.

Désactivation d’un type de pool de stockage

Lors de la désactivation d’un type de pool de stockage via az aks update --disable-azure-container-storage <storage-pool-type> ou de la désinstallation d’Azure Container Storage via az aks update --disable-azure-container-storage all, s’il existe un pool de stockage existant de ce type, le message suivant s’affiche :

La désactivation d’Azure Container Storage pour le type de pool de stockage <storage-pool-type> supprime de force tous les pools de stockage du même type et affecte les applications utilisant ces pools de stockage. La suppression forcée des pools de stockage peut également entraîner une fuite des ressources de stockage qui sont consommées. Souhaitez-vous vérifier si l’un des pools de stockage de type <storage-pool-type> est utilisé avant de désactiver Azure Container Storage ? (O/N)

Si vous sélectionnez Y, une validation automatique s’exécute pour vous assurer qu’il n’existe aucun volume persistant créé à partir du pool de stockage. La sélection de n contourne cette validation et désactive le type de pool de stockage, en supprimant les pools de stockage existants et en affectant potentiellement votre application.

Résoudre les problèmes de volume

Pod en attente de création en raison d'une taille de volume éphémère supérieure à la capacité disponible

Un volume éphémère est alloué sur un nœud unique. Lorsque vous configurez la taille des volumes éphémères pour vos pods, celle-ci doit être inférieure à la capacité disponible du disque éphémère d'un seul nœud. Sinon, la création du pod est en attente.

Utilisez la commande suivante pour vérifier si la création de votre pod est en attente d’état.

$ kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
fiopod   0/1     Pending   0          17s

Dans cet exemple, le pod fiopod est dans l’état Pending.

Utilisez la commande suivante pour vérifier si le pod a l’événement d’avertissement pour la création de persistentvolumeclaim.

$ kubectl describe pod fiopod
...
Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  40s   default-scheduler  0/3 nodes are available: waiting for ephemeral volume controller to create the persistentvolumeclaim "fiopod-ephemeralvolume". preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling..

Dans cet exemple, le pod montre l'événement d'avertissement lors de la création du volume persistant revendication fiopod-ephemeralvolume.

Utilisez la commande suivante pour vérifier si la revendication de volume persistant ne parvient pas à provisionner en raison d’une capacité insuffisante.

$ kubectl describe pvc fiopod-ephemeralvolume
...
  Warning  ProvisioningFailed    107s (x13 over 20m)  containerstorage.csi.azure.com_aks-nodepool1-29463073-vmss000000_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  failed to provision volume with StorageClass "acstor-ephemeraldisk-temp": rpc error: code = Internal desc = Operation failed: GenericOperation("error in response: status code '507 Insufficient Storage', content: 'RestJsonError { details: \"Operation failed due to insufficient resources: Not enough suitable pools available, 0/1\", message: \"SvcError :: NotEnoughResources\", kind: ResourceExhausted }'")

Dans cet exemple, Insufficient Storage il s’agit de la raison de l’échec de l’approvisionnement en volume.

Exécutez la commande suivante pour vérifier la capacité disponible du disque éphémère d'un seul nœud.

$ kubectl get diskpool -n acstor
NAME                                CAPACITY      AVAILABLE     USED        RESERVED    READY   AGE
ephemeraldisk-temp-diskpool-jaxwb   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-temp-diskpool-wzixx   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-temp-diskpool-xbtlj   75660001280   75031990272   628011008   560902144   True    21h

Dans cet exemple, la capacité disponible du disque temporaire pour un nœud unique est de 75031990272 octets ou 69 Gio.

Ajustez la taille de stockage du volume en dessous de la capacité disponible et redéployez votre pod. Consultez Déployer un pod avec un volume éphémère générique.

Le volume ne parvient pas à s’attacher en raison d’un magasin de métadonnées hors connexion

Le Stockage de conteneurs Azure utilise etcd, un magasin de paires clé-valeur distribué et fiable, pour stocker et gérer les métadonnées des volumes afin de prendre en charge les opérations d’orchestration des volumes. Pour la haute disponibilité et la résilience, etcd s’exécute dans trois pods. Lorsqu’il y a moins de deux instances etcd en cours d’exécution, Azure Container Storage arrête les opérations d’orchestration des volumes tout en autorisant l’accès aux données aux volumes. Le Stockage de conteneurs Azure détecte automatiquement lorsqu’une instance de etcd est hors connexion et la récupère. Cependant, si vous remarquez des erreurs d’orchestration de volume après le redémarrage d’un cluster AKS, il est possible qu’une instance etcd n’ait pas réussi à récupérer automatiquement. Suivez les instructions de cette section pour déterminer l’état d’intégrité des instances de etcd.

Exécutez la commande suivante pour obtenir la liste des pods.

kubectl get pods

Vous pouvez voir un résultat similaire à ce qui suit.

NAME     READY   STATUS              RESTARTS   AGE 
fiopod   0/1     ContainerCreating   0          25m 

Décrire le pod :

kubectl describe pod fiopod

En règle générale, vous voyez des messages d’échec de volume si le magasin de métadonnées est hors ligne. Dans cet exemple, fiopod est dans l’état ContainerCreating et l’avertissement FailedAttachVolume indique que la création est en attente en raison d’un échec d’attachement de volume.

Name:             fiopod 

Events: 

Type     Reason              Age                 From                     Message 

----     ------              ----                ----                     ------- 

Normal   Scheduled           25m                 default-scheduler        Successfully assigned default/fiopod to aks-nodepool1-xxxxxxxx-vmss000009

Warning  FailedAttachVolume  3m8s (x6 over 23m)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" : timed out waiting for external-attacher of containerstorage.csi.azure.com CSI driver to attach volume xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Vous pouvez également exécuter la commande suivante pour vérifier l’état des instances de etcd :

kubectl get pods -n acstor | grep "^etcd"

Vous devez voir une sortie similaire à ce qui suit, avec toutes les instances dans l’état en cours d’exécution :

etcd-azurecontainerstorage-bn89qvzvzv                            1/1     Running   0               4d19h
etcd-azurecontainerstorage-phf92lmqml                            1/1     Running   0               4d19h
etcd-azurecontainerstorage-xznvwcgq4p                            1/1     Running   0               4d19h

Si moins de deux instances sont en cours d'exécution, le volume ne se connecte pas car le magasin de métadonnées est hors ligne et la récupération automatique a échoué. Si tel est le cas, déposez un ticket d'assistance auprès du Support Azure.

Voir aussi