Utiliser Workload Identity 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 servicesGoogle Cloud . Pour en savoir plus, consultez Workload Identity.
Cette rubrique explique comment utiliser Workload Identity pour se connecter aux servicesGoogle Cloud à partir de vos charges de travail.
Configurer les autorisations IAM
Dans cette section, vous accordez à un compte de service Kubernetes l'autorisation d'accéder aux servicesGoogle Cloud en lui attribuant des rôles IAM.
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_NAMEpar le nom de votre cluster.GOOGLE_CLOUD_LOCATIONpar le nom de l'emplacement Google Cloudqui 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_NAMEGOOGLE_CLOUD_LOCATION
La sortie inclut le nom du fournisseur d'identités de votre cluster. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.
Attribuer des rôles IAM à votre compte de service Kubernetes
Attribuez le rôle IAM sur le projet au compte de service Kubernetes :
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
--role=IAM_ROLE \
--condition=None
Remplacez les éléments suivants :
PROJECT_ID: ID de votre projet Google CloudPROJECT_NUMBER: numéro de votre projet Google CloudNAMESPACE: espace de noms Kubernetes pour l'applicationKUBERNETES_SERVICEACCOUNT: compte de service Kubernetes à utiliser pour l'applicationIAM_ROLE: rôle IAM à attribuer au compte de service Kubernetes.
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="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
--role=roles/compute.viewer \
--condition=None
Déployer 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, votre compte de service Kubernetes doit disposer du rôle IAM roles/compute.viewer. 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: KUBERNETES_SERVICEACCOUNT 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", "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: KUBERNETES_SERVICEACCOUNT 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.jsonRemplacez les éléments suivants :
PROJECT_IDNAMESPACEKUBERNETES_SERVICEACCOUNTIDENTITY_PROVIDERpar le nom du fournisseur d'identité de votre cluster.
Appliquez le fichier manifeste à votre cluster :
kubectl apply -f workload-identity-sample.yamlVérifiez que l'exemple d'application fonctionne et consultez les journaux du pod :
kubectl logs -f cloud-sdk-example -n NAMESPACERemplacez les éléments suivants :
NAMESPACE
Si le pod parvient à accéder à l'API Compute Engine de Google Cloud, vous verrez un résultat semblable à celui-ci :
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.yamlSupprimez la liaison de stratégie IAM du projet.
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role=roles/compute.viewer \ --condition=NoneRemplacez les éléments suivants :
PROJECT_IDPROJECT_NUMBERNAMESPACEKUBERNETES_SERVICEACCOUNT