Implementación Workload Identity y Despliegue de Microservicios

Mauricio Echeverria
GDG Cloud Santiago
Published in
6 min readJan 21, 2022

La siguiente guía muestra cómo habilitar y configurar Workload Identity en los clústeres de Google Kubernetes Engine (GKE).

Una práctica común en Google Cloud es crear una o más cuentas de servicio para autorizar la CLI de Google Cloud. Sin embargo, un archivo JSON o P12 de una cuenta de servicio contiene información confidencial, la clave privada, que se usa para autorizar solicitudes en Google Cloud

Workload Identity permite que los microservicios desplegados en los clústeres de GKE puedan utilizar sus cuentas de servicio para acceder a los servicios de Google Cloud, sin necesidad de configurar un secreto de kubernetes con el json de la service account.

Sin Workload Identity, la mejor manera de administrar las credenciales para una aplicación que se ejecuta en un Pod es montar las credenciales como un secreto de Kubernetes. En este escenario, el equipo de DevOps debe encargarse de reemplazar los secretos cuando se rotan las claves.

Requisitos Técnicos

Google Cloud Platform

  • Una cuenta personal de Google Cloud
  • SDK de Google Cloud

Recursos GCP que se utilizaran

  • Cluster de kubernetes
  • Service account
  • Tópicos y Suscripciones
  • Despliegue de la imagen de GCP us-docker.pkg.dev/google-samples/containers/gke/pubsub-sample:v1

Se presentaran 2 despliegues en esta guía uno donde estará configurada la service account a través de secreto de kubernetes y otro con la integración del token de Workload Identity.

Paso 1 Crear Cluster

Luego de crear el cluster se debe habilitar la integración de Workload Identity.

Paso 2 Crear Tópico y Suscripcion

Se debe crear tópico llamado echo

Se crea suscripcion echo-read

Paso 3 Crear Service Accounts

Se deben crear 2 service account, una llamada pubsub-v1 y pubsub-v2. Ademas se les debe dar permisos de roles/pubsub.subscriber sobre la suscripcion llamada echo-read.

Como paso adicional cargaremos mensajes al tópico echo.

Nos conectaremos a la consola de GCP y ejecutaremos el comando para publicar 200 mensajes en el,

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

Ahora que ya se creo la infraestructura procederemos a ambientar las configuraciones en el cluster

Nos conectaremos al cluster creado

gcloud container clusters get-credentials cluster-gke --zone us-east4-a --project [PROJECT ID]

Crearemos 2 namespace llamados v1 y v2

kubectl create namespace v1
kubectl create namespace v2

Caso 1 Pod con service account y secretos kubernetes con key json.

Generaremos el json de la service account pubsub-v1.

Crearemos el secreto de kubernetes con el json de la service account.

kubectl -n v1 create secret generic pubsub-v1-key --from-file=pubsub-v1.json

Ahora procederemos a desplegar el primer pod con la imagen docker us-docker.pkg.dev/google-samples/containers/gke/pubsub-sample:v1, el cual su funcionalidad es de sacar mensajes de una suscripcion llamada echo-read.

En este despliegue se hace referencia al secret pubsub-v1-key en kubernetes con el contenido del json de la service account.Se monta un volumen con el archivo json. Ademas se declara la variable GOOGLE_APPLICATION_CREDENTIALS con la ruta donde se encuentra el json dentro del pod.

Se crea un archivo llamado deployment-v1.yaml

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

Para desplegar el servicio se ejecuta el siguiente comando

kubectl apply -f deployment-v1.yaml -n v1

Al iniciar el servicio debería estar con status running y ver el siguiente logs.

kubectl logs -f [NAME POD] -n v1

Para finalizar este caso detenemos el pod para que no siga consumiendo los mensajes.

kubectl scale deployment pubsub-v1 --replicas=0 -n v1

Caso 2 Pod con service account y Workload Identity.

Configuraremos el token de la service account en el cluster .

gcloud iam service-accounts add-iam-policy-binding pubsub-v2@[PROJECT ID].iam.gserviceaccount.com --role roles/iam.workloadIdentityUser --member "serviceAccount:[PROJECT ID].svc.id.goog[NAMESPACE/KSA_NAME]"gcloud iam service-accounts add-iam-policy-binding pubsub-v2@[PROJECT ID].iam.gserviceaccount.com --role roles/iam.workloadIdentityUser --member "serviceAccount:[PROJECT ID].svc.id.goog[v2/pubsub-v2-sa]"

Se le da el permiso roles/iam.workloadIdentityUser para que pueda acceder desde el cluster al iam GCP.

kubectl create serviceaccount pubsub-v2-sa -n v2

Esta vinculación permite que la cuenta de servicio de Kubernetes actúe como la cuenta de servicio de IAM.

En este despliegue se hace referencia al secret pubsub-v2 en kubernetes con el contenido del token configurado previamente.

Se crea un archivo llamado deployment-v2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: pubsub-v2
spec:
selector:
matchLabels:
app: pubsub-v2
template:
metadata:
labels:
app: pubsub-v2
spec:
serviceAccountName: pubsub-v2-sa
containers:
- name: subscriber-v1
image: us-docker.pkg.dev/google-samples/containers/gke/pubsub-sample:v1

Para desplegar el servicio se ejecuta el siguiente comando

kubectl apply -f deployment-v2.yaml -n v2

Al iniciar el servicio debería estar con status running y ver el siguiente logs.

kubectl logs -f [NAME POD] -n v2

Con Workload Identity, no es necesario administrar las credenciales ni montar secretos de Kubernetes. Workload Identity se encarga de esto automáticamente, incluidas las rotaciones de claves.

Ejemplo con terraform para la creación de un cluster con Workload Identity y los casos prácticos visto en esta guia.

Código fuente: https://github.com/mauricio-echeverria/Casos_Pruebas/tree/main/Caso-1-workload-identity

Publicación medium : https://medium.com/@mauricio.echeverria.vicencio/levantar-microservicios-sin-tener-que-generar-archivo-json-de-service-account-7dd5e5a9746a

--

--