Menggunakan workload identity dengan Google Cloud

Workload Identity memungkinkan Anda menetapkan identitas dan otorisasi yang berbeda secara terperinci untuk setiap aplikasi di cluster Anda. Workload Identity adalah cara yang direkomendasikan agar aplikasi yang berjalan dalam GKE di Azure dapat mengakses layananGoogle Cloud . Untuk mengetahui informasi selengkapnya, lihat Workload identity.

Topik ini menjelaskan cara menggunakan identitas workload untuk terhubung ke Google Cloud layanan dari workload Anda.

Mengonfigurasi izin IAM

Di bagian ini, Anda akan memberikan izin ServiceAccount Kubernetes untuk mengakses Google Cloud layanan dengan memberikan peran IAM kepadanya.

Mendapatkan workload identity pool dan penyedia workload Anda

Untuk mengonfigurasi workload identity, Anda harus memiliki nilai untuk URI penyedia identitas dan workload identity pool cluster.

  1. Tentukan workload identity pool untuk cluster Anda:

    Semua cluster GKE memiliki penyedia identitas yang dibuat di workload identity pool PROJECT_ID.svc.id.goog. Untuk mendapatkan nama kumpulan identitas cluster Anda, gunakan Google Cloud CLI:

    gcloud container azure clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    Ganti kode berikut:

    • CLUSTER_NAME dengan nama cluster Anda.
    • GOOGLE_CLOUD_LOCATION dengan nama lokasi Google Cloudyang mengelola cluster Anda

    Output menyertakan nama pool identitas cluster Anda. Simpan nilai ini. Anda nanti akan membutuhkannya.

  2. Tentukan penyedia identitas untuk cluster Anda.

    Untuk menemukan nama penyedia identitas cluster Anda, gunakan Google Cloud CLI:

    gcloud container azure clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

    Ganti kode berikut:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    Output menyertakan nama penyedia identitas cluster Anda. Simpan nilai ini. Anda nanti akan membutuhkannya.

Memberikan peran IAM ke ServiceAccount Kubernetes Anda

Berikan peran IAM di project ke ServiceAccount 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

Ganti kode berikut:

  • PROJECT_ID: Project ID Google Cloud Anda
  • PROJECT_NUMBER: Google Cloud nomor project Anda
  • NAMESPACE: namespace Kubernetes untuk aplikasi
  • KUBERNETES_SERVICEACCOUNT: ServiceAccount Kubernetes yang akan digunakan untuk aplikasi
  • IAM_ROLE: peran IAM yang akan diberikan ke ServiceAccount Kubernetes

Dalam contoh ini, kita akan menggunakan peran roles/compute.viewer, yang memungkinkan akses hanya baca ke layanan komputasi:

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

Men-deploy aplikasi contoh

Di bagian ini, Anda akan men-deploy aplikasi contoh yang mengakses Compute Engine API. Untuk menggunakan contoh ini, ServiceAccount Kubernetes Anda harus memiliki peran IAM roles/compute.viewer yang diberikan kepadanya. Untuk men-deploy aplikasi contoh, ikuti langkah-langkah berikut:

  1. Salin manifes berikut ke dalam file bernama 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
    

    Ganti kode berikut:

    • PROJECT_ID
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT
    • IDENTITY_PROVIDER dengan nama penyedia identitas untuk cluster Anda.
  2. Terapkan manifes ke cluster Anda

    kubectl apply -f workload-identity-sample.yaml
    
  3. Pastikan aplikasi contoh berfungsi, periksa log Pod:

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    Ganti kode berikut:

    • NAMESPACE

    Jika Pod berhasil mengakses Google Cloud Compute API, Anda akan melihat output yang terlihat mirip dengan ini:

    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
    

Pembersihan

  1. Hapus aplikasi contoh

    kubectl delete -f manifest.yaml
    
  2. Hapus binding kebijakan IAM dari project

    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
    

    Ganti kode berikut:

    • PROJECT_ID
    • PROJECT_NUMBER
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT

Langkah berikutnya