GKE en AWS ofrece una forma de extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un secreto de Kubernetes. Antes, tenías que seguir estos pasos:
- Crea una cuenta de servicio de Gestión de Identidades y Accesos (IAM) de Google.
- Concede a la cuenta de servicio permisos para acceder al registro privado.
- Descarga la clave de la cuenta de servicio y guárdala como un secreto de Kubernetes en tu clúster.
- Haz referencia a este secreto en tu manifiesto YAML para pods o implementaciones para que puedan acceder a imágenes del repositorio de contenedores privado.
- Rota y gestiona periódicamente las claves asociadas a la cuenta de servicio de Google IAM.
GKE en AWS elimina todos estos pasos manuales y gestiona automáticamente la autenticación y la autorización necesarias para extraer imágenes privadas.
Antes de empezar
Para seguir los pasos de esta página, primero debes hacer lo siguiente:
- Crea un clúster.
- Crea un grupo de nodos.
Crea una imagen Docker y envíala a Artifact Registry. En los ejemplos de esta página se usa el contenedor
hello-app
. Para compilar este contenedor, sigue los pasos para compilar una imagen de contenedor y enviar la imagen de Docker a Artifact Registry, que forman parte de la documentación de GKE en Google Cloud .Actualiza a la versión 1.28 de GKE en AWS para poder extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un secreto de Kubernetes.
Buscar imágenes en Artifact Registry
Para completar el resto de estos pasos, necesitas una imagen de contenedor. Para obtener el nombre de tus imágenes de contenedor, sigue estos pasos:
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
La CLI de Google Cloud registra un asistente de credenciales para todos los registros de Docker compatibles con Google.
Confirma que tu Artifact Registry incluye una imagen con el comando
docker images
:docker images
Docker se conecta a Artifact Registry y devuelve las imágenes disponibles en tu repositorio. Por ejemplo, la siguiente respuesta muestra una imagen de contenedor llamada
hello-app
en el repositorioPROJECT_NAME
deus-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 siguiendo los pasos que se indican en Implementar una aplicación contenerizada.
Crear pods con imágenes privadas sin secretos de extracción de imágenes
Para crear un pod que pueda acceder a una imagen de contenedor privada desde un registro, ya no es necesario que proporciones 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
Haz los cambios siguientes:
POD_NAME
: el nombre del pod.CONTAINER_NAME
: el nombre del contenedor dentro del pod.LOCATION
: la Google Cloud región 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 de tu clúster. Si el repositorio está en otro proyecto, consulta Usar Artifact Registry cuando no está en el mismo proyecto que el clúster para ver los 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 YAML_FILE_NAME
Sustituye
YAML_FILE_NAME
por el nombre de tu archivo YAML.
Ejemplo de creación de pods sin secretos de extracción de imágenes
A continuación, se muestra un ejemplo de cómo crear un pod de Kubernetes sin necesidad de secretos de extracción de imágenes. El pod extrae la imagen hello-app
de Artifact Registry.
Para extraer la imagen
hello-app
, copia el siguiente código 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 al clúster con
kubectl
:kubectl apply -f hello-pod.yaml
Confirma que el pod se está ejecutando 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
Crear implementaciones con imágenes privadas sin secretos de extracción de imágenes
Para crear una implementación que pueda acceder a una imagen de contenedor privada desde un registro, ya no es necesario que proporciones el campo spec.imagePullSecrets
en la especificación de la implementación.
Para configurar tu implementación, 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
Haz los cambios siguientes:
DEPLOYMENT_NAME
: el nombre de tu implementación.NUMBER_OF_REPLICAS
: número de instancias del pod definido en el Deployment que deben ejecutarse en un momento dado.CONTAINER_NAME
: el nombre del contenedor dentro del pod.LOCATION
: la región que contiene tu registro. Google Cloud 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 de tu clúster. Si el repositorio está en otro proyecto, consulta Usar Artifact Registry cuando no está en el mismo proyecto que el clúster para ver los 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 name-of-your-yaml-file.yaml
Ejemplo de creación de un Deployment sin secretos de extracción de imágenes
A continuación, se muestra un ejemplo de cómo crear un Deployment sin secretos de extracción de imágenes. La implementación 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"
Haz los cambios siguientes:
LOCATION
: la Google Cloud región 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 otro proyecto, consulte Usar Artifact Registry cuando no esté en el mismo proyecto que el clúster para ver los pasos adicionales.
Aplica la configuración a tu clúster con
kubectl
.kubectl apply -f hello-deployment.yaml
Confirma que tu implementación se está ejecutando con
kubectl pods
.kubectl get pods --selector=app=products
El resultado muestra tres pods
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
Usar Artifact Registry cuando no esté en el mismo proyecto que el clúster
Para usar un repositorio de Artifact Registry que esté en un proyecto de Google distinto del que contiene tu clúster, sigue estos pasos:
Concede a la cuenta de servicio de las instancias de máquina virtual del grupo de nodos de tu clúster, conocida como agente de servicio de la 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
Con este paso, te aseguras de que tu clúster pueda recuperar artefactos del registro en ese proyecto independiente.
Haz los cambios siguientes:
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 de tu 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 conceda permisos suficientes para acceder a las imágenes del repositorio de Artifact Registry.
Usar Google Container Registry privado
Para integrar un registro de contenedores de Google privado con tu clúster de GKE en AWS, independientemente de la ubicación de su 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 habilita el acceso de la cuenta de servicio del clúster a las imágenes de contenedor privadas.
Haz los cambios siguientes:
GCR_PROJECT_ID
: ID del proyecto que aloja el registro de contenedores.NODE_POOL_MACHINE_SERVICE_AGENT
: la cuenta de servicio del pool de nodos, con el formatoservice-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
.ROLE
: eligestorage.objectViewer
o un rol personalizado para tener suficiente acceso a Container Registry. Ten cuidado con el acceso generalizado constorage.objectViewer
.
Limpieza
Para eliminar los recursos que has creado en esta página, ejecuta estos comandos:
kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE
Haz los cambios siguientes:
POD_YAML_FILE
: el nombre del archivo YAML en el que has definido el pod.DEPLOYMENT_YAML_FILE
: el nombre del archivo YAML en el que has definido el despliegue.
Siguientes pasos
- Consulta la información general de Artifact Registry.