Extracción de imágenes de una instancia de Azure Container Registry a un clúster de Kubernetes mediante un secreto de extracción

Puede usar una instancia de Azure Container Registry como origen de las imágenes de contenedor con cualquier clúster de Kubernetes, incluidos los clústeres de Kubernetes "locales", como minikube y kind. En este artículo se muestra cómo crear un secreto de extracción de Kubernetes mediante credenciales para una instancia de Azure Container Registry. A continuación, use el secreto para extraer imágenes de una instancia de Azure Container Registry en una implementación de pods.

En este ejemplo se crea un secreto de extracción mediante credenciales de entidad de servicio de Microsoft Entra. También puede configurar un secreto de extracción con otras credenciales de Azure Container Registry, como un token de acceso con ámbito de repositorio.

Nota

Aunque los secretos de extracción se usan habitualmente, conllevan una sobrecarga de administración adicional. Si usa Azure Kubernetes Service, se recomiendan otras opciones, como usar la identidad administrada o la entidad de servicio del clúster para extraer la imagen de manera segura sin un valor imagePullSecrets adicional en cada pod.

Prerrequisitos

En este artículo se supone que ya ha creado una instancia privada de Azure Container Registry. Además, debe tener un clúster de Kubernetes en ejecución y accesible a través de la herramienta de línea de comandos kubectl.

Creación de una entidad de servicio

Para crear una entidad de servicio con acceso al registro de contenedor, ejecute el siguiente script en Azure Cloud Shell o en una instalación local de la CLI de Azure. El script tiene el formato adecuado para el shell de Bash.

Antes de ejecutar el script, actualice la variable ACR_NAME con el nombre del registro de contenedor. El valor SERVICE_PRINCIPAL_NAME debe ser único dentro del inquilino de Microsoft Entra. Si recibe un error "'http://acr-service-principal' already exists.", especifique un nombre diferente para la entidad de servicio.

Opcionalmente, puede modificar el valor --role en el comando az ad sp create-for-rbac si desea conceder permisos diferentes. Para obtener una lista completa de roles, consulte ACR roles and permissions (Roles y permisos de ACR).

Tras ejecutar el script, tome nota del identificador y la contraseña de la entidad de servicio. Cuando disponga de las credenciales, podrá configurar las aplicaciones y los servicios para autenticarse en su registro de contenedor como la entidad de servicio.

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

Uso de una entidad de servicio existente

Para conceder al registro acceso a una entidad de servicio existente, debe asignar un nuevo rol a la entidad de servicio. Al igual que con la creación de una nueva entidad de servicio, puede conceder acceso de extracción, inserción y extracción, así como de propietario, entre otros.

El script siguiente usa el comando az role assignment create para conceder permisos de extracción a la entidad de servicio especificada en la variable SERVICE_PRINCIPAL_ID. Ajuste el valor --role si quiere conceder un nivel de acceso diferente.

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

Si no guarda ni recuerda la contraseña de la entidad de servicio, puede restablecerla con el comando az ad sp credential reset:

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

Este comando devuelve una nueva contraseña válida para la entidad de servicio.

Creación de un secreto de extracción de imágenes

Kubernetes usa un secreto de extracción de imágenes para almacenar la información necesaria para autenticarse en el registro. Para crear el secreto de extracción para una instancia de Azure Container Registry, debe proporcionar el identificador de la entidad de servicio, la contraseña y la dirección URL del registro.

Cree un secreto de extracción de imágenes con el siguiente comando 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>

donde:

Value Descripción
secret-name Nombre del secreto de extracción de imágenes, por ejemplo, acr-secret
namespace Espacio de nombres de Kubernetes donde colocar el secreto
Solo es necesario si desea colocar el secreto en un espacio de nombres distinto del espacio de nombres predeterminado
container-registry-name Nombre de la instancia de Azure Container Registry, por ejemplo, miregistro

--docker-server es el nombre completo del servidor de inicio de sesión del registro
service-principal-ID Identificador de la entidad de servicio que usará Kubernetes para tener acceso al registro
service-principal-password Contraseña de la entidad de servicio

Uso del secreto de extracción de imágenes

Una vez que haya creado el secreto de extracción de imágenes, puede usarlo para crear implementaciones y pods de Kubernetes. Proporcione el nombre del secreto en imagePullSecrets en el archivo de implementación. Por ejemplo:

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

En el ejemplo anterior, my-awesome-app:v1 es el nombre de la imagen que se va a extraer de Azure Container Registry, y acr-secret es el nombre del secreto de extracción que creó para acceder al registro. Al implementar el pod, Kubernetes extrae automáticamente la imagen del registro, si aún no está presente en el clúster.

Pasos siguientes