Ściąganie obrazów z rejestru kontenerów platformy Azure do klastra Kubernetes przy użyciu wpisu tajnego ściągania

Rejestr kontenerów platformy Azure można użyć jako źródła obrazów kontenerów z dowolnym klastrem Kubernetes, w tym klastrami Kubernetes "lokalnymi", takimi jak minikube i rodzaj. W tym artykule pokazano, jak utworzyć wpis tajny ściągania rozwiązania Kubernetes przy użyciu poświadczeń dla rejestru kontenerów platformy Azure. Następnie użyj wpisu tajnego, aby ściągnąć obrazy z rejestru kontenerów platformy Azure we wdrożeniu zasobnika.

W tym przykładzie tworzony jest wpis tajny ściągania przy użyciu poświadczeń jednostki usługi Microsoft Entra. Możesz również skonfigurować wpis tajny ściągania przy użyciu innych poświadczeń rejestru kontenerów platformy Azure, takich jak token dostępu o zakresie repozytorium.

Uwaga

Podczas gdy wpisy tajne ściągania są często używane, zapewniają dodatkowe obciążenie związane z zarządzaniem. Jeśli używasz usługi Azure Kubernetes Service, zalecamy inne opcje , takie jak użycie tożsamości zarządzanej klastra lub jednostki usługi w celu bezpiecznego ściągania obrazu bez dodatkowego imagePullSecrets ustawienia na każdym zasobniku.

Wymagania wstępne

W tym artykule założono, że utworzono już prywatny rejestr kontenerów platformy Azure. Musisz również mieć uruchomiony klaster Kubernetes i dostępny za pośrednictwem kubectl narzędzia wiersza polecenia.

Tworzenie jednostki usługi

Aby utworzyć jednostkę usługi z dostępem do rejestru kontenerów, uruchom następujący skrypt w usłudze Azure Cloud Shell lub lokalnej instalacji interfejsu wiersza polecenia platformy Azure. Skrypt jest sformatowany dla powłoki Bash.

Przed uruchomieniem skryptu zaktualizuj zmienną ACR_NAME przy użyciu nazwy rejestru kontenerów. Wartość musi być unikatowa SERVICE_PRINCIPAL_NAME w dzierżawie firmy Microsoft Entra. Jeśli zostanie wyświetlony błąd "'http://acr-service-principal' already exists.", określ inną nazwę jednostki usługi.

Opcjonalnie możesz zmodyfikować --role wartość w poleceniu az ad sp create-for-rbac , jeśli chcesz udzielić różnych uprawnień. Aby uzyskać pełną listę ról, zobacz Role i uprawnienia usługi ACR.

Po uruchomieniu skryptu zanotuj identyfikator i hasło jednostki usługi. Po utworzeniu poświadczeń można skonfigurować aplikacje i usługi w celu uwierzytelniania w rejestrze kontenerów jako jednostki usługi.

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

Korzystanie z istniejącej jednostki usługi

Aby udzielić dostępu rejestru do istniejącej jednostki usługi, musisz przypisać nową rolę do jednostki usługi. Podobnie jak w przypadku tworzenia nowej jednostki usługi, możesz udzielić między innymi dostępu do ściągania, wypychania i ściągania oraz właściciela.

Poniższy skrypt używa polecenia az role assignment create , aby udzielić uprawnień ściągnięcia do jednostki usługi określonej w zmiennej SERVICE_PRINCIPAL_ID . Dostosuj wartość, --role jeśli chcesz przyznać inny poziom dostępu.

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

Jeśli nie zapiszesz ani nie zapamiętasz hasła jednostki usługi, możesz zresetować je za pomocą polecenia az ad sp credential reset :

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

To polecenie zwraca nowe, prawidłowe hasło dla jednostki usługi.

Tworzenie wpisu tajnego ściągania obrazu

Platforma Kubernetes używa wpisu tajnego ściągania obrazu do przechowywania informacji potrzebnych do uwierzytelnienia w rejestrze. Aby utworzyć wpis tajny ściągania dla rejestru kontenerów platformy Azure, podaj identyfikator jednostki usługi, hasło i adres URL rejestru.

Utwórz wpis tajny ściągania obrazu za pomocą następującego kubectl polecenia:

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>

gdzie:

Wartość Opis
secret-name Nazwa wpisu tajnego ściągania obrazu, na przykład acr-secret
namespace Przestrzeń nazw platformy Kubernetes w celu wprowadzenia wpisu tajnego
Wymagane tylko wtedy, gdy chcesz umieścić wpis tajny w przestrzeni nazw innej niż domyślna przestrzeń nazw
container-registry-name Nazwa rejestru kontenerów platformy Azure, na przykład myregistry

To --docker-server w pełni kwalifikowana nazwa serwera logowania rejestru
service-principal-ID Identyfikator jednostki usługi, która będzie używana przez platformę Kubernetes do uzyskiwania dostępu do rejestru
service-principal-password Hasło jednostki usługi

Używanie wpisu tajnego ściągania obrazu

Po utworzeniu wpisu tajnego ściągania obrazu można go użyć do tworzenia zasobników i wdrożeń platformy Kubernetes. Podaj nazwę wpisu tajnego imagePullSecrets w pliku wdrożenia. Przykład:

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

W poprzednim przykładzie jest nazwą obrazu do my-awesome-app:v1 ściągnięcia z rejestru kontenerów platformy Azure i acr-secret nazwą utworzonego wpisu tajnego ściągania w celu uzyskania dostępu do rejestru. Podczas wdrażania zasobnika platforma Kubernetes automatycznie ściąga obraz z rejestru, jeśli nie jest jeszcze obecny w klastrze.

Następne kroki