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 | beskrivning |
---|---|
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
- Mer information om hur du arbetar med tjänstens huvudnamn och Azure Container Registry finns i Azure Container Registry-autentisering med tjänstens huvudnamn
- Läs mer om hämtningshemligheter för avbildningar i Kubernetes-dokumentationen