Échec de l’extraction d’images d’Azure Container Registry vers un cluster Azure Kubernetes Service
Note
Cet article vous a-t-il été utile ? Votre avis est important à nos yeux. Utilisez le bouton Commentaires sur cette page pour nous faire savoir dans quelle mesure cet article vous a été utile ou comment nous pouvons l’améliorer.
Lorsque vous utilisez Microsoft Azure Container Registry avec Azure Kubernetes Service (AKS), un mécanisme d’authentification doit être établi. Vous pouvez configurer l’intégration d’AKS à Container Registry à l’aide de quelques commandes Azure CLI ou Azure PowerShell simples. Cette intégration affecte le rôle AcrPull pour l’identité kubelet associée au cluster AKS pour extraire des images d’un registre de conteneurs.
Dans certains cas, la tentative d’extraction d’images d’un registre de conteneurs vers un cluster AKS échoue. Cet article fournit des conseils pour résoudre les erreurs les plus courantes que vous rencontrez lorsque vous extrayez des images d’un registre de conteneurs vers un cluster AKS.
Avant de commencer
Cet article suppose que vous disposez d’un cluster AKS existant et d’un registre de conteneurs existant. Consultez les démarrages rapides suivants :
Si vous avez besoin d’un cluster AKS, déployez-en un à l’aide d’Azure CLI ou du Portail Azure.
Si vous avez besoin d’Azure Container Registry (ACR), créez-en un à l’aide d’Azure CLI ou du Portail Azure.
Vous avez également besoin d’Azure CLI version 2.0.59 ou ultérieure pour être installé et configuré. Exécutez az version pour déterminer la version. Si vous devez installer ou mettre à niveau, consultez Installer Azure CLI.
Symptômes et résolution des problèmes initiaux
L’ÉTAT du pod Kubernetes est ImagePullBackOff ou ErrImagePull. Pour obtenir des informations détaillées sur les erreurs, exécutez la commande suivante et vérifiez les événements à partir de la sortie.
kubectl describe pod <podname> -n <namespace>
Nous vous recommandons de commencer à résoudre les problèmes en vérifiant l’intégrité du registre de conteneurs et en vérifiant si le registre de conteneurs est accessible à partir du cluster AKS.
Pour vérifier l’intégrité du registre de conteneurs, exécutez la commande suivante :
az acr check-health --name <myregistry> --ignore-errors --yes
Si un problème est détecté, il fournit un code d’erreur et une description. Pour plus d’informations sur les erreurs et les solutions possibles, consultez informations de référence sur les erreurs de vérification d’intégrité.
Note
Si vous recevez des erreurs liées à Helm ou un notarié, cela ne signifie pas que vous rencontrez un problème affectant Container Registry ou AKS. Il indique uniquement que Helm ou le notarié n’est pas installé, ou qu’Azure CLI n’est pas compatible avec la version installée actuelle de Helm ou d’un noteur, et ainsi de suite.
Pour vérifier si le registre de conteneurs est accessible à partir du cluster AKS, exécutez la commande az aks check-acr suivante :
az aks check-acr --resource-group <MyResourceGroup> --name <MyManagedCluster> --acr <myacr>.azurecr.io
Les sections suivantes vous aident à résoudre les erreurs les plus courantes affichées dans Les événements dans la sortie de la kubectl describe pod
commande.
Cause 1 : Erreur non autorisée 401
Un cluster AKS nécessite une identité. Cette identité peut être une identité gérée ou un principal de service. Si le cluster AKS utilise une identité managée, l’identité kubelet est utilisée pour l’authentification auprès d’ACR. Si le cluster AKS utilise comme identité un principal de service, le principal de service lui-même est utilisé pour l’authentification auprès d’ACR. Quelle que soit l’identité, l’autorisation appropriée utilisée pour extraire une image d’un registre de conteneurs est nécessaire. Sinon, vous pouvez obtenir l’erreur « 401 Non autorisé » suivante :
Échec de l’extraction de l’image « acrname.azurecr.io/<< repository :tag> » : [rpc error : code = Unknown desc = failed to pull and unpack image « <acrname.azurecr.io/><> repository :tag> » : failed to resolve reference « <acrname.azurecr.io/>< repository :tag> » : failed to authorize : failed to fetch oauth token : unexpected status : 401 Non autorisé
Plusieurs solutions peuvent vous aider à résoudre cette erreur, sous réserve des contraintes suivantes :
Les solutions 2, 3 et 5 s’appliquent uniquement aux clusters AKS qui utilisent un principal de service.
Les solutions 1, 2, 3 et 4 s’appliquent à la méthode Azure de création de l’attribution de rôle au niveau de Container Registry pour l’identité d’AKS.
Les solutions 5 et 6 s’appliquent à la méthode Kubernetes d’extraction d’un secret Kubernetes.
Solution 1 : Vérifier que l’attribution de rôle AcrPull est créée pour l’identité
L’intégration entre AKS et Container Registry crée une attribution de rôle AcrPull au niveau du registre de conteneurs pour l’identité kubelet du cluster AKS. Vérifiez que l’attribution de rôle est créée.
Pour vérifier si l’attribution de rôle AcrPull est créée, utilisez l’une des méthodes suivantes :
Exécutez la commande suivante :
az role assignment list --scope /subscriptions/<subscriptionID>/resourceGroups/<resourcegroupname>/providers/Microsoft.ContainerRegistry/registries/<acrname> -o table
Vérifiez les Portail Azure en sélectionnant Les attributions de rôles azure Container Registry>Access Control (IAM).>. Pour plus d’informations, consultez Répertorier les attributions de rôles Azure à l’aide du Portail Azure.
Outre le rôle AcrPull, certains rôles intégrés et rôles personnalisés peuvent également contenir l’action « Microsoft.ContainerRegistry/registrys/pull/read ». Vérifiez ces rôles si vous en avez un.
Si l’attribution de rôle AcrPull n’est pas créée, créez-la en configurant l’intégration de Container Registry pour le cluster AKS avec la commande suivante :
az aks update -n <myAKSCluster> -g <myResourceGroup> --attach-acr <acr-resource-id>
Solution 2 : Vérifier que le principal de service n’a pas expiré
Vérifiez que le secret du principal de service associé au cluster AKS n’a pas expiré. Pour vérifier la date d’expiration de votre principal de service, exécutez les commandes suivantes :
SP_ID=$(az aks show --resource-group <myResourceGroup> --name <myAKSCluster> \
--query servicePrincipalProfile.clientId -o tsv)
az ad app credential list --id "SP_ID" --query "[].endDateTime" --output tsv
Pour plus d’informations, consultez Vérifier la date d’expiration de votre principal de service.
Si le secret a expiré, mettez à jour les informations d’identification du cluster AKS.
Solution 3 : Vérifiez que le rôle AcrPull est attribué à un principal de service correct
Dans certains cas, l’attribution de rôle de registre de conteneurs fait toujours référence à l’ancien principal de service. Par exemple, lorsque le principal de service du cluster AKS est remplacé par un nouveau. Pour vous assurer que l’attribution de rôle de registre de conteneurs fait référence au principal de service approprié, procédez comme suit :
Pour vérifier le principal de service utilisé par le cluster AKS, exécutez la commande suivante :
az aks show --resource-group <myResourceGroup> \ --name <myAKSCluster> \ --query servicePrincipalProfile.clientId \ --output tsv
Pour vérifier le principal de service référencé par l’attribution de rôle de registre de conteneurs, exécutez la commande suivante :
az role assignment list --scope /subscriptions/<subscriptionID>/resourceGroups/<resourcegroupname>/providers/Microsoft.ContainerRegistry/registries/<acrname> -o table
Comparez les deux principaux de service. S’ils ne correspondent pas, intégrez à nouveau le cluster AKS au registre de conteneurs.
Solution 4 : Vérifiez que l’identité kubelet est référencée dans akS VMSS
Lorsqu’une identité managée est utilisée pour l’authentification auprès de l’ACR, l’identité managée est appelée identité kubelet. Par défaut, l’identité kubelet est affectée au niveau de VMSS AKS. Si l’identité kubelet est supprimée des VMSS AKS, les nœuds AKS ne peuvent pas extraire les images de l’ACR.
Pour rechercher l’identité kubelet de votre cluster AKS, exécutez la commande suivante :
az aks show --resource-group <MyResourceGroup> --name <MyManagedCluster> --query identityProfile.kubeletidentity
Ensuite, vous pouvez répertorier les identités des VMSS AKS en ouvrant vmSS à partir du groupe de ressources de nœud et en sélectionnant Identity>User affecté dans le Portail Azure ou en exécutant la commande suivante :
az vmss identity show --resource-group <NodeResourceGroup> --name <AksVmssName>
Si l’identité kubelet de votre cluster AKS n’est pas affectée à AKS VMSS, affectez-la.
Note
La modification des VMSS AKS à l’aide des API IaaS ou de l’Portail Azure n’est pas prise en charge, et aucune opération AKS ne peut supprimer l’identité kubelet de l’instance VMSS AKS. Cela signifie que quelque chose d’inattendu l’a supprimé, par exemple une suppression manuelle effectuée par un membre de l’équipe. Pour empêcher cette suppression ou cette modification, vous pouvez envisager d’utiliser la fonctionnalité NRGLockdown.
Étant donné que les modifications apportées aux vmSS AKS ne sont pas prises en charge, elles ne se propagent pas au niveau AKS. Pour réaffecter l’identité kubelet à AKS VMSS, une opération de rapprochement est nécessaire. Pour ce faire, exécutez la commande suivante :
az aks update --resource-group <MyResourceGroup> --name <MyManagedCluster>
Solution 5 : Vérifiez que le principal de service est correct et que le secret est valide
Si vous extrayez une image à l’aide d’un secret d’extraction d’image et que le secret Kubernetes a été créé à l’aide des valeurs d’un principal de service, vérifiez que le principal de service associé est correct et que le secret est toujours valide. Effectuez les étapes suivantes :
Exécutez la commande kubectl get et base64 suivante pour afficher les valeurs du secret Kubernetes :
kubectl get secret <secret-name> --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
Vérifiez la date d’expiration en exécutant la commande az ad sp credential list suivante. Le nom d’utilisateur est la valeur du principal de service.
az ad sp credential list --id "<username>" --query "[].endDate" --output tsv
Si nécessaire, réinitialisez le secret de ce principal de service en exécutant la commande az ad sp credential reset suivante :
az ad sp credential reset --name "$SP_ID" --query password --output tsv
Mettez à jour ou recréez le secret Kubernetes en conséquence.
Solution 6 : Vérifiez que le secret Kubernetes a les valeurs correctes du compte d’administrateur du registre de conteneurs
Si vous extrayez une image à l’aide d’un secret d’extraction d’image et que le secret Kubernetes a été créé à l’aide de valeurs de compte d’administrateur de registre de conteneurs, assurez-vous que les valeurs du secret Kubernetes sont identiques aux valeurs du compte d’administrateur du registre de conteneurs. Effectuez les étapes suivantes :
Exécutez la commande kubectl get et base64 suivante pour afficher les valeurs du secret Kubernetes :
kubectl get secret <secret-name> --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
Dans le Portail Azure, recherchez et sélectionnez Registres de conteneurs.
Dans la liste des registres de conteneurs, sélectionnez votre registre de conteneurs.
Dans le volet de navigation du registre de conteneurs, sélectionnez Clés d’accès.
Dans la page Clés d’accès du registre de conteneurs, comparez les valeurs du registre de conteneurs aux valeurs du secret Kubernetes.
Si les valeurs ne correspondent pas, mettez à jour ou recréez le secret Kubernetes en conséquence.
Note
Si une opération régénérer un mot de passe s’est produite, une opération nommée « Régénérer les informations d’identification de connexion du registre de conteneurs » s’affiche dans la page journal d’activité du registre de conteneurs. Le journal d’activité a une période de rétention de 90 jours.
Cause 2 : Erreur d’image introuvable
Échec de l’extraction de l’image " acrname.azurecr.io/ repository :tag> » : [rpc error : code = NotFound desc = failed to pull and unpack image « <acrname.azurecr.io/<> repository :tag » : failed to resolve reference « <acrname.azurecr.io/< repository :tag> » : <acrname.azurecr.io/>>>< repository :tag>> : not found<<
Solution : vérifiez que le nom de l’image est correct
Si vous voyez cette erreur, assurez-vous que le nom de l’image est entièrement correct. Vous devez vérifier le nom du Registre, le serveur de connexion du Registre, le nom du référentiel et la balise. Une erreur courante est que le serveur de connexion est spécifié en tant que « azureacr.io » au lieu de « azurecr.io ».
Si le nom de l’image n’est pas entièrement correct, l’erreur 401 Non autorisée peut également se produire, car AKS tente toujours une extraction anonyme, que le registre de conteneurs ait activé des accès de tirage anonymes.
Cause 3 : Erreur 403 Interdit
Échec de l’extraction de l’image « acrname.azurecr.io/<< repository :tag> » : rpc error : code = Unknown desc = failed to pull and unpack image « <acrname.azurecr.io/><> repository :tag> » : failed to resolve reference « <acrname.azurecr.io/>< repository :tag> » : failed to allow : failed to fetch anonymous token : 403 Forbidden
Solution 1 : Vérifiez que la liaison de réseau virtuel AKS est définie dans la zone DNS privé du registre de conteneurs
Si l’interface réseau du point de terminaison privé du registre de conteneurs et le cluster AKS se trouvent dans différents réseaux virtuels, assurez-vous que la liaison de réseau virtuel du réseau virtuel du cluster AKS est définie dans la zone DNS privé du registre de conteneurs. (Ce lien est nommé « privatelink.azurecr.io » par défaut.) Si la liaison de réseau virtuel n’est pas dans la zone DNS privé du registre de conteneurs, ajoutez-la en utilisant l’une des méthodes suivantes :
Dans le Portail Azure, sélectionnez la zone DNS privée « privatelink.azurecr.io », sélectionnez Liens>de réseau virtuel Ajouter sous le panneau Paramètres, puis sélectionnez un nom et le réseau virtuel du cluster AKS. Cliquez sur OK.
Note
Il est facultatif de sélectionner la fonctionnalité « Activer l’inscription automatique ».
Créez un lien de réseau virtuel vers la zone de DNS privé spécifiée à l’aide d’Azure CLI.
Solution 2 : Ajouter l’adresse IP publique d’AKS Load Balancer à la plage d’adresses IP autorisée du registre de conteneurs
Si le cluster AKS se connecte publiquement au registre de conteneurs (pas par le biais d’une liaison privée ou d’un point de terminaison) et que l’accès au réseau public du registre de conteneurs est limité aux réseaux sélectionnés, ajoutez l’adresse IP publique d’AKS Load Balancer à la plage d’adresses IP autorisée du registre de conteneurs :
Vérifiez que l’accès au réseau public est limité aux réseaux sélectionnés.
Dans le Portail Azure, accédez au registre de conteneurs. Sous Paramètres, sélectionnez Mise en réseau. Sous l’onglet Accès public, l’accès au réseau public est défini sur Réseaux sélectionnés ou Désactivé.
Obtenez l’adresse IP publique d’AKS Load Balancer en utilisant l’une des méthodes suivantes :
Dans le Portail Azure, accédez au cluster AKS. Sous Paramètres, sélectionnez Propriétés, sélectionnez l’un des groupes de machines virtuelles identiques dans le groupe de ressources d’infrastructure, puis vérifiez l’adresse IP publique de l’équilibreur de charge AKS.
Exécutez la commande suivante :
az network public-ip show --resource-group <infrastructure-resource-group> --name <public-IP-name> --query ipAddress -o tsv
Autorisez l’accès à partir de l’adresse IP publique d’AKS Load Balancer en utilisant l’une des méthodes suivantes :
Exécutez la
az acr network-rule add
commande comme suit :az acr network-rule add --name acrname --ip-address <AKS-load-balancer-public-IP-address>
Pour plus d’informations, consultez Ajouter une règle réseau au Registre.
Dans le Portail Azure, accédez au registre de conteneurs. Sous Paramètres, sélectionnez Mise en réseau. Sous l’onglet Accès public, sous Pare-feu, ajoutez l’adresse IP publique d’AKS Load Balancer à la plage d’adresses, puis sélectionnez Enregistrer. Pour plus d’informations, consultez Access à partir du réseau public sélectionné - portail.
Note
Si l’accès au réseau public est défini sur Désactivé, basculez-le d’abord sur Réseaux sélectionnés .
Cause 4 : « Erreur de délai d’expiration d’e/s »
Échec de l’extraction de l’image " acrname.azurecr.io/ repository :tag> » : rpc error : code = Unknown desc = failed to pull and unpack image « <acrname.azurecr.io/>>< repository :tag> » : failed to resolve reference « <acrname.azurecr.io/>< repository :tag> » : échec de la demande : Head « https://< acrname.azurecr.io/v2/<> repository>/manifests/v1 » : dial tcp <acrprivateipaddress> :443 : i/o timeout<<
Note
L’erreur « délai d’expiration des e/s » se produit uniquement lorsque vous vous connectez en privé à un registre de conteneurs à l’aide d’Azure Private Link.
Solution 1 : Vérifier que le peering de réseaux virtuels est utilisé
Si l’interface réseau du point de terminaison privé du registre de conteneurs et le cluster AKS se trouvent dans différents réseaux virtuels, vérifiez que le peering de réseaux virtuels est utilisé pour les deux réseaux virtuels. Vous pouvez vérifier le peering de réseaux virtuels en exécutant la commande az network vnet peering list --resource-group <MyResourceGroup> --vnet-name <MyVirtualNetwork> --output table
Azure CLI ou dans le Portail Azure en sélectionnant les peerings> de réseaux virtuels sous le panneau Paramètres. Pour plus d’informations sur la liste de tous les peerings d’un réseau virtuel spécifié, consultez az network vnet peering list.
Si le peering de réseaux virtuels est utilisé pour les deux réseaux virtuels, vérifiez que l’état est « Connecté ». Si l’état est déconnecté, supprimez le peering des deux réseaux virtuels, puis recréez-le. Si l’état est « Connecté », consultez le guide de résolution des problèmes : l’état de peering est « Connecté ».
Pour plus de dépannage, connectez-vous à l’un des nœuds ou pods AKS, puis testez la connectivité avec le registre de conteneurs au niveau TCP à l’aide de l’utilitaire Telnet ou Netcat. Vérifiez l’adresse IP avec la nslookup <acrname>.azurecr.io
commande, puis exécutez la telnet <ip-address-of-the-container-registry> 443
commande.
Pour plus d’informations sur la connexion à des nœuds AKS, consultez Se connecter avec SSH aux nœuds de cluster Azure Kubernetes Service (AKS) pour la maintenance ou la résolution des problèmes.
Solution 2 : Utiliser le service Pare-feu Azure
Si l’interface réseau du point de terminaison privé du registre de conteneurs et le cluster AKS se trouvent dans différents réseaux virtuels, en plus du peering de réseaux virtuels, vous pouvez utiliser Pare-feu Azure Service pour configurer une topologie de réseau hub-spoke dans Azure. Lorsque vous configurez la règle de pare-feu, vous devez utiliser des règles réseau pour autoriser explicitement la connexion sortante aux adresses IP du point de terminaison privé du registre de conteneurs.
Cause 5 : Aucune correspondance pour la plateforme dans le manifeste
Le système d’exploitation hôte (système d’exploitation de nœud) est incompatible avec l’image utilisée pour le pod ou le conteneur. Par exemple, si vous planifiez un pod pour exécuter un conteneur Linux sur un nœud Windows ou un conteneur Windows sur un nœud Linux, l’erreur suivante se produit :
Échec de l’extraction de l’image «< acrname.azurecr.io/>< repository :tag> » :
[
erreur rpc :
code = NotFound
desc = échec de l’extraction et de la décompression de l’image « acrname.azurecr.io/<>< repository :tag> » : aucune correspondance pour la plateforme dans le manifeste : introuvable,
]
Cette erreur peut se produire pour une image extraite de n’importe quelle source, tant que l’image n’est pas compatible avec le système d’exploitation hôte. L’erreur n’est pas limitée aux images extraites du registre de conteneurs.
Solution : Configurer le champ nodeSelector correctement dans votre pod ou déploiement
Spécifiez le champ approprié nodeSelector
dans les paramètres de configuration de votre pod ou déploiement. La valeur correcte du paramètre de kubernetes.io/os
ce champ garantit que le pod sera planifié sur le type de nœud approprié. Le tableau suivant montre comment définir le kubernetes.io/os
paramètre dans YAML :
Type de conteneur | Paramètre YAML |
---|---|
Conteneur Linux | "kubernetes.io/os": linux |
Conteneur Windows | "kubernetes.io/os": windows |
Par exemple, le code YAML suivant décrit un pod qui doit être planifié sur un nœud Linux :
apiVersion: v1
kind: Pod
metadata:
name: aspnetapp
labels:
app: aspnetapp
spec:
containers:
- image: "mcr.microsoft.com/dotnet/core/samples:aspnetapp"
name: aspnetapp-image
ports:
- containerPort: 80
protocol: TCP
nodeSelector:
"kubernetes.io/os": linux
Plus d’informations
Si les conseils de dépannage de cet article ne vous aident pas à résoudre le problème, voici d’autres éléments à prendre en compte :
Vérifiez les groupes de sécurité réseau et les tables de routage associées aux sous-réseaux, si vous avez l’un de ces éléments.
Si une appliance virtuelle comme un pare-feu contrôle le trafic entre les sous-réseaux, vérifiez les règles d’accès au pare-feu et au pare-feu.
Exclusion de responsabilité de tiers
Les produits tiers mentionnés dans le présent article sont fabriqués par des sociétés indépendantes de Microsoft. Microsoft exclut toute garantie, implicite ou autre, concernant les performances ou la fiabilité de ces produits.
Contactez-nous pour obtenir de l’aide
Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.