GKE en AWS proporciona una forma de extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un Secret de Kubernetes. Antes, tenías que realizar los siguientes pasos:
- Crear una cuenta de servicio de Identity and Access Management (IAM) de Google.
- Otorgar permisos a la cuenta de servicio para acceder al registro privado.
- Descargar la clave de la cuenta de servicio y guardarla como un Secret de Kubernetes en tu clúster.
- Hacer referencia a este Secret en tu manifiesto YAML para los Pods o Deployments con el objetivo de que puedan acceder a las imágenes del repositorio de contenedores privado.
- Rotar y administrar con regularidad las claves asociadas con la cuenta de servicio de Google IAM.
GKE en AWS elimina todos estos pasos manuales y controla automáticamente la autenticación y la autorización necesarias para extraer imágenes privadas.
Antes de comenzar
Para realizar los pasos de esta página, primero completa lo siguiente:
- Crea un clúster.
- Crea un grupo de nodos.
Compila una imagen de Docker y envíala a Artifact Registry. En los ejemplos de esta página, se usa el contenedor
hello-app
. A fin de compilar este contenedor, sigue los pasos para compilar una imagen de contenedor y enviar la imagen de Docker a Artifact Registry, que aparecen en la sección de GKE de la documentación de Google Cloud.Actualiza a la versión 1.28 de GKE en AWS para que puedas extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un Secret de Kubernetes.
Verifica las imágenes en Artifact Registry
Para completar el resto de estos pasos, necesitas una imagen de contenedor. Sigue estos pasos para obtener el nombre de las imágenes de contenedor:
Configura la herramienta de línea de comandos de Docker para autenticarte en Artifact Registry con el SDK de Google Cloud:
gcloud auth configure-docker
Google Cloud CLI registra un auxiliar de credenciales para todos los registros de Docker compatibles con Google.
Confirma que Artifact Registry incluye una imagen con el comando
docker images
:docker images
Docker se conecta a Artifact Registry y muestra las imágenes disponibles en el repositorio. Por ejemplo, en la siguiente respuesta, se muestra una imagen de contenedor llamada
hello-app
en el repositorioPROJECT_NAME
enus-west1-docker.pkg.dev
.REPOSITORY TAG IMAGE ID CREATED SIZE us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app v1 f7cfe0d58569 21 minutes ago 11.5MB
Si no tienes una imagen de contenedor lista, crea una con los pasos que se describen en Implementa una aplicación alojada en contenedores.
Crea Pods con imágenes privadas sin Secretos de extracción de imagen
Para crear un Pod que pueda acceder a una imagen de contenedor privado desde un registro, ya no necesitas proporcionar el campo spec.imagePullSecrets
en la especificación del Pod. Para configurar tu Pod, sigue estos pasos:
Crea una definición de Pod sin el campo
spec.imagePullSecrets
:apiVersion: v1 kind: Pod metadata: name: POD_NAME spec: containers: - name: CONTAINER_NAME image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
Reemplaza lo siguiente:
POD_NAME
: el nombre del Pod.CONTAINER_NAME
: el nombre del contenedor dentro del Pod.LOCATION
: la región de Google Cloud que contiene tu registro. Por ejemplo,us-west1
.PROJECT_NAME
: el nombre del proyecto de Google que aloja tu repositorio de Artifact Registry, que puede ser el mismo que el proyecto de tu clúster. Si el repositorio está en un proyecto diferente, consulta Usa Artifact Registry cuando no está en el mismo proyecto que tu clúster para obtener pasos adicionales.REPOSITORY_NAME
: el nombre de tu repositorio.IMAGE_NAME
: el nombre de la imagen.IMAGE_VERSION
: la versión de la imagen.
Aplica la configuración a tu clúster con
kubectl
:kubectl apply -f YAML_FILE_NAME
Reemplaza
YAML_FILE_NAME
por el nombre de tu archivo YAML.
Ejemplo de creación de Pods sin Secrets de extracción de imagen
A continuación, se muestra un ejemplo de cómo crear un Pod de Kubernetes sin la necesidad de usar Secrets de extracción de imagen. El Pod extrae la imagen hello-app
de Artifact Registry.
Para extraer la imagen
hello-app
, copia el siguiente YAML en un archivo llamadohello-pod.yaml
:apiVersion: v1 kind: Pod metadata: name: hello-pod spec: containers: - name: hello-container image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1
Aplica la configuración a tu clúster con
kubectl
:kubectl apply -f hello-pod.yaml
Confirma que el Pod esté en ejecución con
kubectl get
:kubectl get pod/hello-pod
La respuesta incluye un Pod con el estado
Running
NAME READY STATUS RESTARTS AGE hello-pod 1/1 Running 0 15s
Crea Deployments con imágenes privadas sin Secretos de extracción de imagen
Para crear un Deployment que pueda acceder a una imagen de contenedor privado desde un registro, ya no necesitas proporcionar el campo spec.imagePullSecrets
en la especificación de Deployment.
Para configurar el Deployment, sigue estos pasos:
Crea una definición de Deployment sin el campo
spec.imagePullSecrets
:apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS template: spec: containers: - name: CONTAINER_NAME image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
Reemplaza lo siguiente:
DEPLOYMENT_NAME
: el nombre de tu Deployment.NUMBER_OF_REPLICAS
: la cantidad de instancias del Pod definidas en el Deployment que se deben ejecutar en un momento determinado.CONTAINER_NAME
: el nombre del contenedor dentro del Pod.LOCATION
: la región de Google Cloud que contiene tu registro. Por ejemplo,us-west1
.PROJECT_NAME
: el nombre del proyecto de Google que aloja tu repositorio de Artifact Registry, que puede no ser el mismo que el proyecto de tu clúster. Si el repositorio está en un proyecto diferente, consulta Usa Artifact Registry cuando no está en el mismo proyecto que tu clúster para obtener pasos adicionales.REPOSITORY_NAME
: el nombre de tu repositorio.IMAGE_NAME
: el nombre de la imagen.IMAGE_VERSION
: la versión de la imagen.
Aplica la configuración al clúster con
kubectl
:kubectl apply -f name-of-your-yaml-file.yaml
Ejemplo de creación de un Deployment sin Secrets de extracción de imagen
A continuación, se muestra un ejemplo de creación de un Deployment sin Secrets de extracción de imagen. El Deployment extrae una imagen hello-app
de Artifact Registry.
Crea un archivo llamado
hello-deployment.yaml
con el siguiente contenido:apiVersion: apps/v1 kind: Deployment metadata: name: hello-app-deployment spec: selector: matchLabels: app: products department: sales replicas: 3 template: metadata: labels: app: products department: sales spec: containers: - name: hello image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1 env: - name: "PORT" value: "50001"
Reemplaza lo siguiente:
LOCATION
: la región de Google Cloud que contiene tu registro. Por ejemplo,us-west1
.PROJECT_NAME
: el nombre del proyecto de Google que aloja tu repositorio de Artifact Registry, que puede no ser el mismo que el proyecto de tu clúster. Si el repositorio está en un proyecto diferente, consulta Usa Artifact Registry cuando no esté en el mismo proyecto que tu clúster para obtener pasos adicionales.
Aplica la configuración al clúster con
kubectl
:kubectl apply -f hello-deployment.yaml
Confirma que el Deployment está en ejecución con
kubectl pods
.kubectl get pods --selector=app=products
El resultado muestra tres Pods de
Running
.NAME READY STATUS RESTARTS AGE hello-app-deployment-67d9c6d98c-b69f2 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-d6k5c 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-p2md5 1/1 Running 0 14m
Usa Artifact Registry cuando no esté en el mismo proyecto que tu clúster
Para usar un repositorio de Artifact Registry que está en un proyecto de Google diferente del que contiene el clúster, sigue estos pasos:
Proporciona la cuenta de servicio para las instancias de máquina virtual del grupo de nodos del clúster, conocidas como Agente de servicio de máquina del grupo de nodos, los permisos necesarios para acceder a este registro.
gcloud projects add-iam-policy-binding AR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
Este paso garantiza que tu clúster pueda recuperar artefactos del registro en ese proyecto separado.
Reemplaza lo siguiente:
AR_PROJECT_ID
: el ID del proyecto de Google que aloja Artifact Registry.NODE_POOL_MACHINE_SERVICE_AGENT
: la cuenta de servicio del grupo de nodos del clúster, que tiene el siguiente formato:service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
ROLE
: el rolroles/artifactregistry.reader
o un rol personalizado que otorga permisos suficientes para acceder a las imágenes del repositorio de Artifact Registry.
Usa Google Container Registry privado
Para integrar un Google Container Registry privado a tu clúster de GKE en AWS, sin importar la ubicación del proyecto de Google, sigue estos pasos:
Permite que el agente de servicio de la máquina del grupo de nodos, la cuenta de servicio de las instancias de máquina virtual del grupo de nodos de tu clúster, acceda a Container Registry:
gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
En este paso, se permite que la cuenta de servicio del clúster acceda a las imágenes de contenedor privado.
Reemplaza lo siguiente:
GCR_PROJECT_ID
: el ID del proyecto en el que se aloja Container Registry.NODE_POOL_MACHINE_SERVICE_AGENT
: la cuenta de servicio del grupo de nodos, en el formatoservice-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
.ROLE
: eligestorage.objectViewer
o un rol personalizado para obtener acceso suficiente a Container Registry. Ten cuidado cuando el acceso es amplio constorage.objectViewer
.
Limpia
Para quitar los recursos que creaste en esta página, ejecuta estos comandos:
kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE
Reemplaza lo siguiente:
POD_YAML_FILE
: el nombre del archivo YAML en el que definiste el Pod.DEPLOYMENT_YAML_FILE
: el nombre del archivo YAML en el que definiste el Deployment.