Condividi tramite


Eseguire il pull di immagini da un registro contenitori di Azure a un cluster Kubernetes attraverso l’utilizzo di un segreto pull

È possibile utilizzare un registro contenitori di Azure come origine di immagini del contenitore con qualsiasi cluster Kubernetes, inclusi cluster Kubernetes "locali" come minikube e kind. 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 Azure Container in una distribuzione pod.

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

Nota

Pur venendo comunemente usati, i segreti pull comportano un sovraccarico di gestione aggiuntivo. Se si usa servizio Azure Kubernetes è consigliabile altre opzioni, come l'uso dell'identità gestita o dell'entità servizio del cluster per eseguire il pull sicuro dell'immagine senza un'impostazione imagePullSecrets aggiuntiva 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 strumento da riga di comando kubectl.

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 valore SERVICE_PRINCIPAL_NAME 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 non si ricorda la password dell'entità servizio, è possibile reimpostarla con il comando reimposta az ad sp credential:

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 autenticare il 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 kubectl seguente:

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 del registro di login
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

Utilizzare il segreto pull di immagini

Dopo aver creato il segreto pull dell'immagine, è possibile usarlo per creare pod e distribuzioni Kubernetes. Specificare il nome del segreto in imagePullSecrets 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, mentre 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