Sdílet prostřednictvím


Stažení obrazů z registru kontejnerů Azure do clusteru Kubernetes pomocí tajného klíče pro stahování.

Registr kontejnerů Azure můžete použít jako zdroj imagí kontejnerů s jakýmkoli clusterem Kubernetes, včetně "místních" clusterů Kubernetes, jako jsou minikube a kind. Tento článek ukazuje, jak vytvořit tajný kód Kubernetes pomocí přihlašovacích údajů pro registr kontejneru Azure. Pak tajný klíč použijte k načtení imagí z registru kontejneru Azure v nasazení podu.

Tento příklad vytvoří přihlašovací tajemství pomocí přihlašovacích údajů služebního hlavního prvku Microsoft Entra. Volitelně můžete omezit oprávnění ke stažení pro instanční objekt služby na konkrétní repozitáře v registru pomocí oprávnění repozitáře podle Microsoft Entra.

Tajný kód pro vyžádání obsahu můžete také nakonfigurovat pomocí jiných přihlašovacích údajů registru kontejneru Azure, jako je použití oprávnění úložiště založeného na tokenech jiné společnosti než Microsoft Entra.

Poznámka:

I když se tajné kódy pro vyžádání obsahu běžně používají, přinášejí další režijní náklady na správu. Pokud používáte službu Azure Kubernetes Service, doporučujeme další možnosti , jako je použití spravované identity clusteru nebo instančního objektu k bezpečnému načtení image bez dalšího imagePullSecrets nastavení na jednotlivých podech.

Požadavky

Tento článek předpokládá, že jste už vytvořili privátní registr kontejneru Azure. Musíte mít také cluster Kubernetes spuštěný a přístupný prostřednictvím nástroje příkazového kubectl řádku.

Vytvoření instančního objektu služby

Pokud chcete vytvořit službu principal s přístupem k registru kontejneru, spusťte v Azure Cloud Shell nebo v místní instalaci Azure CLI následující skript. Skript je naformátovaný pro prostředí Bash.

Před spuštěním skriptu aktualizujte ACR_NAME proměnnou názvem vašeho registru kontejneru. Hodnota SERVICE_PRINCIPAL_NAME musí být jedinečná v rámci vašeho tenanta Microsoft Entra. Pokud se zobrazí chyba "'http://acr-service-principal' already exists.", zadejte jiný název instančního objektu.

Pokud chcete udělit různá oprávnění, můžete volitelně upravit --role hodnotu v příkazu az ad sp create-for-rbac . Úplný seznam rolí najdete v přehledu oprávnění a rolí služby Azure Container Registry Entra.

Po spuštění skriptu si poznamenejte ID a heslo instančního objektu. Jakmile budete mít přihlašovací údaje, můžete aplikace a služby nakonfigurovat tak, aby se ověřovaly v registru kontejnerů jako hlavní služba.

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

Použití existujícího služebního principála

Pokud chcete udělit přístup registru k existujícímu instančnímu objektu, musíte instančnímu objektu přiřadit novou roli. Stejně jako při vytváření nového služebního účtu musíte k udělení oprávnění služebnímu účtu provádět přiřazení rolí. Přehled oprávnění a rolí služby Azure Container Registry

Následující skript používá příkaz az role assignment create k udělení oprávnění pull služebnímu principalu, který zadáte v proměnné SERVICE_PRINCIPAL_ID. --role Upravte hodnotu, pokud chcete udělit jinou úroveň přístupu.

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

Pokud si neuložíte nebo nepamatujete heslo přihlašovacích údajů pro služební účet, můžete jej resetovat pomocí příkazu az ad sp credential reset.

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

Tento příkaz vrátí nové platné heslo pro služební principál.

Vytvoření tajného kódu pro vyžádání image

Kubernetes používá tajný klíč pro stahování image k uložení informací potřebných k ověření ve vašem registru. Pokud chcete vytvořit tajný klíč pro stažení pro registr kontejneru Azure, zadáte ID služebního účtu, heslo a adresu URL registru.

Vytvořte tajný klíč pro stahování image pomocí následujícího kubectl příkazu:

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>

kde:

Hodnota Popis
secret-name Název tajného klíče pro stahování obrázků, například acr-secret
namespace Obor názvů Kubernetes pro vložení tajného kódu do
Vyžaduje se pouze v případě, že chcete tajný klíč umístit do jiného oboru názvů než výchozí obor názvů.
container-registry-name Název registru kontejneru Azure, například myregistry

Jedná se --docker-server o plně kvalifikovaný název přihlašovacího serveru registru.
service-principal-ID ID služby, kterou Kubernetes bude používat pro přístup k vašemu registru
service-principal-password Heslo služby principal

Použijte přihlašovací tajemství pro stažení obrazu

Jakmile vytvoříte tajný kód pro vyžádání image, můžete ho použít k vytvoření podů a nasazení Kubernetes. Do souboru nasazení zadejte název tajného kódu imagePullSecrets . Příklad:

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

V předchozím příkladu je my-awesome-app:v1 název image pro stažení z registru kontejneru Azure a acr-secret je název tajného klíče, který jste vytvořili pro přístup k registru. Když pod nasadíte, Kubernetes automaticky načítá image z vašeho registru, pokud ještě není v clusteru.

Další kroky