Installatiekopieën ophalen uit een Azure-containerregister naar een Kubernetes-cluster met behulp van een pull-geheim

U kunt een Azure-containerregister gebruiken als bron van containerinstallatiekopieën met elk Kubernetes-cluster, inclusief 'lokale' Kubernetes-clusters, zoals minikube en soort. In dit artikel wordt beschreven hoe u een Kubernetes-pull-geheim maakt met behulp van referenties voor een Azure-containerregister. Gebruik vervolgens het geheim om installatiekopieën op te halen uit een Azure-containerregister in een pod-implementatie.

In dit voorbeeld wordt een pull-geheim gemaakt met de referenties van de Microsoft Entra-service-principal. U kunt ook een pull-geheim configureren met behulp van andere Azure Container Registry-referenties, zoals een toegangstoken met opslagplaatsbereik.

Notitie

Hoewel pull-geheimen vaak worden gebruikt, brengen ze extra beheeroverhead met zich mee. Als u Azure Kubernetes Service gebruikt, raden we andere opties aan, zoals het gebruik van de beheerde identiteit of service-principal van het cluster om de installatiekopie veilig op te halen zonder een extra imagePullSecrets instelling op elke pod.

Vereisten

In dit artikel wordt ervan uitgegaan dat u al een privé-Azure-containerregister hebt gemaakt. U moet ook een Kubernetes-cluster uitvoeren en toegankelijk maken via het kubectl opdrachtregelprogramma.

Een service-principal maken

Als u een service-principal wilt maken met toegang tot uw containerregister, voert u het volgende script uit in Azure Cloud Shell of een lokale installatie van de Azure CLI. Het script is opgemaakt voor de Bash-shell.

Werk de ACR_NAME variabele bij met de naam van het containerregister voordat u het script uitvoert. De SERVICE_PRINCIPAL_NAME waarde moet uniek zijn binnen uw Microsoft Entra-tenant. Als u een ''http://acr-service-principal' already exists.'-fout ontvangt, geeft u een andere naam op voor de service-principal.

U kunt desgewenst de --role waarde wijzigen in de opdracht az ad sp create-for-rbac als u verschillende machtigingen wilt verlenen. Zie ACR-rollen en -machtigingen voor een volledige lijst met rollen.

Nadat u het script hebt uitgevoerd, noteert u de id en het wachtwoord van de service-principal. Zodra u de referenties hebt, kunt u uw toepassingen en services configureren voor verificatie bij uw containerregister als de service-principal.

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

Een bestaande service-principal gebruiken

Als u registertoegang wilt verlenen aan een bestaande service-principal, moet u een nieuwe rol toewijzen aan de service-principal. Net als bij het maken van een nieuwe service-principal kunt u onder andere pull-, push- en pull- en eigenaartoegang verlenen.

In het volgende script wordt de opdracht az role assignment create gebruikt om pull-machtigingen te verlenen aan een service-principal die u in de SERVICE_PRINCIPAL_ID variabele opgeeft. Pas de --role waarde aan als u een ander toegangsniveau wilt verlenen.

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

Als u het wachtwoord van de service-principal niet opslaat of onthoudt, kunt u het opnieuw instellen met de opdracht az ad sp credential reset :

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

Met deze opdracht wordt een nieuw, geldig wachtwoord voor uw service-principal geretourneerd.

Een pull-geheim voor afbeeldingen maken

Kubernetes maakt gebruik van een pull-geheim voor installatiekopieën om informatie op te slaan die nodig is voor verificatie bij uw register. Als u het pull-geheim voor een Azure-containerregister wilt maken, geeft u de service-principal-id, het wachtwoord en de register-URL op.

Maak een pull-geheim voor afbeeldingen met de volgende kubectl opdracht:

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>

waarbij geldt:

Waarde Omschrijving
secret-name Naam van het pull-geheim van de installatiekopie, bijvoorbeeld acr-secret
namespace Kubernetes-naamruimte om het geheim in te zetten
Alleen nodig als u het geheim in een andere naamruimte wilt plaatsen dan de standaardnaamruimte
container-registry-name Naam van uw Azure-containerregister, bijvoorbeeld myregistry

Dit --docker-server is de volledig gekwalificeerde naam van de aanmeldingsserver van het register
service-principal-ID Id van de service-principal die door Kubernetes wordt gebruikt voor toegang tot uw register
service-principal-password Wachtwoord voor service-principal

Het pull-geheim van de installatiekopie gebruiken

Zodra u het pull-geheim voor de installatiekopie hebt gemaakt, kunt u het gebruiken om Kubernetes-pods en -implementaties te maken. Geef de naam op van het geheim onder imagePullSecrets in het implementatiebestand. Bijvoorbeeld:

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 het voorgaande voorbeeld my-awesome-app:v1 is dit de naam van de installatiekopie die moet worden opgehaald uit het Azure-containerregister en acr-secret is dit de naam van het pull-geheim dat u hebt gemaakt voor toegang tot het register. Wanneer u de pod implementeert, haalt Kubernetes automatisch de installatiekopie op uit het register als deze nog niet aanwezig is op het cluster.

Volgende stappen