Menggunakan workload identity dengan Google Cloud

Workload identity memungkinkan Anda menetapkan identitas dan otorisasi yang berbeda dan terperinci untuk setiap aplikasi di cluster. Workload Identity adalah cara yang direkomendasikan bagi aplikasi yang berjalan dalam GKE di Azure untuk mengakses layanan Google Cloud. Untuk mengetahui informasi selengkapnya, lihat Identitas workload.

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

Mengonfigurasi akun layanan Google Cloud

Di bagian ini, Anda akan membuat akun layanan Google Cloud (GSA) dengan izin terbatas untuk mengakses layanan Google Cloud.

Mendapatkan kumpulan dan penyedia workload identity

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

  1. Tentukan kumpulan workload identity untuk cluster Anda:

    Semua cluster GKE memiliki penyedia identitas yang dibuat di kumpulan identitas workload 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 Cloud yang mengelola cluster Anda

    Outputnya akan menyertakan nama kumpulan 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-nya mencakup nama penyedia identitas cluster Anda. Simpan nilai ini. Anda nanti akan membutuhkannya.

Membuat akun layanan Google Cloud

Untuk membuat akun layanan Google Cloud (GSA), berikan izin ke akun tersebut, dan tambahkan binding kebijakan IAM ke GSA, lakukan langkah-langkah berikut:

  1. Buat GSA dengan Google Cloud CLI:

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    Ganti kode berikut:

    • GSA_NAME: nama GSA untuk aplikasi Anda.
    • PROJECT_ID: project Google Cloud GSA.
  2. Tambahkan binding IAM untuk mengizinkan GSA mengakses layanan.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    Ganti kode berikut:

    • GSA_NAME: nama GSA untuk aplikasi Anda
    • PROJECT_ID: ID project untuk GSA
    • IAM_ROLE: peran IAM yang akan diberikan ke GSA

    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 serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Berikan izin untuk akun layanan Kubernetes (KSA) untuk meniru GSA. Untuk melakukannya, tambahkan binding kebijakan IAM dengan peran 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
    

    Ganti kode berikut:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE: Namespace Kubernetes untuk aplikasi
    • KSA_NAME: KSA yang akan digunakan untuk aplikasi

Menerapkan aplikasi sampel

Di bagian ini, Anda akan men-deploy aplikasi contoh yang mengakses Compute Engine API. Untuk menggunakan contoh ini, akun layanan Anda harus memiliki peran IAM roles/compute.viewer yang diberikan. 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: 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
    

    Ganti kode berikut:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • 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 Compute API Google Cloud, 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. Menghapus aplikasi contoh

    kubectl delete -f manifest.yaml
    
  2. Menghapus binding kebijakan IAM dari akun layanan 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
    

    Ganti kode berikut:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Menghapus binding kebijakan IAM dari project

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    Ganti kode berikut:

    • GSA_NAME
    • PROJECT_ID
  4. Menghapus akun layanan Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Ganti kode berikut:

    • GSA_NAME
    • PROJECT_ID

Langkah selanjutnya