Eseguire il pull di immagini da un registro contenitori di Azure a un cluster Kubernetes usando un segreto pull

È possibile usare un registro Contenitori di Azure come origine di immagini del contenitore con qualsiasi cluster Kubernetes, inclusi i cluster Kubernetes "locali", ad esempio minikube e tipo. Questo articolo illustra come creare un segreto pull kubernetes usando le credenziali per un registro Azure Container. Usare quindi il segreto per eseguire il pull delle immagini da un registro Contenitori di Azure in una distribuzione pod.

In questo esempio viene creato un segreto pull usando le credenziali dell'entità servizio Microsoft Entra. È anche possibile configurare un segreto pull usando altre credenziali del Registro Azure Container, ad esempio un token di accesso con ambito repository.

Nota

Anche se i segreti pull vengono comunemente usati, comportano un sovraccarico di gestione aggiuntivo. Se si usa servizio Azure Kubernetes, è consigliabile usare altre opzioni, ad esempio l'uso dell'identità gestita o dell'entità servizio del cluster per eseguire il pull sicuro dell'immagine senza un'impostazione aggiuntiva imagePullSecrets in ogni pod.

Prerequisiti

Questo articolo presuppone che sia già stato creato un registro Azure Container privato. È anche necessario disporre di un cluster Kubernetes in esecuzione e accessibile tramite lo kubectl strumento da riga di comando.

Creare un'entità servizio

Per creare un'entità servizio con accesso al registro contenitori, eseguire lo script seguente in Azure Cloud Shell o in un'installazione locale dell'interfaccia della riga di comando di Azure. Lo script viene formattato per la shell Bash.

Prima di eseguire lo script, aggiornare la variabile ACR_NAME con il nome del registro contenitori. Il SERVICE_PRINCIPAL_NAME valore deve essere univoco all'interno del tenant di Microsoft Entra. Se si riceve un errore "'http://acr-service-principal' already exists.", specificare un nome diverso per l'entità servizio.

È facoltativamente possibile modificare il valore --role nel comando az ad sp create-for-rbac se si vogliono concedere autorizzazioni diverse. Per un elenco completo dei ruoli, vedere ACR roles and permissions (Ruoli e autorizzazioni del registro Azure Container).

Dopo aver eseguito lo script, prendere nota dell'ID e della password dell'entità servizio. Dopo aver ottenuto le credenziali, è possibile configurare le applicazioni e i servizi per l'autenticazione nel registro contenitori come entità servizio.

#!/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"

Usare un'entità servizio esistente

Per concedere al registro l'accesso a un'entità servizio esistente, è necessario assegnare un nuovo ruolo all'entità servizio. Come per la creazione di una nuova entità servizio, è possibile concedere, tra gli altri, l'accesso pull, push e pull e proprietario.

Lo script seguente usa il comando az role assignment create per concedere le autorizzazioni pull a un'entità servizio specificata nella variabile SERVICE_PRINCIPAL_ID. Modificare il valore --role se si vuole concedere un livello di accesso diverso.

#!/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

Se non si salva o si ricorda la password dell'entità servizio, è possibile reimpostarla con il comando az ad sp credential reset :

az ad sp credential reset  --name http://<service-principal-name> --query password --output tsv

Questo comando restituisce una nuova password valida per l'entità servizio.

Creare un segreto pull di immagini

Kubernetes usa un segreto pull di immagini per archiviare le informazioni necessarie per l'autenticazione nel registro. Per creare il segreto pull per un registro Azure Container, specificare l'ID entità servizio, la password e l'URL del Registro di sistema.

Creare un segreto pull di immagini con il comando seguente kubectl :

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>

dove:

Valore Descrizione
secret-name Nome del segreto pull dell'immagine, ad esempio acr-secret
namespace Spazio dei nomi Kubernetes in cui inserire il segreto
Necessario solo se si desidera inserire il segreto in uno spazio dei nomi diverso dallo spazio dei nomi predefinito
container-registry-name Nome del registro Azure Container, ad esempio myregistry

--docker-server è il nome completo del server di accesso del Registro di sistema
service-principal-ID ID dell'entità servizio che verrà usata da Kubernetes per accedere al Registro di sistema
service-principal-password Password dell'entità servizio

Usare il segreto pull dell'immagine

Dopo aver creato il segreto pull dell'immagine, è possibile usarlo per creare pod e distribuzioni Kubernetes. Specificare il nome del segreto imagePullSecrets in nel file di distribuzione. Ad esempio:

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

Nell'esempio precedente, my-awesome-app:v1 è il nome dell'immagine da estrarre dal Registro Azure Container e acr-secret è il nome del segreto pull creato per accedere al Registro di sistema. Quando si distribuisce il pod, Kubernetes esegue automaticamente il pull dell'immagine dal registro, se non è già presente nel cluster.

Passaggi successivi