GKE en AWS permite extraer imágenes privadas de Artifact Registry o Container Registry sin necesidad de usar un secreto de Kubernetes. Anteriormente, se debían realizar los siguientes pasos:
- Cree una cuenta de servicio de Administración de identidad y acceso de Google (IAM).
- Otorgar a la cuenta de servicio permisos para acceder al registro privado.
- Descargue la clave de la cuenta de servicio y guárdela como un secreto de Kubernetes en su clúster.
- Haga referencia a este secreto en su manifiesto YAML para pods o implementaciones para que puedan acceder a imágenes desde el repositorio de contenedores privado.
- Rote y administre periódicamente las claves asociadas a la cuenta de servicio Google IAM.
GKE en AWS elimina todos estos pasos manuales y maneja automáticamente la autenticación y la autorización necesarias para extraer imágenes privadas.
Antes de empezar
Para realizar los pasos de esta página, primero complete lo siguiente:
- Crear un cluster .
- Crear un grupo de nodos .
Cree una imagen de Docker y envíela a Artifact Registry. Los ejemplos de esta página usan el contenedor
hello-app
. Para crear este contenedor, siga los pasos para crear una imagen de contenedor y enviarla a Artifact Registry , parte de GKE. Google Cloud documentación.Actualice 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.
Busque imágenes en Artifact Registry
Para completar el resto de estos pasos, necesita una imagen de contenedor. Obtenga el nombre de sus imágenes de contenedor siguiendo estos pasos:
Configure la herramienta de línea de comandos de Docker para autenticarse en Artifact Registry con Google Cloud SDK:
gcloud auth configure-docker
La CLI de Google Cloud registra un asistente de credenciales para todos los registros de Docker compatibles con Google.
Confirme que su Registro de artefactos incluye una imagen con el comando
docker images
:docker images
Docker se conecta al Registro de Artefactos y devuelve las imágenes disponibles en su repositorio. Por ejemplo, la siguiente respuesta 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 tiene una imagen de contenedor lista, cree una siguiendo los pasos que se indican en Implementar una aplicación en contenedores .
Crea 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 proporcionar el campo spec.imagePullSecrets
en la especificación del pod. Para configurar el pod, siga estos pasos:
Cree 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
Reemplace lo siguiente:
-
POD_NAME
: el nombre del Pod. -
CONTAINER_NAME
: el nombre del contenedor dentro del Pod. -
LOCATION
: el Google Cloud Región que contiene su registro. Por ejemplo,us-west1
. -
PROJECT_NAME
: el nombre del proyecto de Google que aloja el repositorio de Artifact Registry, que podría ser el mismo que el del proyecto de tu clúster. Si el repositorio pertenece a otro proyecto, consulta "Usar Artifact Registry cuando no pertenece al mismo proyecto que tu clúster" para obtener más información. -
REPOSITORY_NAME
: el nombre de su repositorio. -
IMAGE_NAME
: el nombre de la imagen. -
IMAGE_VERSION
: la versión de la imagen.
-
Aplique la configuración a su clúster con
kubectl
:kubectl apply -f YAML_FILE_NAME
Reemplace
YAML_FILE_NAME
con el nombre de su archivo YAML.
Ejemplo de creación de Pods sin secretos de extracción de imágenes
Este es un ejemplo de creación de un pod de Kubernetes sin necesidad de secretos de extracción de imágenes. El pod extrae la imagen hello-app
del Registro de Artefactos.
Para extraer la imagen
hello-app
, copie 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
Aplique la configuración a su clúster con
kubectl
:kubectl apply -f hello-pod.yaml
Confirme que el Pod se esté ejecutando con
kubectl get
:kubectl get pod/hello-pod
La respuesta incluye un Pod con estado En
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 proporcionar el campo spec.imagePullSecrets
en la especificación de la implementación. Para configurar la implementación, siga estos pasos:
Cree una definición de implementación 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
Reemplace lo siguiente:
-
DEPLOYMENT_NAME
: el nombre de su implementación. -
NUMBER_OF_REPLICAS
: cuántas instancias del Pod definido en la Implementación deben estar ejecutándose en un momento dado. -
CONTAINER_NAME
: el nombre del contenedor dentro del Pod. -
LOCATION
: el Google Cloud Región que contiene su registro. Por ejemplo,us-west1
. -
PROJECT_NAME
: el nombre del proyecto de Google que aloja el repositorio de Artifact Registry, que podría ser diferente al del proyecto de tu clúster. Si el repositorio pertenece a otro proyecto, consulta "Usar Artifact Registry cuando no pertenece al mismo proyecto que tu clúster" para obtener más información. -
REPOSITORY_NAME
: el nombre de su repositorio. -
IMAGE_NAME
: el nombre de la imagen. -
IMAGE_VERSION
: la versión de la imagen.
-
Aplique la configuración a su clúster con
kubectl
.kubectl apply -f name-of-your-yaml-file.yaml
Ejemplo de creación de una implementación sin secretos de extracción de imágenes
A continuación, se muestra un ejemplo de creación de una implementación sin secretos de extracción de imágenes. La implementación extrae una imagen de hello-app
del Registro de Artefactos.
Cree 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"
Reemplace lo siguiente:
-
LOCATION
: el Google Cloud Región que contiene su registro. Por ejemplo,us-west1
. -
PROJECT_NAME
: el nombre del proyecto de Google que aloja el repositorio de Artifact Registry, que podría ser diferente al del proyecto de tu clúster. Si el repositorio pertenece a otro proyecto, consulta "Usar Artifact Registry cuando no pertenece al mismo proyecto que tu clúster" para obtener más información.
-
Aplique la configuración a su clúster con
kubectl
.kubectl apply -f hello-deployment.yaml
Confirme que su implementación se esté ejecutando con
kubectl pods
.kubectl get pods --selector=app=products
La salida muestra tres
Running
Pods.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
Utilice Artifact Registry cuando no esté en el mismo proyecto que su clúster
Para utilizar un repositorio de Artifact Registry que se encuentre en un Proyecto de Google diferente del que contiene su clúster, realice los siguientes pasos:
Otorgue a la cuenta de servicio de las instancias de máquinas virtuales del grupo de nodos de su clúster, conocida 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 su clúster pueda recuperar artefactos del registro en ese proyecto separado.
Reemplace lo siguiente:
-
AR_PROJECT_ID
: el ID del proyecto de Google que aloja el Registro de artefactos. -
NODE_POOL_MACHINE_SERVICE_AGENT
: la cuenta de servicio para el grupo de nodos de su 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 en el repositorio de Artifact Registry.
Utilice el Registro de contenedores privado de Google
Para integrar un Google Container Registry privado con su clúster de GKE en AWS, independientemente de la ubicación de su proyecto de Google, siga estos pasos:
Permita que el Agente de servicio de máquina de grupo de nodos, la cuenta de servicio para las instancias de máquina virtual de grupo de nodos de su clúster, acceda al Registro de contenedores:
gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
Este paso habilita el acceso de la cuenta de servicio del clúster a las imágenes del contenedor privado.
Reemplace lo siguiente:
-
GCR_PROJECT_ID
: el ID del proyecto que aloja el Registro de contenedores. -
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
: seleccionestorage.objectViewer
o un rol personalizado para obtener suficiente acceso al Registro de Contenedores. Tenga cuidado con el acceso generalizado constorage.objectViewer
.
Limpiar
Para eliminar los recursos que creó en esta página, ejecute estos comandos:
kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE
Reemplace lo siguiente:
-
POD_YAML_FILE
: el nombre del archivo YAML en el que definió el Pod. -
DEPLOYMENT_YAML_FILE
: el nombre del archivo YAML en el que definió la implementación.