Implementación desde un registro de contenedor privado en Kubernetes local mediante Azure Container Registry y AKS Arc

Se aplica a: Azure Stack HCI, versión 23H2

En este artículo se describe cómo implementar imágenes de contenedor desde un registro de contenedor privado mediante Azure Container Registry, que puede ejecutar en su propio centro de datos en implementaciones de AKS Arc. La implementación se realiza en el clúster de Kubernetes local hospedado por AKS. Azure Container Registry permite compilar, almacenar y administrar imágenes y artefactos de contenedor en un registro privado para todo tipo de implementaciones de contenedor.

En el artículo se describe cómo crear un registro de contenedor privado en Azure e insertar la imagen de contenedor en el registro de contenedor privado. Después, puede implementar desde el registro privado en el clúster de Kubernetes local hospedado en AKS Arc.

Para obtener más información sobre Azure Container Registry, consulte la documentación de Azure Container Registry.

Requisitos previos

Compruebe que tiene los requisitos siguientes:

Creación de un registro de contenedor privado en Azure

Para crear un registro de contenedor, comience con un grupo de recursos. Un grupo de recursos de Azure es un contenedor lógico en el que se implementan y se administran los recursos de Azure. Cree un grupo de recursos con el comando az group create. En el ejemplo siguiente se crea un grupo de recursos en la región eastus :

az group create --name <RESOURCE_GROUP_NAME> --location eastus

Cree una instancia de Container Registry con el comando az acr create y proporcione su propio nombre del registro. El nombre del registro debe ser único dentro de Azure y contener entre 5 y 50 caracteres alfanuméricos. En el resto de este artículo, <acrName> se usa como marcador de posición para el nombre del registro de contenedor, pero puede proporcionar su propio nombre de registro único. La SKU básica es un punto de entrada optimizado para costos con fines de desarrollo que proporciona un equilibrio de almacenamiento y rendimiento:

az acr create --resource-group <RESOURCE_GROUP_NAME> --name <REGISTRY_NAME> --sku Basic

Después de crear el registro de contenedor, use el siguiente comando para crear una entidad de servicio, por lo que puede acceder al registro de contenedor desde Kubernetes:

az ad sp create-for-rbac /
--scopes /subscriptions/<SUBSCRIPTION_ID>/resourcegroups/<RG_NAME>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME> /
--role Contributor /
--name <SERVICE_PRINCIPAL_NAME>

Azure Container Registry admite tres roles de acceso. El rol Colaborador se usa con más frecuencia por los desarrolladores de aplicaciones. Sin embargo, en escenarios reales, es posible que tenga que crear varias entidades de servicio en función del tipo de acceso necesario:

  • Colaborador: este rol ofrece acceso de inserción y extracción para el repositorio.
  • Lector: este rol solo permite el acceso de extracción para el repositorio.
  • Propietario: este rol le permite asignar roles a otros usuarios, además del acceso de inserción y extracción para el repositorio.

El comando anterior debe generar una salida similar al texto siguiente:

{
"appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"displayName": "akshci-service-principal",
"name": "http://akshci-service-principal",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

Una vez creada correctamente la entidad de servicio, copie el appId y la contraseña en una ubicación segura para usarlos más adelante en la implementación.

Para más información sobre cómo trabajar con entidades de servicio y Azure Container Registry, consulte Autenticación de Azure Container Registry con entidades de servicio.

Inicio de sesión en el registro de contenedor privado

Para usar la instancia de Container Registry, primero debe iniciar sesión. Puede usar la CLI de Azure o la CLI de Docker para iniciar sesión.

Opción 1: Inicio de sesión desde la CLI de Azure

Use el comando az acr sign in y proporcione el nombre único asignado al registro de contenedor en el paso anterior:

az acr login --name <REGISTRY_NAME>

Opción 2: Inicio de sesión desde la CLI de Docker

Para usar la CLI de Docker para acceder al registro de contenedor, escriba el siguiente comando en un terminal de Bash o PowerShell:

docker login <REGISTRY_NAME>.azurecr.io -u <appId> -p <password>

En cualquier opción, el comando debe devolver un mensaje de inicio de sesión correcto cuando se complete.

Inserción de una imagen en el registro de contenedor

Una vez que haya iniciado sesión correctamente, puede empezar a insertar la imagen en Container Registry. En primer lugar, ejecute el comando docker images para ver la lista de imágenes en el equipo local:

REPOSITORY TAG IMAGE ID CREATED SIZE

mcr.microsoft.com/azure-functions/dotnet 3.0 9f8ad1bdee67 5 months ago
540MB

poemfinder-app latest 2d9bef425603 6 months ago 208MB

Para empezar, etiquete la imagen mediante el comando docker tag y, a continuación, use Docker push para insertarla en el registro de contenedor:

docker tag poemfinder-app <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

Compruebe que la imagen se ha etiquetado correctamente mediante la ejecución del comando docker images de nuevo. Después de confirmarlo, ejecute docker push para insertar en el registro de contenedor, como se indica a continuación:

docker push <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0

Para confirmar que la imagen se insertó correctamente en el registro de contenedor, ejecute el siguiente comando:

az acr repository list --name <REGISTRY_NAME>.azurecr.io --output table

Implementación de una imagen desde el registro de contenedor en AKS

Para implementar la imagen de contenedor desde el registro de contenedor en el clúster de Kubernetes, cree secretos de Kubernetes para almacenar las credenciales del registro. 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 de un registro de contenedor, proporcione el identificador de la entidad de servicio, la contraseña y la dirección URL del Registro:

kubectl create secret docker-registry <secret-name> \
--namespace <namespace> \
--docker-server=<REGISTRY_NAME>.azurecr.io \
--docker-username=<appId> \
--docker-password=<password>

En la tabla siguiente se describen los parámetros de entrada:

Valor Descripción
secret-name Nombre de la imagen extrae el secreto; por ejemplo, acr-secret.
namespace Espacio de nombres de Kubernetes en el que se va a colocar el secreto. Solo es necesario si desea colocar el secreto en un espacio de nombres distinto del espacio de nombres predeterminado.
<REGISTRY_NAME> Nombre del registro de contenedor. Por ejemplo, myregistry. --docker-server es el nombre completo del servidor de inicio de sesión del Registro.
appId Identificador de la entidad de servicio que Kubernetes usa para acceder al registro.
password Contraseña de la entidad de servicio.

Una vez creado el secreto de extracción de imágenes, puede usarlo para crear pods e implementaciones de Kubernetes. Proporcione el nombre del secreto en imagePullSecrets en el archivo de implementación, como se muestra en el ejemplo siguiente:

apiVersion: v1
kind: Pod
metadata:
name: poemfinder-app
namespace: mydemoapps
spec:
containers:
 - name: poemfinder-app
   image: <REGISTRY_NAME>.azurecr.io/poemfinder-app:v1.0
   imagePullPolicy: IfNotPresent
 - imagePullSecrets:
   - name: acr-secret

En este ejemplo, poemfinder-app:v1.0 es el nombre de la imagen que se va a extraer del registro de contenedor 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 la imagen aún no está presente en el clúster.

Puede guardar la configuración del pod anterior en un archivo como pod-example.yaml y, a continuación, implementarlo en Kubernetes, como se indica a continuación:

kubectl create -f pod-example.yaml

Para confirmar que el pod se creó correctamente mediante la imagen de contenedor del registro de contenedor, ejecute kubectl describe pod <POD_NAME>, que debe mostrar la imagen de contenedor utilizada para crear el pod.

Pasos siguientes