Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

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

By Eran ChetzroniJan 30, 20192 min read

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

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

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

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.