
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-svcAssocions 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.yamlExtrayons à 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.crtRé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-infoEssayons 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.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.