Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Externe Kubernetes-API-Aufrufe – so geht's richtig

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

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

Manchmal müssen Sie die Kubernetes-API von außerhalb des Clusters ansprechen – etwa um Jobs zu starten, Deployments aufzulisten oder andere Funktionen der Kubernetes-API zu nutzen.

In diesem Beitrag zeige ich Ihnen, wie das per Service Account JWT (JSON Web Token) funktioniert.

Zunächst brauchen Sie eine Admin-Rolle im Cluster (falls Sie diese nicht ohnehin schon haben):

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

Legen wir nun einen dedizierten Kubernetes Service Account mit den passenden Berechtigungen an:

kubectl create serviceaccount external-svc

PerfectScale™ for Kubernetes

Ready to optimize?

Get your free Kubernetes savings analysis

Anschließend weisen wir diesem Service Account ein paar Rollen zu – in diesem Fall batch.Jobs mit view, list und create.

Damit kann der externe Service Kubernetes-Ressourcen erstellen und überwachen (die Datei rbac.yaml finden Sie hier):

kubectl create -f rbac.yaml

Jetzt müssen wir den eindeutigen Namen des Service Accounts auslesen:

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

Dann holen wir das CA-Zertifikat des Clusters und legen es lokal in der Datei ca.crt ab:

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

Danach lesen wir das geheime Token aus und speichern es in einer Umgebungsvariable:

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

Als Nächstes ermitteln wir die Cluster-IP:

kubectl cluster-info

Your cloud bill shouldn't be a mystery

Optimization, automation, expertise. In one platform.

Versuchen wir nun, mit dem neuen Service-Account-Token vom lokalen Rechner aus alle Jobs abzurufen:

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

Und legen direkt von außerhalb des Clusters einen Beispiel-Job an:

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’

Das war's auch schon: Token und ca.crt können Sie nun nach Bedarf einsetzen, um die Kubernetes-API von außerhalb des Clusters anzusprechen.

Auf diese Weise erhalten Sie einen Service nach dem Least-Privilege-Prinzip, der ausschließlich auf bestimmte API-Endpunkte zugreifen darf. Beachten Sie dabei: Das Token wirkt wie ein Passwort zu Ihrem Cluster und gehört genauso sorgfältig geschützt wie jedes andere Secret.

Es gibt noch ein paar weitere Wege, um dasselbe Ziel zu erreichen – sie sind hier dokumentiert.

Die Befehle und YAML-Dateien liegen auf GitLab.

Lust auf mehr? Schauen Sie in unseren Blog oder folgen Sie Eran auf Twitter.