Vyžádání imagí z registru kontejneru Azure do clusteru Kubernetes pomocí tajného klíče pro vyžádání změ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 je minikube a druh. 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ří tajný klíč pro vyžádání obsahu pomocí přihlašovacích údajů instančního objektu Microsoft Entra. Tajný klíč pro vyžádání změn můžete nakonfigurovat také pomocí jiných přihlašovacích údajů registru kontejneru Azure, jako je přístupový token v oboru úložiště.

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.

Předpoklady

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 instanční objekt s přístupem k registru kontejneru, spusťte v Azure Cloud Shellu nebo 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 tématu Role a oprávnění ACR.

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ěřily v registru kontejneru jako instanční objekt.

#!/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 instančního objektu

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 instančního objektu můžete udělit přístup pull, push a pull a přístup vlastníka.

Následující skript pomocí příkazu az role assignment create udělí oprávnění k přijetí změn instančnímu objektu SERVICE_PRINCIPAL_ID , který zadáte v proměnné. --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 heslo instančního objektu neuložíte nebo nepamatujete, můžete ho 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 instanční objekt.

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

Kubernetes používá tajný kód pro vyžádání image k ukládání informací potřebných k ověření ve vašem registru. Pokud chcete vytvořit tajný klíč pro vyžádání obsahu pro registr kontejneru Azure, zadáte ID instančního objektu, heslo a adresu URL registru.

Vytvořte tajný kód pro vyžádá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 kódu pro přijetí změn obrázku, 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 instančního objektu, který bude Kubernetes používat pro přístup k vašemu registru
service-principal-password Heslo instančního objektu

Použití tajného kódu pro vyžádání image

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 název image, která se má vyžádat z registru kontejneru Azure, a acr-secret je název tajného klíče pro vyžádání změn, my-awesome-app:v1 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