Extraire des images d’un registre de conteneurs Azure vers un cluster Kubernetes au moyen d’un secret d’extraction
Vous pouvez utiliser un registre de conteneurs Azure comme source d’images conteneur avec n’importe quel cluster Kubernetes, notamment les clusters Kubernetes locaux, comme minikube et kind. Cet article explique comment créer un secret d’extraction Kubernetes à l’aide d’informations d’identification pour un registre de conteneurs Azure. Ensuite, utilisez le secret pour extraire des images à partir d’un registre de conteneurs Azure jusqu’à un déploiement de pod.
Cet exemple crée un secret d’extraction à l’aide des informations d’identification du principal du service Microsoft Entra. Vous pouvez également configurer un secret d’extraction à l’aide d’autres informations d’identification Azure Container Registry, telles qu’un jeton d’accès étendu au référentiel.
Notes
Bien que les secrets d’extraction soient couramment utilisés, ils entraînent une charge de gestion supplémentaire. Si vous utilisez Azure Kubernetes Service, nous vous recommandons d’autres options, telles que l’utilisation de l’identité managé du cluster ou du principal de service pour extraire l’image de manière sécurisée sans paramètre imagePullSecrets
supplémentaire sur chaque pod.
Prérequis
Cet article suppose que vous avez déjà créé un registre de conteneurs Azure privé. Vous devez également disposer d’un cluster Kubernetes en cours d’exécution et accessible via l’outil en ligne de commande kubectl
.
Créer un principal du service
Pour créer un principal de service avec accès à votre registre de conteneurs, exécutez le script suivant dans Azure Cloud Shell ou dans une installation locale de l’interface de ligne de commande Azure CLI. Le script est mis en forme pour l’interpréteur de commandes Bash.
Avant d’exécuter le script, mettez à jour la variable ACR_NAME
avec le nom de votre registre de conteneurs. La valeur SERVICE_PRINCIPAL_NAME
doit être unique dans votre locataire Microsoft Entra. Si vous recevez une erreur « 'http://acr-service-principal' already exists.
», spécifiez un autre nom pour le principal du service.
Vous pouvez éventuellement modifier la valeur --role
dans la commande az ad sp create-for-rbac si vous souhaitez accorder des autorisations différentes. Pour obtenir la liste complète des rôles, consultez Autorisations et rôles Azure Container Registry.
Après avoir exécuté le script, notez l’ID et le mot de passe du principal de service. Une fois que vous avez noté les informations d’identification, vous pouvez configurer vos applications et services afin qu’ils s’authentifient auprès de votre registre de conteneurs en tant que principal du service.
#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.
# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal
# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId
# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull: pull only
# acrpush: push and pull
# owner: push, pull, and assign roles
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)
# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"
Utiliser un principal de service existant
Pour accorder l’accès au registre à un principal de service existant, vous devez assigner un nouveau rôle au principal de service. Comme pour la création d’un principal du service, vous pouvez notamment accorder un accès en envoi (push), un accès en envoi et tirage (pull), ou un accès propriétaire.
Le script suivant utilise la commande az role assignment create pour accorder des autorisations en extraction à un principal de service que vous spécifiez dans la variable SERVICE_PRINCIPAL_ID
. Ajustez la valeur --role
si vous souhaitez accorder un niveau d’accès différent.
#!/bin/bash
# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry, and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_ID=$servicePrincipal
# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
# Assign the desired role to the service principal. Modify the '--role' argument
# value as desired:
# acrpull: pull only
# acrpush: push and pull
# owner: push, pull, and assign roles
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role acrpull
Si vous n’enregistrez pas ou que vous ne vous rappelez pas du mot de passe du principal de service, vous pouvez le réinitialiser avec la commande az ad sp credential reset :
az ad sp credential reset --name http://<service-principal-name> --query password --output tsv
Cette commande retourne un nouveau mot de passe valide pour votre principal de service.
Créer un secret d’extraction d’image
Kubernetes utilise un secret d’extraction d’image pour stocker les informations nécessaires pour s’authentifier auprès de votre registre. Pour créer le secret d’extraction pour un registre de conteneurs Azure, vous fournissez l’ID du principal de service, le mot de passe et l’URL du registre.
Créez un secret d’extraction d’image avec la commande kubectl
suivante :
kubectl create secret docker-registry <secret-name> \
--namespace <namespace> \
--docker-server=<container-registry-name>.azurecr.io \
--docker-username=<service-principal-ID> \
--docker-password=<service-principal-password>
où :
Valeur | Description |
---|---|
secret-name |
Nom du secret d’extraction d’image, par exemple, acr-secret |
namespace |
Espace de noms Kubernetes où placer le secret Nécessaire seulement si vous voulez placer le secret dans un espace de noms autre que l’espace de noms par défaut |
container-registry-name |
Nom de votre registre de conteneurs Azure, par exemple myregistry--docker-server est le nom complet du serveur de connexion au registre. |
service-principal-ID |
ID du principal de service qui sera utilisé par Kubernetes pour accéder à votre registre |
service-principal-password |
Mot de passe de principal de service |
Utiliser le secret d’extraction d’image
Une fois que vous avez créé le secret d’extraction d’image, vous pouvez l’utiliser pour créer des pods et des déploiements Kubernetes. Spécifiez le nom du secret sous imagePullSecrets
dans le fichier de déploiement. Par exemple :
apiVersion: v1
kind: Pod
metadata:
name: my-awesome-app-pod
namespace: awesomeapps
spec:
containers:
- name: main-app-container
image: myregistry.azurecr.io/my-awesome-app:v1
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: acr-secret
Dans l’exemple précédent, my-awesome-app:v1
est le nom de l’image à tirer (pull) du registre de conteneurs Azure, et acr-secret
le nom du secret de tirage (pull) que vous avez créé pour accéder au registre. Quand vous déployez le pod, Kubernetes extrait automatiquement l’image de votre registre, si elle n’est pas déjà présente sur le cluster.
Étapes suivantes
- Pour plus d’informations sur l’utilisation des principaux de service et d’Azure Container Registry, consultez Authentification Azure Container Registry avec des principaux de service
- Découvrez plus d’informations sur les secrets d’extraction d’image dans la documentation Kubernetes