
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-svcAnschließ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.yamlJetzt 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.crtDanach 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-infoVersuchen 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.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.