Ś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. Na 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
- Aby uzyskać więcej informacji na temat pracy z jednostkami usługi i usługą Azure Container Registry, zobacz Azure Container Registry authentication with service principals (Uwierzytelnianie usługi Azure Container Registry przy użyciu jednostek usługi)
- Dowiedz się więcej o wpisach tajnych ściągania obrazów w dokumentacji platformy Kubernetes