Поделиться через


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

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

В этом примере создается pull secret с использованием учетных данных основной учетной записи службы Microsoft Entra. При необходимости разрешения на доступ служебного принципала к извлечению можно ограничить конкретными репозиториями в реестре, используя разрешения репозитория на основе Microsoft Entra.

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

Примечание.

Хотя использование секретов для извлечения является обычным делом, они влекут дополнительные расходы на управление. Если вы используете Службу 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"

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

Чтобы предоставить существующему субъекту-службе доступ к реестру, нужно назначить ему новую роль. Как и при создании нового субъекта-службы, необходимо выполнять назначения ролей для предоставления разрешений субъекту-службе. См. Обзор разрешений и ролей Azure Container Registry Entra.

В следующем скрипте используется команда 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>

где:

значение Описание
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 автоматически извлекает образ из реестра, если он еще не существует в кластере.

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