Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Llamadas externas a la API de Kubernetes: cómo hacerlas bien

By Eran ChetzroniJan 30, 20192 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

5c709 1ecs g06obsiswvlwsvu oq

A veces vas a tener que llamar a la API de Kubernetes desde fuera del cluster, ya sea para correr un job, listar deployments o cualquier otra acción que la API permita.

Acá te muestro cómo hacerlo con un JWT (JSON Web Token) de Service Account.

Primero tenés que asumir un rol de admin en el cluster (si todavía no lo tenés):

kubectl create clusterrolebinding cluster-admin-binding \
-clusterrole cluster-admin \
-user "$(gcloud config get-value account)"

Ahora vamos a crear un service account de Kubernetes dedicado, con los permisos correspondientes:

kubectl create serviceaccount external-svc

Después le asociamos algunos roles a ese service account; en este caso le sumamos batch. Jobs — view, list, create.

Esto va a permitir que el servicio externo cree y observe recursos de Kubernetes (archivo rbac.yaml acá):

kubectl create -f rbac.yaml

Ahora hay que extraer el nombre único del service account:

export secret=`kubectl get serviceaccount external-svc -o json | jq -Mr ‘.secrets[].name’`

Después se obtiene el certificado CA del cluster y se guarda en un archivo ca.crt local:

kubectl get secrets $secret -o json | jq -Mr ‘.data["ca.crt"]’ | base64 -D > ca.crt

Y se obtiene el token secreto, guardándolo en una variable de entorno:

export token=`kubectl get secrets $secret -o json | jq -Mr ‘.data.token’ | base64 -D`

Ahora buscamos la IP del cluster:

kubectl cluster-info

Probemos traer todos los jobs con el nuevo token del service account desde nuestra máquina local:

curl ‘https://<cluster-ip>/apis/batch/v1/namespaces/default/jobs’ -cacert ca.crt -H "Authorization: Bearer $token"

Y creemos un job de ejemplo también desde fuera del cluster:

curl -X POST -H ‘Content-Type: application/yaml’-data-binary

@example

.yaml -cacert ca.crt -H "Authorization: Bearer $token" ‘https://<cluster-ip>/apis/batch/v1/namespaces/default/jobs’

Y listo. Ya podés usar el token y el ca.crt como quieras para llamar a la API de Kubernetes desde fuera del cluster.

Esta estrategia te permite tener un servicio con privilegios mínimos, que solo accede a endpoints específicos de la API. Eso sí, recordá que el token funciona como la contraseña de tu cluster y hay que cuidarlo como cualquier otro secreto.

Existen otras estrategias para lograrlo y están documentadas acá.

Los comandos y los archivos yaml están en GitLab.

¿Querés más historias? Pasá por nuestro blog o seguí a Eran en Twitter.