Extracción de imágenes de una instancia de Azure Container Registry a un clúster de KubernetesPull images from an Azure container registry to a Kubernetes cluster

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.You can use an Azure container registry as a source of container images with any Kubernetes cluster, including "local" Kubernetes clusters such as minikube and kind. En este artículo se muestra cómo crear un secreto de extracción de Kubernetes basado en una entidad de servicio de Azure Active Directory.This article shows how to create a Kubernetes pull secret based on an Azure Active Directory service principal. A continuación, use el secreto para extraer imágenes de una instancia de Azure Container Registry en una implementación de Kubernetes.Then, use the secret to pull images from an Azure container registry in a Kubernetes deployment.

Sugerencia

Si usa la instancia administrada de Azure Kubernetes Service, también puede integrar el clúster en una instancia de Azure Container Registry de destino para las extracciones de imágenes.If you're using the managed Azure Kubernetes Service, you can also integrate your cluster with a target Azure container registry for image pulls.

En este artículo se supone que ya ha creado una instancia privada de Azure Container Registry.This article assumes you already created a private 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.You also need to have a Kubernetes cluster running and accessible via the kubectl command-line tool.

Creación de una entidad de servicioCreate a service principal

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.To create a service principal with access to your container registry, run the following script in the Azure Cloud Shell or a local installation of the Azure CLI. El script tiene el formato adecuado para el shell de Bash.The script is formatted for the Bash shell.

Antes de ejecutar el script, actualice la variable ACR_NAME con el nombre del registro de contenedor.Before running the script, update the ACR_NAME variable with the name of your container registry. El valor SERVICE_PRINCIPAL_NAME debe ser único dentro del inquilino de Azure Active Directory.The SERVICE_PRINCIPAL_NAME value must be unique within your Azure Active Directory tenant. Si recibe un error "'http://acr-service-principal' already exists.", especifique un nombre diferente para la entidad de servicio.If you receive an "'http://acr-service-principal' already exists." error, specify a different name for the service principal.

Opcionalmente, puede modificar el valor --role en el comando az ad sp create-for-rbac si desea conceder permisos diferentes.You can optionally modify the --role value in the az ad sp create-for-rbac command if you want to grant different permissions. Para obtener una lista completa de roles, consulte ACR roles and permissions (Roles y permisos de ACR).For a complete list of roles, see ACR roles and permissions.

Tras ejecutar el script, tome nota del identificador y la contraseña de la entidad de servicio.After you run the script, take note of the service principal's ID and password. Cuando disponga de las credenciales, podrá configurar las aplicaciones y los servicios para autenticarse en su registro de contenedor como la entidad de servicio.Once you have its credentials, you can configure your applications and services to authenticate to your container registry as the service principal.

#!/bin/bash

# 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=<container-registry-name>
SERVICE_PRINCIPAL_NAME=acr-service-principal

# Obtain the full registry ID for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# 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
SP_PASSWD=$(az ad sp create-for-rbac --name http://$SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query password --output tsv)
SP_APP_ID=$(az ad sp show --id http://$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: $SP_APP_ID"
echo "Service principal password: $SP_PASSWD"

Uso de una entidad de servicio existenteUse an existing service principal

Para conceder al registro acceso a una entidad de servicio existente, debe asignar un nuevo rol a la entidad de servicio.To grant registry access to an existing service principal, you must assign a new role to the service principal. 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.As with creating a new service principal, you can grant pull, push and pull, and owner access, among others.

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.The following script uses the az role assignment create command to grant pull permissions to a service principal you specify in the SERVICE_PRINCIPAL_ID variable. Ajuste el valor --role si quiere conceder un nivel de acceso diferente.Adjust the --role value if you'd like to grant a different level of access.

#!/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=mycontainerregistry
SERVICE_PRINCIPAL_ID=<service-principal-ID>

# 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:If you don't save or remember the service principal password, you can reset it with the az ad sp credential reset command:

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.This command returns a new, valid password for your service principal.

Creación de un secreto de extracción de imágenesCreate an image pull secret

Kubernetes usa un secreto de extracción de imágenes para almacenar la información necesaria para autenticarse en el registro.Kubernetes uses an image pull secret to store information needed to authenticate to your registry. 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.To create the pull secret for an Azure container registry, you provide the service principal ID, password, and the registry URL.

Cree un secreto de extracción de imágenes con el siguiente comando kubectl:Create an image pull secret with the following kubectl command:

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:where:

ValueValue DescripciónDescription
secret-name Nombre del secreto de extracción de imágenes, por ejemplo, acr-secretName of the image pull secret, for example, acr-secret
namespace Espacio de nombres de Kubernetes donde colocar el secretoKubernetes namespace to put the secret into
Solo es necesario si desea colocar el secreto en un espacio de nombres distinto del espacio de nombres predeterminadoOnly needed if you want to place the secret in a namespace other than the default namespace
container-registry-name Nombre de la instancia de Azure Container Registry, por ejemplo, miregistroName of your Azure container registry, for example, myregistry

--docker-server es el nombre completo del servidor de inicio de sesión del registroThe --docker-server is the fully qualified name of the registry login server
service-principal-ID Identificador de la entidad de servicio que usará Kubernetes para tener acceso al registroID of the service principal that will be used by Kubernetes to access your registry
service-principal-password Contraseña de la entidad de servicioService principal password

Uso del secreto de extracción de imágenesUse the image pull secret

Una vez que haya creado el secreto de extracción de imágenes, puede usarlo para crear implementaciones y pods de Kubernetes.Once you've created the image pull secret, you can use it to create Kubernetes pods and deployments. Proporcione el nombre del secreto en imagePullSecrets en el archivo de implementación.Provide the name of the secret under imagePullSecrets in the deployment file. Por ejemplo:For example:

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 tener acceso al registro.In the preceding example, my-awesome-app:v1 is the name of the image to pull from the Azure container registry, and acr-secret is the name of the pull secret you created to access the registry. Al implementar el pod, Kubernetes extrae automáticamente la imagen del registro, si aún no está presente en el clúster.When you deploy the pod, Kubernetes automatically pulls the image from your registry, if it is not already present on the cluster.

Pasos siguientesNext steps