Utiliser les identités de charge de travail avec Google Cloud
Workload Identity vous permet d'attribuer des identités et une autorisation distinctes et précises pour chaque application du cluster. Workload Identity est la solution recommandée pour que les applications exécutées dans GKE sur Azure puissent accéder aux services Google Cloud. Pour en savoir plus, consultez la page concernant Workload Identity.
Cet article explique comment utiliser Workload Identity pour vous connecter aux services Google Cloud à partir de vos charges de travail.
Configurer un compte de service Google Cloud
Dans cette section, vous allez créer un compte de service Google Cloud (GSA) avec des autorisations limitées pour accéder aux services Google Cloud.
Obtenir votre pool d'identités de charge de travail et votre fournisseur
Pour configurer Workload Identity, vous devez disposer des valeurs de l'URI du fournisseur d'identité de votre cluster et des pools d'identités de charge de travail.
Déterminer le pool d'identités de charge de travail pour votre cluster
Tous les clusters GKE disposent d'un fournisseur d'identité créé dans le pool d'identités de charge de travail
PROJECT_ID.svc.id.goog
. Pour obtenir le nom du pool d'identités de votre cluster, utilisez Google Cloud CLI :gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'
Remplacez les éléments suivants :
CLUSTER_NAME
par le nom de votre cluster.GOOGLE_CLOUD_LOCATION
par le nom de l'emplacement Google Cloud qui gère votre cluster.
La sortie inclut le nom du pool d'identités de votre cluster. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.
Déterminer le fournisseur d'identité pour votre cluster
Pour trouver le nom du fournisseur d'identité de votre cluster, utilisez Google Cloud CLI :
gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'
Remplacez les éléments suivants :
CLUSTER_NAME
GOOGLE_CLOUD_LOCATION
La sortie inclut le nom du fournisseur d'identités de votre cluster. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.
Créer un compte de service Google Cloud
Pour créer un compte de service Google Cloud (GSA), lui attribuer des autorisations et ajouter une liaison de stratégie IAM au GSA, procédez comme suit :
Créez le GSA avec Google Cloud CLI :
gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
Remplacez les éléments suivants :
GSA_NAME
: nom du GSA de votre application.PROJECT_ID
: projet Google Cloud du GSA.
Ajoutez une liaison IAM pour permettre au GSA d'accéder aux services.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role IAM_ROLE
Remplacez les éléments suivants :
GSA_NAME
: nom du GSA de votre application.PROJECT_ID
: ID de projet du GSA.IAM_ROLE
: rôle IAM à attribuer au GSA.
Dans cet exemple, nous allons utiliser le rôle
roles/compute.viewer
, qui permet un accès en lecture seule aux services de calcul :gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewer
Accordez des autorisations à votre compte de service Kubernetes (KSA) pour emprunter l'identité du GSA. Pour ce faire, ajoutez une liaison de stratégie IAM avec le rôle
roles/iam.workloadIdentityUser
:gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \ --role roles/iam.workloadIdentityUser
Remplacez les éléments suivants :
GSA_NAME
PROJECT_ID
NAMESPACE
: espace de noms Kubernetes de l'application.KSA_NAME
: KSA à utiliser pour l'application.
Déploiement d'un exemple d'application
Dans cette section, vous allez déployer un exemple d'application qui accède à l'API Compute Engine. Pour utiliser cet exemple, le rôle IAM roles/compute.viewer
doit être attribué à votre compte de service. Pour déployer l'exemple d'application, procédez comme suit :
Copiez le fichier manifeste suivant dans un fichier nommé
workload-identity-sample.yaml
:apiVersion: v1 kind: Namespace metadata: name: NAMESPACE --- apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE automountServiceAccountToken: false --- apiVersion: v1 kind: ConfigMap metadata: name: cloud-sdk-config namespace: NAMESPACE data: config: | { "type": "external_account", "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } } --- apiVersion: v1 kind: Pod metadata: name: cloud-sdk-example namespace: NAMESPACE spec: serviceAccount: KSA_NAME containers: - name: cloud-sdk image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest command: - /bin/bash - -c - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done' env: - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json - name: CLOUDSDK_CORE_PROJECT value: PROJECT_ID volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: audience: PROJECT_ID.svc.id.goog expirationSeconds: 86400 path: token - configMap: name: cloud-sdk-config optional: false items: - key: config path: google-application-credentials.json
Remplacez les éléments suivants :
PROJECT_ID
NAMESPACE
KSA_NAME
GSA_NAME
IDENTITY_PROVIDER
par le nom du fournisseur d'identité de votre cluster.
Appliquez le fichier manifeste à votre cluster :
kubectl apply -f workload-identity-sample.yaml
Vérifiez que l'exemple d'application fonctionne et consultez les journaux du pod :
kubectl logs -f cloud-sdk-example -n NAMESPACE
Remplacez les éléments suivants :
NAMESPACE
Si le pod parvient à accéder à l'API de calcul Google Cloud, la sortie ressemble à ceci :
NAME REGION STATUS NEXT_MAINTENANCE TURNDOWN_DATE us-central1-c us-central1 UP us-central1-a us-central1 UP us-central1-f us-central1 UP us-central1-b us-central1 UP
Nettoyer
Supprimer l'exemple d'application
kubectl delete -f manifest.yaml
Supprimer la liaison de stratégie IAM du compte de service Google Cloud
gcloud iam service-accounts remove-iam-policy-binding \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \ roles/iam.workloadIdentityUser
Remplacez les éléments suivants :
GSA_NAME
PROJECT_ID
NAMESPACE
KSA_NAME
Supprimez la liaison de stratégie IAM du projet.
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewer
Remplacez les éléments suivants :
GSA_NAME
PROJECT_ID
Supprimer le compte de service Google Cloud
gcloud iam service-accounts delete \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
Remplacez les éléments suivants :
GSA_NAME
PROJECT_ID