Hämta avbildningar från ett Azure-containerregister till ett Kubernetes-kluster med hjälp av en pull-hemlighet

Du kan använda ett Azure-containerregister som källa för containeravbildningar med alla Kubernetes-kluster, inklusive "lokala" Kubernetes-kluster som minikube och kind. Den här artikeln visar hur du skapar en Kubernetes-pullhemlighet med autentiseringsuppgifter för ett Azure-containerregister. Använd sedan hemligheten för att hämta avbildningar från ett Azure-containerregister i en podddistribution.

I det här exemplet skapas en pull-hemlighet med autentiseringsuppgifter för Tjänstens huvudnamn i Microsoft Entra. Du kan också konfigurera en pull-hemlighet med hjälp av andra autentiseringsuppgifter för Azure-containerregistret, till exempel en åtkomsttoken med lagringsplatsomfattning.

Kommentar

Även om pull-hemligheter ofta används ger de ytterligare hanteringskostnader. Om du använder Azure Kubernetes Service rekommenderar vi andra alternativ , till exempel att använda klustrets hanterade identitet eller tjänstens huvudnamn för att på ett säkert sätt hämta avbildningen utan ytterligare imagePullSecrets inställningar för varje podd.

Förutsättningar

Den här artikeln förutsätter att du redan har skapat ett privat Azure-containerregister. Du måste också ha ett Kubernetes-kluster som körs och är tillgängligt via kubectl kommandoradsverktyget.

Skapa ett huvudnamn för tjänsten

Om du vill skapa ett huvudnamn för tjänsten med åtkomst till ditt containerregister kör du följande skript i Azure Cloud Shell eller en lokal installation av Azure CLI. Skriptet är formaterat för Bash-gränssnittet.

Innan du kör skriptet uppdaterar du variabeln ACR_NAME med namnet på containerregistret. Värdet SERVICE_PRINCIPAL_NAME måste vara unikt i din Microsoft Entra-klientorganisation. Om du får ett "'http://acr-service-principal' already exists."-fel anger du ett annat namn för tjänstens huvudnamn.

Du kan också ändra --role värdet i kommandot az ad sp create-for-rbac om du vill bevilja olika behörigheter. En fullständig lista över roller finns i ACR-roller och behörigheter.

När du har kört skriptet noterar du tjänstens huvudnamns ID och lösenord. När du har dess autentiseringsuppgifter kan du konfigurera dina program och tjänster för att autentisera till containerregistret som tjänstens huvudnamn.

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

Använda ett befintligt huvudnamn för tjänsten

Om du vill bevilja registeråtkomst till ett befintligt huvudnamn för tjänsten måste du tilldela tjänstens huvudnamn en ny roll. Precis som när du skapar ett nytt huvudnamn för tjänsten kan du bland annat bevilja pull-, push- och pull-åtkomst och ägaråtkomst.

Följande skript använder kommandot az role assignment create för att bevilja pull-behörigheter till ett tjänsthuvudnamn som du anger i variabeln SERVICE_PRINCIPAL_ID . Justera värdet --role om du vill bevilja en annan åtkomstnivå.

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

Om du inte sparar eller kommer ihåg lösenordet för tjänstens huvudnamn kan du återställa det med kommandot az ad sp credential reset :

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

Det här kommandot returnerar ett nytt, giltigt lösenord för tjänstens huvudnamn.

Skapa en avbildningshämtningshemlighet

Kubernetes använder en avbildningshämtningshemlighet för att lagra information som behövs för att autentisera till registret. Om du vill skapa pull-hemligheten för ett Azure-containerregister anger du tjänstens huvudnamns-ID, lösenord och registrets URL.

Skapa en avbildningshämtningshemlighet med följande kubectl kommando:

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>

där:

Värde Description
secret-name Namnet på avbildningens pull-hemlighet, till exempel acr-secret
namespace Kubernetes-namnrymd för att placera hemligheten i
Behövs bara om du vill placera hemligheten i ett annat namnområde än standardnamnområdet
container-registry-name Namnet på ditt Azure-containerregister, till exempel myregistry

--docker-server är det fullständigt kvalificerade namnet på registerinloggningsservern
service-principal-ID ID för tjänstens huvudnamn som ska användas av Kubernetes för att komma åt registret
service-principal-password Lösenord för tjänstens huvudnamn

Använda avbildningens pull-hemlighet

När du har skapat avbildningens pull-hemlighet kan du använda den för att skapa Kubernetes-poddar och distributioner. Ange namnet på hemligheten under imagePullSecrets i distributionsfilen. Till exempel:

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

I föregående exempel my-awesome-app:v1 är namnet på avbildningen som ska hämtas från Azure-containerregistret och acr-secret är namnet på den pull-hemlighet som du skapade för att komma åt registret. När du distribuerar podden hämtar Kubernetes automatiskt avbildningen från registret, om den inte redan finns i klustret.

Nästa steg