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.

  1. 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 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.

  2. 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.

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 Cloud
  • PROJECT_NUMBER : numéro de votre projet Google Cloud
  • NAMESPACE : espace de noms Kubernetes pour l'application
  • KUBERNETES_SERVICEACCOUNT : compte de service Kubernetes à utiliser pour l'application
  • IAM_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 :

  1. 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.json
    

    Remplacez les éléments suivants :

    • PROJECT_ID
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT
    • IDENTITY_PROVIDER par le nom du fournisseur d'identité de votre cluster.
  2. Appliquez le fichier manifeste à votre cluster :

    kubectl apply -f workload-identity-sample.yaml
    
  3. 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 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

  1. Supprimer l'exemple d'application

    kubectl delete -f manifest.yaml
    
  2. Supprimez 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=None
    

    Remplacez les éléments suivants :

    • PROJECT_ID
    • PROJECT_NUMBER
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT

Étape suivante