Pullen von Images aus einer Azure-Containerregistrierung in einen Kubernetes-Cluster mithilfe eines Pullgeheimnisses

Sie können eine Azure-Containerregistrierung als Quelle von Containerimages mit einem beliebigen Kubernetes-Cluster verwenden, einschließlich „lokaler“ Kubernetes-Cluster wie minikube und kind. Dieser Artikel beschreibt, wie Sie ein Kubernetes-Pullgeheimnis mit Anmeldeinformationen für eine Azure-Containerregistrierung erstellen. Mit dem Geheimnis pullen Sie dann Images aus einer Azure-Containerregistrierung in einer Pod-Bereitstellung.

In diesem Beispiel wird ein Pullgeheimnis mithilfe Microsoft Entra Dienstprinzipal-Anmeldeinformationen erstellt. Sie können ein Pullgeheimnis auch mit anderen Azure Container Registry-Anmeldeinformationen konfigurieren, z. B. einem repositoryspezifischen Zugriffstoken.

Hinweis

Pullgeheimnisse werden zwar häufig verwendet, verursachen aber zusätzlichen Verwaltungsaufwand. Wenn Sie Azure Kubernetes Service verwenden, empfehlen wir andere Optionen, z. B. die Verwendung der verwalteten Identität oder des Dienstprinzipals des Clusters, um das Image ohne zusätzliche imagePullSecrets-Einstellung auf jedem Pod sicher zu pullen.

Voraussetzungen

In diesem Artikel wird davon ausgegangen, dass Sie bereits eine private Azure-Containerregistrierung erstellt haben. Außerdem benötigen Sie einen Kubernetes-Cluster, auf den über das Befehlszeilentool kubectl zugegriffen werden kann.

Erstellen eines Dienstprinzipals

Führen Sie zum Erstellen eines Dienstprinzipals mit Zugriff auf die Containerregistrierung das folgende Skript in Azure Cloud Shell oder in einer lokalen Installation der Azure CLI aus. Das Skript ist für die Bash-Shell formatiert.

Aktualisieren Sie vor dem Ausführen des Skripts die Variable ACR_NAME mit dem Namen Ihrer Containerregistrierung. Der SERVICE_PRINCIPAL_NAME-Wert muss innerhalb Ihres Microsoft Entra-Mandanten eindeutig sein. Wird der Fehler 'http://acr-service-principal' already exists. angezeigt, geben Sie einen anderen Namen für den Dienstprinzipal an.

Optional können Sie den Wert --role im Befehl az ad sp create-for-rbac ändern, falls Sie andere Berechtigungen gewähren möchten. Eine vollständige Liste der Rollen finden Sie unter ACR-Rollen und -Berechtigungen.

Nachdem Sie das Skript ausgeführt haben, notieren Sie die ID und das Kennwort des Dienstprinzipals. Sobald Sie über dessen Anmeldeinformationen verfügen, können Sie Ihre Anwendungen und Dienste so konfigurieren, dass diese bei Ihrer Containerregistrierung als Dienstprinzipal authentifiziert werden.

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

Verwenden eines vorhandenen Dienstprinzipals

Damit Sie einem vorhandenen Dienstprinzipal den Zugriff auf die Registrierung gewähren können, müssen Sie dem Dienstprinzipal eine neue Rolle zuweisen. Wie bei der Erstellung eines neuen Dienstprinzipals können Sie unter anderem Pull-, Push- und Pull- sowie Besitzerzugriff gewähren.

Das folgende Skript verwendet den Befehl az role assignment create, um einem Dienstprinzipal Pull-Berechtigungen zuzuweisen, den Sie in der Variablen SERVICE_PRINCIPAL_ID festlegen. Passen Sie den Wert --role an, wenn Sie eine andere Zugriffsebene zuweisen möchten.

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

Wenn Sie das Kennwort des Dienstprinzipals nicht gespeichert oder es vergessen haben, können Sie es mit dem Befehl az ad sp credential reset zurücksetzen:

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

Mit diesem Befehl wird ein neues gültiges Kennwort für den Dienstprinzipal zurückgegeben.

Erstellen eines Geheimnisses für Imagepullvorgänge

In Kubernetes wird ein Geheimnis für Imagepullvorgänge verwendet, um Informationen zu speichern, die für die Authentifizierung bei Ihrer Registrierung benötigt werden. Zum Erstellen des Geheimnisses für Pullvorgänge für eine Azure-Containerregistrierung geben Sie die ID und das Kennwort des Dienstprinzipals sowie die Registrierungs-URL an.

Erstellen Sie mit dem folgenden kubectl-Befehl ein Geheimnis für Imagepullvorgänge:

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>

Dabei gilt:

Wert BESCHREIBUNG
secret-name Name des Geheimnisses für Imagepullvorgänge, z. B. acr-secret
namespace Kubernetes-Namespace, in dem das Geheimnis eingefügt werden soll.
Nur erforderlich, wenn das Geheimnis in einem anderen Namespace als dem Standardnamespace eingefügt werden soll.
container-registry-name Name Ihrer Azure-Containerregistrierung, z. B. myregistry

--docker-server ist der vollqualifizierte Name des Registrierungsanmeldeservers.
service-principal-ID ID des Dienstprinzipals, der in Kubernetes für den Zugriff auf die Registrierung verwendet wird
service-principal-password Kennwort des Dienstprinzipals

Verwenden des Geheimnisses für Imagepullvorgänge

Nach dem Erstellen des Geheimnisses für Imagepullvorgänge können Sie es verwenden, um Kubernetes-Pods und Kubernetes-Bereitstellungen zu erstellen. Geben Sie den Namen des Geheimnisses unter imagePullSecrets in der Bereitstellungsdatei an. Beispiel:

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

In diesem Beispiel ist my-awesome-app:v1 der Name des aus der Azure-Containerregistrierung zu pullenden Images und acr-secret der Name des für den Zugriff auf die Registrierung erstellten Geheimnisses für Pullvorgänge. Wenn Sie den Pod bereitstellen, pullt Kubernetes das Image automatisch aus der Registrierung, wenn es nicht bereits im Cluster vorhanden ist.

Nächste Schritte