Autenticar Cloud Platform con cuentas de servicio

En este instructivo, se muestra cómo crear una cuenta de servicio de Google Cloud, asignar funciones para autenticarte en los servicios de Cloud Platform y usar las credenciales de la cuenta de servicio en aplicaciones que se ejecutan en GKE.

En este ejemplo, se usa Cloud Pub/Sub, aunque las instrucciones se pueden aplicar a cualquier servicio de Cloud Platform. La aplicación de ejemplo de este instructivo se autentica en Cloud Pub/Sub con una cuenta de servicio y se suscribe a los mensajes publicados en un tema de Pub/Sub desde una aplicación basada en Python.

Objetivos

En este instructivo se analizan los siguientes pasos:

  • Cómo se crea una cuenta de servicio.
  • Cómo se asignan las funciones necesarias para que la cuenta de servicio funcione con Cloud Pub/Sub.
  • Cómo se guarda la clave de la cuenta como un secreto de Kubernetes,
  • Cómo se usa la cuenta de servicio para implementar y configurar una aplicación.

La aplicación de muestra que se usa en este instructivo se suscribe a un tema de Pub/Sub y también imprime los mensajes publicados en los resultados estándar. Debes configurar la aplicación con los permisos correctos. Usa gcloud para inspeccionar el flujo de los resultados del contenedor a fin de observar que los mensajes se reciban correctamente y publicar mensajes.

¿Por qué es necesario usar cuentas de servicio?

Cada nodo en un clúster de contenedor es una instancia de Compute Engine. Por lo tanto, las aplicaciones que se ejecutan en un clúster de contenedor heredan según la configuración predeterminada los alcances de las instancias de Compute Engine en las que se implementan.

Google Cloud Platform crea automáticamente una cuenta de servicio denominada "Cuenta de servicio predeterminada de Compute Engine" y GKE la asocia con los nodos que crea. Según la manera en la que configures el proyecto, la cuenta de servicio predeterminada puede o no tener permisos para usar otras API de Cloud Platform. GKE también asigna algunos alcances de acceso limitado a instancias de procesamiento. No se recomienda la actualización de los permisos de la cuenta de servicio predeterminada o la asignación de más alcances de acceso a las instancias de procesamiento para autenticarte en otros servicios de Cloud Platform desde los pods que se ejecutan en GKE.

La forma recomendada de autenticarte en los servicios de Google Cloud Platform desde aplicaciones que se ejecutan en GKE es crear tus propias cuentas de servicio. Lo ideal sería que crearas una cuenta de servicio nueva para cada aplicación que realice solicitudes a las API de Cloud Platform.

Estos son los beneficios de tener cuentas de servicio independientes para aplicaciones diferentes:

  • Mejor visibilidad y auditoría de las solicitudes a la API que realiza la aplicación.

  • La capacidad de revocar claves de aplicaciones particulares en lugar de compartir una cuenta de servicio y revocar el acceso a la API de todas las aplicaciones a la vez.

  • Exposición reducida en el caso de un incidente de seguridad posible en el que las credenciales de la cuenta de servicio se vuelvan vulnerables.

Antes de comenzar

Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:
  1. Consulta la página de Kubernetes Engine en Google Cloud Platform Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

Instala las siguientes herramientas de línea de comandos de este instructivo:

  • gcloud se utiliza para crear y borrar clústeres de Kubernetes Engine. gcloud se incluye en el SDK de Google Cloud.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clústeres que utiliza Kubernetes Engine. Puedes instalar kubectl con gcloud:
    gcloud components install kubectl

Establece valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo escribiendo tu ID del proyecto y las opciones de la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los siguientes valores:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

Habilita la API de Pub/Sub

A fin de seguir este instructivo, debes habilitar la API de Cloud Pub/Sub en el proyecto, ya que la aplicación de muestra la usa para recibir mensajes del tema de Pub/Sub:

Habilita las API

Crea un clúster de contenedores

Crea un clúster de contenedores con el nombre pubsub-test para implementar la aplicación de suscripción a Pub/Sub:

gcloud container clusters create pubsub-test

Paso 1: Crea un tema de Pub/Sub

En la aplicación de suscripción a Pub/Sub que implementarás, se usa una suscripción denominada echo-read en un tema de Pub/Sub con el nombre echo. Crea estos recursos antes de implementar la aplicación:

gcloud pubsub topics create echo
gcloud pubsub subscriptions create echo-read --topic=echo

Paso 2: Implementa la aplicación de suscripción a Pub/Sub

El siguiente paso es implementar el contenedor de la aplicación para recuperar los mensajes publicados en el tema de Pub/Sub. Esta aplicación se escribe en Python mediante las bibliotecas cliente de Google Cloud Pub/Sub y puedes buscar el código fuente en GitHub.

En el siguiente archivo de manifiesto, se describe una implementación que ejecuta una instancia única de la imagen de Docker de esta aplicación:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1

Para implementar este manifiesto, descárgalo en tu máquina como pubsub.yaml y ejecuta lo siguiente:

kubectl apply -f pubsub.yaml

Una vez implementada la aplicación, ejecuta lo siguiente para consultar los pods:

kubectl get pods -l app=pubsub
Salida:
NAME                      READY     STATUS             RESTARTS   AGE
pubsub-2009462906-1l6bh   0/1       CrashLoopBackOff   1          30s

Puedes ver que el contenedor tiene fallas para iniciarse y entró en un estado CrashLoopBackOff. Ejecuta lo siguiente para inspeccionar los registros del pod:

kubectl logs -l app=pubsub
Salida:
...
google.gax.errors.RetryError: GaxError(Exception occurred in retry method
that was not classified as transient, caused by <_Rendezvous of RPC that
terminated with (StatusCode.PERMISSION_DENIED, Request had insufficient
authentication scopes.) l10n-attrs-original-order="of,RPC,that,terminated,with,Request,had,insufficient,authentication">)

El seguimiento de la pila y el mensaje de error indican que la aplicación no tiene permisos para consultar el servicio de Cloud Pub/Sub.

Paso 3: Crea credenciales de cuenta de servicio

Para proporcionar a las aplicaciones que se ejecutan en GKE acceso a los servicios de Google Cloud Platform, debes usar cuentas de servicio.

Para crear una cuenta de servicio, ve a Cuentas de servicio en GCP Console y haz clic en Crear cuenta de servicio:

  1. Especifica un Nombre de cuenta de servicio (por ejemplo, pubsub-app).
  2. En el menú desplegable de Función, selecciona "Pub/Sub → Suscriptor".
  3. Haz clic en Crear clave y elige el tipo de clave JSON.
  4. Haz clic en Crear.

Una vez creada la cuenta de servicio, un archivo de claves JSON que contiene las credenciales de la cuenta de servicio se descarga en tu computadora. Usarás este archivo de claves a fin de configurar la aplicación para autenticarte en la API de Cloud Pub/Sub.

Paso 4: Importa credenciales como secreto

Kubernetes ofrece el tipo de recurso secreto para almacenar credenciales dentro del clúster del contenedor y usarlas en las aplicaciones implementadas directamente en GKE.

Para guardar el archivo de claves JSON como secreto con el nombre pubsub-key, ejecuta el siguiente comando con la ruta del archivo de las credenciales de la cuenta de servicio descargado:

kubectl create secret generic pubsub-key --from-file=key.json=PATH-TO-KEY-FILE.json

Este comando crea un secreto con el nombre pubsub-key, que tiene un archivo key.json con los contenidos de la clave privada que descargaste desde GCP Console. Una vez creado el secreto, debes quitar el archivo de claves de tu computadora.

Paso 5: Configura la aplicación con el secreto

A fin de usar el secreto pubsub-key en la aplicación, es necesario modificar la especificación de implementación para lo siguiente:

  1. Definir un volumen con el secreto
  2. Activar el volumen del secreto en el contenedor de la aplicación
  3. Configurar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS para señalar el archivo de claves en la activación del volumen del secreto

El archivo de manifiesto actualizado se verá como el siguiente:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      volumes:
      - name: google-cloud-key
        secret:
          secretName: pubsub-key
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/key.json

En este archivo de manifiesto define lo siguiente a fin de que las credenciales estén disponibles para la aplicación:

  • Un volumen denominado google-cloud-key que usa el secreto con el nombre pubsub-key.

  • Una activación de volumen, que hace que google-cloud-key esté disponible en el directorio /var/secrets/google dentro del contenedor.

  • La variable de entorno GOOGLE_APPLICATION_CREDENTIALS configurada como /var/secrets/google/key.json, que contendrá el archivo de credenciales cuando el secreto se active como volumen en el contenedor.

Ten en cuenta que las bibliotecas cliente de Google Cloud reconocen automáticamente la variable de entorno GOOGLE_APPLICATION_CREDENTIALS, en este caso el cliente de Cloud Pub/Sub para Python.

Para implementar este manifiesto, descárgalo en tu máquina como pubsub-with-secret.yaml y ejecuta lo siguiente:

kubectl apply -f pubsub-with-secret.yaml

Una vez implementado correctamente, el estado del pod debe mostrarse como Running:

kubectl get pods -l app=pubsub
Salida:
NAME                     READY     STATUS    RESTARTS   AGE
pubsub-652482369-2d6h2   1/1       Running   0          29m

Paso 6: Prueba la recepción de mensajes Pub/Sub

Ahora que ya configuraste la aplicación, publica un mensaje en el tema de Pub/Sub con el nombre echo:

gcloud pubsub topics publish echo --message="Hello, world!"

En pocos segundos, la aplicación debe tomar el mensaje para después imprimirlo en el flujo de resultados. Para inspeccionar los registros desde el pod implementado, ejecuta lo siguiente:

kubectl logs -l app=pubsub
Salida:
Pulling messages from Pub/Sub subscription...
[2017-06-19 12:31:42.501123] ID=130941112144812 Data=Hello, world!

Configuraste correctamente una aplicación en GKE para autenticarte en la API de Pub/Sub con las credenciales de la cuenta de servicio.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Limpia la suscripción y el tema de Pub/Sub:

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
  2. Borra el clúster del contenedor:

    gcloud container clusters delete pubsub-test

¿Qué sigue?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Instructivos de Kubernetes Engine