Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Chamadas externas à API do Kubernetes — do jeito certo

By Eran ChetzroniJan 30, 20192 min read

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

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

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

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.