2

J'essaie d'automatiser la création de comptes de service à utiliser avec GKE via l'outil de ligne de commande gcloud. J'ai trouvé un flux qui semble refléter le processus utilisé par Google Cloud Console, mais mes utilisateurs ne voient pas l'accès approprié.Comment puis-je autoriser serviceAccounts via la ligne de commande gcloud pour l'accès à l'API Kubernetes?

est ici les commandes j'exécution dans l'ordre:

# 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}" 

Lorsque cela exécute, il crée un nouveau compte de service et génère un fichier de clé localement. J'essaie ensuite d'utiliser cette clé pour obtenir des informations d'identification pour mon cluster Kubernetes.

$ 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". 

Il semble que, pour une raison quelconque mon compte de service ne dispose pas d'une des autorisations dont il a besoin pour obtenir des informations d'identification, mais d'après ce que je l'ai lu et ce que j'ai observé dans la console, je crois cette autorisation doit faire partie du rôle roles/container.developer.

Merci!

+0

Une solution pour cela? J'ai essayé [ceci] (https://stackoverflow.com/questions/42556739/service-account-throws-an-insufficient-permission-error-even-it-has-owner-priv) avec pas de chance – mllm

+0

Type de: I J'ai compris que si je commençais avec un utilisateur hautement qualifié (un projet 'Propriétaire' dans Google Cloud), les étapes ci-dessus ont créé un compte de service qui avait accès à faire ce dont j'avais besoin. Cependant, lorsque j'utilisais un autre compte de service avec un ensemble de droits plus fin, il échouait. Il semble qu'il puisse y avoir des autorisations dérivées, mais je n'ai pas précisé exactement ce que c'est. – benschumacher

+0

En fait, je me suis contenté de supprimer la ligne défaillante 'gcloud container clusters get-credentials devcluster'. Avoir ** aucune idée ** pourquoi cela fonctionne maintenant, mais c'est ma solution. – mllm

Répondre

0

Je suppose que par compte de service, vous voulez dire le compte de service pour Google Cloud. Voici les rôles IAM liés à GKE: https://cloud.google.com/container-engine/docs/iam-integration (recherchez container.).

d'abord créer un compte de service:

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

Ensuite, créez une clé:

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

Maintenant, vous devez attribuer des rôles à ce compte de service, vos options sont:

  • roles/container.admin Gestion complète des groupes de conteneurs et de leurs objets API Kubernetes.
  • roles/container.clusterAdmin Gestion des groupes de conteneurs.
  • roles/container.developer Accès complet aux objets API Kubernetes à l'intérieur des groupes de conteneurs.
  • roles/container.viewer Accès en lecture seule aux ressources Container Engine.

Encore une fois regarder https://cloud.google.com/container-engine/docs/iam-integration page pour plus de détails.

J'assignez roles/container.viewer (lecture seule rôle, minimum que vous pouvez attribuer à obtenir-lettres de créance) à ce compte de service:

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

Déconnexion sur gcloud de votre compte:

gcloud auth revoke 

Connectez-vous à gcloud avec la clé de compte de service:

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

Essayez get-credentials:

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

Cela fonctionne. Je l'ai essayé avec roles/container.developer, qui fonctionne également.

Vous pouvez essayer d'autres autorisations et voir ce qui fonctionne et ce qui ne fonctionne pas, bien que vous ayez précisé que la documentation ne précise pas quels rôles ont accès à container.clusters.getCredentials.

+0

Merci Ahmet. Je vais essayer de prendre le temps de faire le tour et de recommencer. Je ne sais pas si vous avez vu mon commentaire ci-dessus, re: cela fonctionne pour moi lorsque j'utilise un compte (ou serviceAccount) avec 'roles/owner' par rapport à un compte plus restreint. Je ne suis pas sûr pourquoi cela compte, mais j'ai dû donner à mon serviceAccount qui a exécuté ce processus hors de notre pipeline d'automatisation des privilèges plus élevés pour le serviceAccounts créé pour fonctionner comme prévu. – benschumacher

+1

@ ahmet-alp-balkan De quelles étendues avez-vous besoin pour pouvoir faire 'gcloud container clusters get-credentials' en utilisant un compte de service appartenant à un autre projet? – fabrizioM