Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Appels API Kubernetes externes — la bonne méthode

By Eran ChetzroniJan 30, 20192 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

5c709 1ecs g06obsiswvlwsvu oq

Il arrive de devoir appeler l'API Kubernetes depuis l'extérieur du cluster, pour lancer un job, lister des déploiements ou toute autre opération offerte par l'API Kubernetes.

Je vous explique ici comment procéder à l'aide d'un JWT (JSON Web Token) de Service Account.

Il faut d'abord endosser un rôle admin dans le cluster (si ce n'est pas déjà le cas) :

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

Créons maintenant un service account Kubernetes dédié, avec les permissions adéquates :

kubectl create serviceaccount external-svc

Associons ensuite des rôles à ce service account ; ici, nous avons attaché batch. Jobs — view, list, create.

Le service externe pourra ainsi créer et surveiller des ressources Kubernetes (fichier rbac.yaml disponible ici) :

kubectl create -f rbac.yaml

Extrayons à présent le nom unique du service account :

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

Récupérons le certificat CA du cluster et plaçons-le dans un fichier ca.crt local :

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

Récupérons le token secret et stockons-le dans une variable d'environnement :

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

Identifions l'adresse IP du cluster :

kubectl cluster-info

Essayons maintenant de récupérer tous les jobs depuis notre machine locale, avec le nouveau token du service account :

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

Créons aussi un job d'exemple depuis l'extérieur du 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’

Et voilà : vous pouvez désormais utiliser le token et le ca.crt comme vous le souhaitez pour appeler l'API Kubernetes depuis l'extérieur du cluster.

Cette approche vous permet de disposer d'un service au privilège minimal, qui n'a accès qu'à des endpoints d'API précis. Gardez à l'esprit que le token équivaut à un mot de passe pour votre cluster et doit être protégé comme n'importe quel autre secret.

D'autres stratégies permettent d'arriver au même résultat ; elles sont documentées ici.

Les commandes et les fichiers yaml sont hébergés sur GitLab.

Envie d'en lire plus ? Consultez notre blog ou suivez Eran sur Twitter.