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