2

Ich versuche, die Erstellung von Dienstkonten für die Verwendung mit GKE über das Befehlszeilentool gcloud zu automatisieren. Ich habe einen Flow gefunden, der den von der Google Cloud Console verwendeten Prozess zu spiegeln scheint, aber meinen Nutzern wird nicht der entsprechende Zugriff angezeigt.Wie berechtige ich serviceAccounts über die gcloud-Befehlszeile für den Kubernetes-API-Zugriff?

ist hier die Befehle, die ich bin, um die Ausführung:

# Environment: 
# - uname=<username> 
# - email=<user's email address> 
# - GCLOUD_PROJECT_ID=<project identifier> 
# - serviceAccount="${uname}@${GCLOUD_PROJECT_ID}.iam.gserviceaccount.com" 
$ gcloud iam service-accounts \ 
    create "${uname}" --display-name "email:${email}" --format json 
$ gcloud projects \ 
    add-iam-policy-binding "${GCLOUD_PROJECT_ID}" \ 
     --member "serviceAccount:${serviceAccount}" \ 
     --role=roles/container.developer --format=json 
$ gcloud iam service-accounts keys \ 
    create "${GCLOUD_PROJECT_ID}-${uname}.json" \ 
     --iam-account="${serviceAccount}" 

Wenn dies ausgeführt wird, erstellt es ein neues Konto Service und generiert eine Schlüsseldatei lokal. Ich versuche dann, diesen Schlüssel zu verwenden, um Anmeldeinformationen für meinen Kubernetes-Cluster zu erhalten.

$ gcloud config configurations create devcluster --activate 
$ gcloud config set project devnet-166017 
$ gcloud config set compute/zone us-central1-b 
$ gcloud auth activate-service-account \ 
    --key-file="${GCLOUD_PROJECT_ID}-${uname}.json" 
$ gcloud container clusters get-credentials devcluster 
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: \ 
    code=403, message=Required "container.clusters.get" permission for \ 
    "projects/${GCLOUD_PROJECT_ID}/zones/us-central1-b/clusters/devcluster". 

Es scheint, dass meine Dienstkonto aus irgendeinem Grund nicht über eine einzige der Berechtigungen muss es Anmeldeinformationen erhalten, aber auf das, was ich gelesen habe und was ich in der Konsole beobachtet, ich glaube, Diese Berechtigung sollte Teil der roles/container.developer Rolle sein.

Danke!

+0

Irgendeine Lösung dafür? Ich versuchte [this] (https://stackoverflow.com/questions/42556739/service-account-throws-an-insufficient-permission-error-event-it-has-owner-priv) mit nicht Glück – mllm

+0

Art von: I fand heraus, dass, wenn ich mit einem höchst berechtigten Benutzer (ein Projekt "Owner" in Google Cloud) anfing, die obigen Schritte ein Dienstkonto erstellten, das Zugriff darauf hatte, das zu tun, was ich brauchte. Als ich jedoch ein anderes Dienstkonto mit einem feineren Satz von Berechtigungen verwendete, schlug es fehl. Es scheint, als könnte es einige abgeleitete Autorisierungen geben, aber ich habe nicht genau festgestellt, was diese sind. – benschumacher

+0

Ich habe eigentlich nur die fehlerhaften 'gcloud container cluster get-credentials devcluster'-Zeile entfernt. Habe ** keine Ahnung ** warum es jetzt funktioniert, aber das ist meine Lösung. – mllm

Antwort

0

Ich nehme an, mit Dienstkonto meinen Sie das Dienstkonto für Google Cloud. Hier sind die IAM-Rollen im Zusammenhang mit GKE: https://cloud.google.com/container-engine/docs/iam-integration (Suche nach container.).

Zuerst ein Dienstkonto erstellen:

gcloud iam service-accounts create --display-name "GKE cluster access" gke-test 

Erstellen Sie dann ein Schlüssel:

gcloud iam service-accounts keys create key.json [email protected][PROJECT_ID].iam.gserviceaccount.com 

Nun müssen Sie einige Rollen zu diesem Dienstkonto zuweisen, Ihre Optionen sind:

  • roles/container.admin Vollständige Verwaltung von Containerclustern und ihren Kubernetes-API-Objekten.
  • roles/container.clusterAdmin Verwaltung von Container-Clustern.
  • roles/container.developer Voller Zugriff auf Kubernetes-API-Objekte in Container-Clustern.
  • roles/container.viewer Schreibgeschützter Zugriff auf Container Engine-Ressourcen.

Weitere Informationen finden Sie auf https://cloud.google.com/container-engine/docs/iam-integration Seite.

I zuweisen roles/container.viewer (eine Nur-Lese-Rolle, mindestens Sie erhalten-Anmeldeinformationen zuweisen können) zu diesem Dienstkonto:

gcloud projects add-iam-policy-binding [PROJECT_ID] --role=roles/container.viewer --member=serviceAccount:[email protected][PROJECT_ID].iam.gserviceaccount.com 

Logout auf gcloud von Ihrem Girokonto:

gcloud auth revoke 

Melden Sie sich bei gcloud mit dem Dienstkontoschlüssel an:

gcloud auth activate-service-account --key-file=key.json 

Versuchen Sie get-credentials:

$ gcloud container clusters get-credentials test --zone us-west1-a 
Fetching cluster endpoint and auth data. 
kubeconfig entry generated for test. 

Es funktioniert. Ich habe es mit roles/container.developer versucht, was auch funktioniert.

Sie können andere Berechtigungen ausprobieren und sehen, was funktioniert und was nicht, obwohl Sie klargestellt haben, dass die Dokumentation nicht klarstellt, welche Rollen Zugriff auf container.clusters.getCredentials haben.

+0

Danke Ahmet. Ich werde versuchen, Zeit zu nehmen, um herum zu kreisen und das noch einmal zu versuchen. Ich bin mir nicht sicher, ob Sie meinen Kommentar oben gesehen haben, re: das funktioniert für mich, wenn ich ein Konto (oder serviceAccount) mit 'roles/owner' verwende, im Gegensatz zu einem eingeschränkteren Konto. Ich bin nicht sicher, warum das wichtig ist, aber ich musste meinem serviceAccount, der diesen Prozess von unserer Automatisierungspipeline ausführte, höhere Privilegien geben, damit die erstellten serviceAccounts wie erwartet funktionieren. – benschumacher

+1

@ ahmet-alp-balkan Welche zusätzlichen Bereiche benötigen Sie, um mit einem Dienstkonto, das zu einem anderen Projekt gehört, 'gcloud container clusters get-credentials 'ausführen zu können? – fabrizioM

Verwandte Themen