Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Chamadas externas à API do Kubernetes — do jeito certo

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

By Eran ChetzroniJan 30, 20192 min read
Eran Chetzroni

About Eran Chetzroni

Leading FDEs and Cloud Architects across the globe.

My personal page

5c709 1ecs g06obsiswvlwsvu oq

Em algum momento você vai precisar chamar a API do Kubernetes de fora do cluster, seja para rodar um job, listar deployments ou qualquer outra função que a API do Kubernetes oferece.

Neste artigo, vou te mostrar como fazer isso usando o JWT (JSON Web Token) de uma Service Account.

Primeiro, você precisa assumir um papel de admin no cluster (se ainda não tiver):

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

Agora vamos criar uma service account dedicada do Kubernetes com as permissões necessárias:

kubectl create serviceaccount external-svc

PerfectScale™ for Kubernetes

Ready to optimize?

Get your free Kubernetes savings analysis

E agora vamos vincular algumas roles a essa service account. Neste caso, atrelamos batch. Jobs — view, list, create.

Isso vai permitir que o serviço externo crie e observe o Kubernetes (arquivo rbac.yaml aqui):

kubectl create -f rbac.yaml

Agora precisamos extrair o nome único da service account:

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

Em seguida, vamos obter o certificado CA do cluster e salvá-lo localmente em um arquivo ca.crt:

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

E pegar o token secreto, guardando-o em uma variável de ambiente:

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

Vamos descobrir o IP do cluster:

kubectl cluster-info

Your cloud bill shouldn't be a mystery

Optimization, automation, expertise. In one platform.

Agora vamos tentar listar todos os jobs com o novo token da service account a partir da nossa máquina local:

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

E também criar um job de exemplo a partir de fora do 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’

Pronto. Agora você pode usar o token e o ca.crt da forma que quiser para chamar a API do Kubernetes de fora do cluster.

Essa estratégia permite criar um serviço com privilégio mínimo, que só acessa endpoints específicos da API. Vale lembrar: o token funciona como uma senha do seu cluster e deve ser tratado como qualquer outro secret.

Há algumas outras estratégias para chegar ao mesmo resultado, todas documentadas aqui.

Os comandos e os arquivos yaml estão hospedados no GitLab.

Quer mais conteúdos como esse? Confira o nosso blog ou siga o Eran no Twitter.