Извлечение образов из реестра контейнеров Azure в кластер Kubernetes с помощью секрета для извлечения

Вы можете использовать реестр контейнеров Azure в качестве источника образов контейнеров с любым кластером Kubernetes, включая локальные кластеры Kubernetes, такие как minikube и Kind. В этой статье показано, как создать секрет Kubernetes для извлечения с помощью учетных данных для реестра контейнеров Azure и как затем использовать секрет для извлечения образов из реестра контейнеров Azure в развертывании pod.

В этом примере создается секрет извлечения с помощью учетных данных субъекта-службы Microsoft Entra. Настроить секрет для извлечения можно также с помощью других учетных данных реестра контейнеров Azure, например маркера доступа на уровне репозитория.

Примечание.

Хотя использование секретов для извлечения является обычным делом, они влекут дополнительные расходы на управление. Если вы используете Службу Azure Kubernetes, мы рекомендуем использовать другие варианты, такие как использование управляемого удостоверения или субъекта-службы кластера для безопасного извлечения образа без дополнительной установки imagePullSecrets для каждого модуля pod.

Необходимые компоненты

В этой статье предполагается, что вы уже создали частный реестр контейнеров Azure. Кроме того, необходимо запустить кластер Kubernetes и получить доступ к нему через kubectl программу командной строки.

Создание субъекта-службы

Чтобы создать субъект-службу с доступом к реестру контейнеров, выполните следующий скрипт в Azure Cloud Shell или локальную установку Azure CLI. Скрипт отформатирован для оболочки Bash.

Перед выполнением сценария обновите переменную ACR_NAME с именем реестра контейнеров. Значение SERVICE_PRINCIPAL_NAME должно быть уникальным в клиенте Microsoft Entra. Если вы получаете ошибку "'http://acr-service-principal' already exists.", укажите другое имя для субъекта-службы.

Можно изменять значение --role в команде az ad sp create-for-rbac, если необходимо предоставить другие разрешения. Полный список ролей см. в разделе Роли и разрешения реестра контейнеров Azure.

После запуска скрипта запишите идентификатор и пароль субъекта-службы. Сохранив эти учетные данные, вы можете настроить приложения и службы для аутентификации в качестве субъектов-служб в реестре контейнеров.

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

Использование существующего субъекта-службы

Чтобы предоставить субъекту-службе доступ к реестру, нужно назначить новую роль субъекту-службе. Как и при создании субъекта-службы, вы, помимо прочего, можете предоставить разрешения на извлечение данных, отправку и извлечение данных, а также разрешения владельца.

В следующем скрипте используется команда az role assignment create, чтобы предоставить разрешения на извлечение субъекту-службе, указанному в переменной SERVICE_PRINCIPAL_ID. Измените значение --role, если нужно предоставить другой уровень доступа.

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

Если вы не помните или не сохранили пароль субъекта-службы, его можно сбросить с помощью команды az ad sp Credential reset:

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

Эта команда возвращает новый, допустимый пароль для субъект-службы.

Создание секрета для извлечения образа

Kubernetes использует секрет для извлечения образа с целью хранения сведений, необходимых для проверки подлинности реестра. Чтобы создать секрет для реестра контейнеров Azure, укажите идентификатор субъект-службы, пароль и URL-адрес реестра.

Создайте секрет для извлечения образа с помощью следующей kubectl команды:

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>

где:

Стоимость Description
secret-name Имя секрета для извлечения образа, например acr-secret
namespace Пространство имен Kubernetes для вставки секрета в
Требуется только в том случае, если вы хотите поместить секрет в пространство имен, отличное от пространства имен по умолчанию
container-registry-name Имя вашего реестра контейнеров Azure, например myregistry

--docker-server— это полное имя сервера входа в реестр.
service-principal-ID Идентификатор субъект-службы, который будет использоваться Kubernetes для доступа к реестру.
service-principal-password пароль субъекта-службы.

Использование секрета для извлечения образа

После создания секрета для извлечения образа его можно использовать для создания модулей Kubernetes и развертываний. Укажите имя секрета в imagePullSecrets файле развертывания. Например:

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

В предыдущем примере my-awesome-app:v1 — это имя образа, который необходимо извлечь из реестра контейнеров Azure, а acr-secret — это имя секрета, который вы создали для доступа к реестру. При развертывании модуля Kubernetes автоматически извлекает образ из реестра, если он еще не существует в кластере.

Следующие шаги