Mengaktifkan Workload Identity dengan Apigee Hybrid

Topik ini menjelaskan cara mengaktifkan Workload Identity untuk Apigee Hybrid.

Ringkasan

Workload Identity adalah cara bagi aplikasi yang berjalan dalam GKE (Google Kubernetes Engine) untuk mengakses layanan Google Cloud. Untuk ringkasan Workload Identity, lihat:

Akun layanan Google Cloud IAM adalah identitas yang dapat digunakan aplikasi untuk membuat permintaan ke Google API. Akun layanan ini disebut sebagai GSA (Akun Layanan Google) dalam dokumen. Untuk informasi selengkapnya tentang GSA, lihat Akun layanan.

Secara terpisah, Kubernetes juga memiliki konsep akun layanan. Akun layanan memberikan identitas untuk proses yang berjalan di dalam Pod. Akun layanan Kubernetes adalah resource Kubernetes, sedangkan akun layanan Google dikhususkan untuk Google Cloud. Untuk informasi tentang akun layanan Kubernetes, lihat Mengonfigurasi Akun Layanan untuk Pod dalam dokumentasi Kubernetes.

Dengan Apigee Hybrid 1.4 dan yang lebih baru, Apigee membuat serta menggunakan akun layanan Kubernetes untuk setiap jenis komponen. Dengan mengaktifkan Workload Identity, komponen hybrid dapat berinteraksi dengan akun layanan Kubernetes.

Akun layanan Google di Apigee Hybrid tanpa Workload Identity

Tanpa menggunakan Workload Identity, Anda harus menautkan akun layanan Google ke setiap komponen dalam file penggantian.yaml dengan referensi ke file sertifikat atau rahasia Kubernetes. Contoh:

Variabel lingkungan yang digunakan dalam prosedur ini

Prosedur ini menggunakan variabel lingkungan berikut. Tetapkan string ini di shell perintah Anda atau ganti dalam contoh kode dengan nilai sebenarnya:

  • APIGEECTL_HOME: Direktori tempat Anda menginstal apigeectl.
  • CLUSTER_LOCATION: Region atau zona cluster Anda, misalnya: us-west1.
  • ENV_NAME: Lalu nama lingkungan Apigee.
  • NAMESPACE: Namespace Kubernetes yang Anda gunakan untuk Apigee Hybrid. Biasanya apigee.
  • HYBRID_FILES: Direktori file hybrid Anda, misalnya hybrid-base-directory/hybrid-files.
  • ORG_NAME: Nama organisasi Apigee Anda.
  • PROJECT_ID: ID project Google Cloud Anda.

Verifikasi variabel lingkungan:

echo $PROJECT_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES

Lakukan inisialisasi setiap variabel yang Anda perlukan:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export APIGEECTL_HOME=hybrid-base-directory/apigeectl
export HYBRID_FILES=hybrid-base-directory/hybrid-files

File kunci Workload Identity dan akun layanan

Saat menjalankan Apigee Hybrid di GKE, praktik standarnya adalah membuat dan mendownload kunci pribadi (file .json) untuk setiap akun layanan. Saat menggunakan Workload Identity, Anda tidak perlu mendownload kunci pribadi akun layanan dan menambahkannya ke cluster GKE.

Jika telah mendownload file kunci akun layanan sebagai bagian dari penginstalan hybrid Apigee, Anda dapat menghapusnya setelah mengaktifkan Workload Identity. Pada sebagian besar penginstalan, image tersebut berada di direktori hybrid-base-directory/hybrid-files/service-accounts/.

Mengaktifkan Workload Identity untuk Apigee Hybrid

Untuk memulai, ikuti petunjuk dalam artikel Mempersiapkan untuk mengaktifkan Workload Identity guna mengupdate kumpulan node dan menginisialisasi variabel sebelum mengaktifkan Workload Identity.

Kemudian, ikuti salah satu dari bagian ini, bergantung pada langkah yang Anda lakukan:

Persiapan untuk mengaktifkan Workload Identity

Sebelum memulai proses penginstalan, ikuti langkah-langkah di bagian ini.

  1. Tetapkan project ke project yang Anda modifikasi:
    gcloud config set project $PROJECT_ID
  2. Dapatkan kredensial gcloud cluster tempat Anda mengaktifkan Workload Identity dengan perintah berikut:
    gcloud container clusters get-credentials ${CLUSTER_NAME} \
      --region ${CLUSTER_LOCATION} \
      --project ${PROJECT_ID}
  3. Pastikan Workload Identity diaktifkan untuk cluster GKE yang menjalankan Apigee dengan perintah berikut:
    gcloud container clusters describe $CLUSTER_NAME --region $CLUSTER_LOCATION --project $PROJECT_ID

    Output harus mencakup sesuatu seperti berikut:

    …
      …
      status: RUNNING
      subnetwork: default
      workloadIdentityConfig:
        workloadPool: my-project-id.svc.id.goog

    Jika perlu, aktifkan workload identity di cluster. Operasi ini dapat memerlukan waktu hingga 30 menit:

      gcloud container clusters update $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --project $PROJECT_ID \
      --region $CLUSTER_LOCATION

    Untuk mengetahui informasi selengkapnya, lihat Mengaktifkan Workload Identity.

  4. Pastikan Workload Identity diaktifkan di setiap kumpulan node.
    1. Cantumkan node pool dengan perintah berikut:
      gcloud container node-pools list \
        --cluster $CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID

      Output Anda akan terlihat seperti ini:

        NAME            MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
        apigee-runtime  e2-standard-4  100           1.23.12-gke.100
        apigee-data     e2-standard-4  100           1.23.12-gke.100
    2. Pastikan Workload Identity diaktifkan per kumpulan node menggunakan perintah berikut untuk setiap kumpulan node:
      gcloud container node-pools update NODE_POOL_NAME \
        --cluster=$CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID \
        --workload-metadata=GKE_METADATA

      Dengan NODE_POOL_NAME adalah nama setiap kumpulan node.

Verifikasi atau buat akun layanan Google

Akun layanan Google dibuat untuk berbagai komponen campuran Apigee selama penginstalan. Gunakan prosedur ini untuk memverifikasi akun layanan Google dan membuat yang diperlukan.

  1. Periksa nama akun layanan Google untuk project Anda menggunakan perintah berikut:
    gcloud iam service-accounts list --project $PROJECT_ID

    Output Anda akan terlihat seperti ini:

    Produksi

    Untuk lingkungan non-produksi:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-logger        apigee-logger@my_project_id.iam.gserviceaccount.com        False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    Non-produksi

    Untuk lingkungan non-produksi:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    

    Jika perlu membuat akun layanan Google untuk project Anda, ada dua metode yang dapat digunakan:

    • Gunakan alat create-service-account yang disertakan dengan apigee dalam direktori apigeectl/tools/. Alat ini dapat membuat semua akun layanan dengan satu perintah atau memungkinkan Anda membuatnya satu per satu.
    • Gunakan perintah gcloud iam service-accounts create untuk membuat akun layanan satu per satu dan perintah gcloud projects add-iam-policy-binding untuk menetapkan peran yang sesuai ke setiap akun layanan. Metode ini mengharuskan Anda membuat setiap akun layanan satu per satu, tetapi memungkinkan Anda agar tidak mendownload file kunci.

    create-service-account

    Gunakan perintah berikut untuk membuat akun layanan Google per komponen:

    Produksi

    Untuk lingkungan non-produksi:

    $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

    Perintah ini akan membuat akun layanan berikut:

    • apigee-cassandra
    • apigee-logger
    • apigee-mart
    • apigee-metrics
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    • apigee-watcher

    Non-produksi

    Untuk lingkungan non-produksi:

    $APIGEECTL_HOME/tools/create-service-account --env non-prod --dir $APIGEECTL_HOME/../service-accounts

    Perintah ini akan membuat satu akun layanan, apigee-non-prod, dengan semua peran yang ditetapkan yang diperlukan untuk mengelola semua komponen Apigee.

    gcloud

    Buat akun layanan berikut dan tetapkan perannya.

    1. Akun layanan: apigee-cassandra, peran: roles/storage.objectAdmin

      Buat akun:

      gcloud iam service-accounts create apigee-cassandra \
        --display-name="apigee-cassandra" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
                  
    2. Akun layanan: apigee-logger, peran: roles/logging.logWriter

      Buat akun:

      gcloud iam service-accounts create apigee-logger \
        --display-name="apigee-logger" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-logger@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/logging.logWriter"
                  
    3. Akun layanan: apigee-mart, peran: roles/apigeeconnect.Agent

      Buat akun:

      gcloud iam service-accounts create apigee-mart \
        --display-name="apigee-mart" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-mart@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigeeconnect.Agent"
                  
    4. Akun layanan: apigee-metrics, peran: roles/monitoring.metricWriter

      Buat akun:

      gcloud iam service-accounts create apigee-metrics \
        --display-name="apigee-metrics" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
                  
    5. Akun layanan: apigee-runtime, peran: Tidak ada peran yang ditetapkan.

      Buat akun:

      gcloud iam service-accounts create apigee-runtime \
        --display-name="apigee-runtime" \
        --project $PROJECT_ID
                  
    6. Akun layanan: apigee-synchronizer, peran: roles/apigee.synchronizerManager

      Buat akun:

      gcloud iam service-accounts create apigee-synchronizer \
        --display-name="apigee-synchronizer" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.synchronizerManager"
                  
    7. Akun layanan: apigee-udca, peran: roles/apigee.analyticsAgent

      Buat akun:

      gcloud iam service-accounts create apigee-udca \
        --display-name="apigee-udca" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-udca@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.analyticsAgent"
                  
    8. Akun layanan: apigee-watcher, peran: roles/apigee.runtimeAgent

      Buat akun:

      gcloud iam service-accounts create apigee-watcher \
        --display-name="apigee-watcher" \
        --project $PROJECT_ID
                  

      Tetapkan peran:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.runtimeAgent"
                  

Tetapkan workloadIdentityEnabled: true dan buat akun layanan

apigeectl membuat akun layanan Kubernetes untuk setiap komponen hybrid Apigee saat Anda menetapkan workloadIdentityEnabled: true dalam file penggantian dan menerapkan perubahannya.

  1. Tambahkan baris tebal di bawah ke file overrides.yaml Anda di bawah stanza gcp. Hal ini mengaktifkan Workload Identity untuk penginstalan Anda dan memicu apigeectl untuk membuat akun layanan Kubernetes saat Anda menerapkan konfigurasi:
    gcp:
      projectID: "my-project-id"
      name: "my-project-id"
      region: "analytics-region"
      workloadIdentityEnabled: true
  2. Tambahkan baris tebal di bawah ke file overrides.yaml Anda di bawah stanza cassandra. Tindakan ini memicu pembuatan akun layanan Kubernetes apigee-cassandra-backup:
    cassandra:
      ...
      backup:
        enabled: true
  3. Terapkan perubahan dengan apigeectl dengan flag --restore:
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
  4. Verifikasi akun layanan dengan perintah berikut:
    kubectl get sa -n $NAMESPACE

    Output Anda akan terlihat seperti berikut. Akun layanan Kubernetes dalam format tebal adalah akun yang perlu diberi anotasi dengan akun layanan Google Anda:

    NAME                                                         SECRETS   AGE
    apigee-cassandra-backup                                      1         11m
    apigee-cassandra-restore                                     1         11m
    apigee-cassandra-schema-setup-my-project-id-123abcd-sa       1         11m
    apigee-cassandra-schema-val-my-project-id-123abcd            1         11m
    apigee-cassandra-user-setup-my-project-id-123abcd-sa         1         11m
    apigee-connect-agent-my-project-id-123abcd-sa                1         11m
    apigee-datastore-default-sa                                  1         11m
    apigee-ingressgateway                                        1         11m
    apigee-ingressgateway-my-project-id-123abcd                  1         11m
    apigee-ingressgateway-manager                                1         11m
    apigee-init                                                  1         11m
    apigee-mart-my-project-id-123abcd-sa                         1         11m
    apigee-metrics-sa                                            1         11m
    apigee-mint-task-scheduler-my-project-id-123abcd-sa          1         11m
    apigee-redis-default-sa                                      1         11m
    apigee-redis-envoy-default-sa                                1         11m
    apigee-runtime-my-project-id-env-name-234bcde-sa             1         11m
    apigee-synchronizer-my-project-id-env-name-234bcde-sa        1         11m
    apigee-udca-my-project-id-123abcd-sa                         1         11m
    apigee-udca-my-project-id-env-name-234bcde-sa                1         11m
    apigee-watcher-my-project-id-123abcd-sa                      1         11m
    default                                                      1         11m
        

Menganotasi akun layanan Kubernetes dengan akun layanan Google

Untuk setiap komponen Apigee, anotasikan akun layanan Kubernetes yang terkait dengan akun layanan Google untuk komponen tersebut.

Komponen tingkat org

Anda hanya akan memiliki satu instance dari setiap akun layanan Kubernetes untuk org Apigee Anda.

Komponen Akun Layanan Kubernetes Akun Layanan Google
Cassandra apigee-cassandra-backup apigee-cassandra
apigee-cassandra-restore apigee-cassandra
apigee-cassandra-schema-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-cassandra-schema-val-my-project-id-num-id1 apigee-cassandra
apigee-cassandra-user-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-datastore-default-sa apigee-cassandra
Apigee Connect apigee-connect-agent-my-project-id-num-id1-sa apigee-mart
MART apigee-mart-my-project-id-num-id1-sa apigee-mart
Metrik apigee-metrics-sa apigee-metrics
UDCA (tingkat org) apigee-udca-my-project-id-num-id1-sa apigee-udca
Pengamat apigee-watcher-my-project-id-num-id1-sa apigee-watcher

Komponen tingkat Env

Anda akan memiliki satu instance dari setiap akun layanan Kubernetes untuk setiap lingkungan Apigee.

Komponen Akun Layanan Kubernetes Akun Layanan Google
Runtime Apigee apigee-runtime-my-project-id-env-name-num-id2-sa apigee-runtime
Sinkronisasi apigee-synchronizer-my-project-id-env-name-num-id2-sa apigee-synchronizer
UDCA (tingkat lingkungan) apigee-udca-my-project-id-env-name-num-id2-sa apigee-udca

Dalam perintah berikut, gunakan nama akun layanan Kubernetes yang ditampilkan oleh perintah kubectl get sa -n $NAMESPACE, misalnya: apigee-cassandra-schema-val-hybrid-example-project-123abcd.

Dalam prosedur ini, untuk setiap akun layanan Kubernetes, Anda akan:

  • Ikat akun layanan Kubernetes dan akun layanan Google utama ke peran IAM roles/iam.workloadIdentityUser.
  • Anotasikan akun layanan Kubernetes dengan akun layanan Google.
  1. Ikat peran dan anotasikan akun layanan.

    Komponen tingkat org

    Menganotasi akun layanan Kubernetes untuk komponen tingkat organisasi. Anda harus melakukan ini sekali untuk setiap komponen di organisasi Apigee Anda.

    • Cassandra

      Komponen Cassandra memiliki enam akun layanan Kubernetes terkait:

      • apigee-cassandra-backup
      • apigee-cassandra-restore
      • apigee-cassandra-schema-setup
      • apigee-cassandra-schema-val (val = validasi)
      • apigee-cassandra-user-setup
      • apigee-datastore-default

      Produksi

      apigee-cassandra-backup

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:
        GSA_NAME="apigee-cassandra"
        KSA_NAME="apigee-cassandra-backup"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-restore"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"

        Ikat peran IAM:

        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      2. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-datastore-default-sa"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      apigee-cassandra-backup

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:
        GSA_NAME="apigee-non-prod"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-restore"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. Tentukan ulang variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-datastore-default-sa"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • MART

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-mart-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Metrik Apigee

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-metrics"
        KSA_NAME="apigee-metrics-sa"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-metrics-sa"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (tingkat org)

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. Ikat peran IAM:
          gcloud iam service-accounts add-iam-policy-binding \
            --role roles/iam.workloadIdentityUser \
            --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
            $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Watcher

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-watcher-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

    Untuk setiap lingkungan:

    • Runtime

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-runtime-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Penyinkron

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-synchronizer-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (tingkat lingkungan)

      Produksi

      1. Tentukan variabel lingkungan KSA_NAME dan GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-produksi

      1. Tentukan variabel lingkungan KSA_NAME:

        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. Ikat peran IAM:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anotasikan akun layanan:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
  2. Validasi apakah langkah-langkah tersebut berhasil:
    gcloud config set project $PROJECT_ID
    

    Pilih akun layanan kubernetes yang akan diuji, misalnya: apigee-cassandra-backup.

    KSA_NAME="kubernetes-service-account-name"
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --namespace $NAMESPACE workload-identity-test\
      -- gcloud auth list

    Jika Anda tidak melihat command prompt, coba tekan Enter.

    Jika langkah-langkah tersebut dijalankan dengan benar, Anda akan melihat respons seperti berikut:

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
    
  3. Jika mengupgrade dari penginstalan sebelumnya, bersihkan rahasia yang berisi kunci pribadi akun layanan:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  4. Periksa log:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    

Mengupgrade penginstalan untuk menggunakan Workload Identity

Ikuti petunjuk ini untuk menambahkan Workload Identity ke penginstalan hybrid yang sudah ada.

Berikut contoh yang menampilkan Akun Layanan Google (GSA) yang dibuat untuk Apigee:

gcloud iam service-accounts list --filter "apigee"
DISPLAY NAME       EMAIL                                                  DISABLED
apigee-cassandra   apigee-cassandra@PROJECT_ID.iam.gserviceaccount.com    False
apigee-connect     apigee-connect@PROJECT_ID.iam.gserviceaccount.com      False
apigee-runtime     apigee-runtime@PROJECT_ID.iam.gserviceaccount.com      False
apigee-metrics     apigee-metrics@PROJECT_ID.iam.gserviceaccount.com      False
apigee-mart        apigee-mart@PROJECT_ID.iam.gserviceaccount.com         False
apigee-watcher     apigee-watcher@PROJECT_ID.iam.gserviceaccount.com      False
apigee-sync        apigee-sync@PROJECT_ID.iam.gserviceaccount.com         False
apigee-udca        apigee-udca@$PROJECT_ID.iam.gserviceaccount.com        False

Berikut adalah contoh akun layanan Kubernetes (KSA) yang dibuat untuk Apigee:

kubectl get sa -n $NAMESPACE
apigee-cassandra-schema-setup-ORG_NAME-cb84b88-sa             1         xxd
apigee-cassandra-user-setup-ORG_NAME-cb84b88-sa               1         xxd
apigee-connect-agent-ORG_NAME-cb84b88-sa                      1         xxd
apigee-init                                                   1         xxd
apigee-mart-ORG_NAME-cb84b88-sa                               1         xxd
apigee-metrics-apigee-telemetry                               1         xxd
apigee-runtime-ORG_NAME-ENV_NAME-1d0dc5e-sa                   1         xxd
apigee-synchronizer-ORG_NAME-ENV_NAME-1d0dc5e-sa              1         xxd
apigee-udca-ORG_NAME-ENV_NAME-1d0dc5e-sa                      1         xxd
apigee-watcher-ORG_NAME-cb84b88                               1         xxd
  1. Tambahkan peran Workload Identity ke setiap akun layanan:
    gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
      GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    Misalnya, jika Anda menyetel izin untuk Apigee Synchronizer, Anda akan menjalankan:

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$PROJECT_ID.svc.id.goog[apigee/$KSA_NAME]" apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  2. Anotasikan setiap KSA dengan detail GSA:
    kubectl annotate serviceaccount \
      --namespace $NAMESPACE \
      $KSA_NAME \
      iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    Misalnya, jika Anda menyetel izin untuk Apigee Synchronizer, Anda akan menjalankan:

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    kubectl annotate serviceaccount --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Validasi apakah langkah-langkah tersebut berhasil:
    gcloud config set project $PROJECT_ID
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --namespace $NAMESPACE workload-identity-test\
      -- gcloud auth list

    Jika Anda tidak melihat command prompt, coba tekan Enter.

    Jika langkah-langkah tersebut dijalankan dengan benar, Anda akan melihat respons seperti berikut:

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
    
  4. Jika mengupgrade dari penginstalan sebelumnya, bersihkan rahasia yang berisi kunci pribadi akun layanan:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  5. Periksa log:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer