Menggunakan Workload Identity fleet

Aplikasi sering kali perlu melakukan autentikasi (memberikan identitas yang autentik) saat terhubung ke layanan lain. Misalnya, aplikasi Anda harus mengautentikasi untuk menggunakan Google Cloud API seperti Compute Engine API atau AI Platform API. Halaman ini menjelaskan cara menggunakan Workload Identity fleet, yaitu cara yang direkomendasikan dan paling mudah bagi workload aplikasi yang dihosting di fleet untuk melakukan autentikasi ke API dan layanan Google Cloud.

Apa itu Workload Identity fleet?

Fleet Workload Identity memperluas fungsi yang disediakan di GKE Workload Identity, yang memungkinkan beban kerja di cluster Anda mengautentikasi ke Google tanpa mengharuskan Anda mendownload, merotasi secara manual, dan mengelola kunci akun layanan Google Cloud secara umum. Sebagai gantinya, beban kerja akan mengautentikasi menggunakan token berumur pendek yang dihasilkan oleh cluster. Semua cluster dengan GKE Workload Identity yang aktif menggunakan kumpulan identitas workload project mereka saat menerbitkan ID, sehingga Identity and Access Management dapat memercayai dan memahami kredensial akun layanan Kubernetes. Anda dapat mempelajari Workload Identity GKE lebih lanjut di artikel Menggunakan Workload Identity.

Dengan fleet, cluster yang terdaftar bisa mendapatkan manfaat tambahan dari penggunaan fleet Workload Identity. Cluster yang terdaftar dengan Workload Identity yang diaktifkan pada keanggotaan fleet-nya dapat menggunakan kumpulan identitas workload di seluruh fleet, sehingga mempermudah penyiapan autentikasi ke Google API serta layanan lainnya di seluruh fleet Anda dan di beberapa project. Fleet Workload Identity juga dapat digunakan oleh Connect Agent pada beberapa jenis cluster untuk melakukan autentikasi ke Google sebagai bagian dari keanggotaan fleet, dan diperlukan untuk menggunakan beberapa fitur GKE Enterprise yang berfungsi di seluruh project, seperti Cloud Service Mesh.

Cara kerjanya

Armada menggunakan federasi workload identitas untuk memberikan identitas gabungan yang berbeda kepada setiap aplikasi, yang dapat digunakan untuk melakukan autentikasi ke Google Cloud dan layanan lain yang Anda kembangkan. Aplikasi yang berjalan di fleet menerima identitas workload gabungan dalam format berikut:

serviceAccount:FLEET_PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]

Dengan keterangan:

  • FLEET_PROJECT_ID.svc.id.goog adalah representasi singkat dari kumpulan identitas beban kerja untuk fleet Anda. Hanya ada satu kumpulan workload identity tetap per fleet dan itu dibuat otomatis untuk Anda.
  • K8S_NAMESPACE adalah namespace Kubernetes tempat akun layanan Kubernetes ditentukan.
  • KSA_NAME adalah nama akun layanan Kubernetes yang dilampirkan ke aplikasi.

Semua aplikasi yang dihosting di fleet memiliki kumpulan identitas beban kerja yang sama, sehingga aplikasi dengan identitas gabungan yang memisahkan tempat setiap aplikasi dihosting. Hal ini memungkinkan aplikasi dari suatu fleet untuk mengakses resource (seperti Google Cloud API) sekali saja, bukan ke cluster demi cluster, meskipun aplikasi di-deploy di berbagai project Google Cloud atau di cloud yang berbeda. Seperti fitur yang didukung fleet lainnya, fitur ini bergantung pada prinsip fleet kesamaan, di mana objek Kubernetes dengan nama yang sama di cluster yang berbeda diperlakukan sebagai hal yang sama. Jadi, misalnya, jika memiliki aplikasi dengan backend yang di-deploy di beberapa cluster dalam fleet yang sama, dan yang perlu melakukan autentikasi ke Google API, Anda dapat dengan mudah mengonfigurasi aplikasi sehingga semua layanan di namespace "backend" dapat mengakses API tersebut. Anda dapat membaca lebih lanjut tentang cara fleet menggunakan kesamaan, termasuk kesamaan identitas, di Cara kerja fleet.

Cluster di luar Google Cloud juga dapat menggunakan fleet Workload Identity untuk memberikan identitas bagi Agen Connect agar dapat melakukan autentikasi ke Google. Anda dapat mengetahui lebih lanjut jenis cluster mana yang menggunakan Workload Identity fleet di bagian penyiapan cluster di bawah.

Sebelum memulai

  • Pastikan Anda telah menginstal alat command line berikut:

    • Versi terbaru Google Cloud CLI, yang mencakup gcloud, alat command line untuk berinteraksi dengan Google Cloud.
    • kubectl

    Jika Anda menggunakan Cloud Shell sebagai lingkungan shell untuk berinteraksi dengan Google Cloud, alat ini akan diinstal untuk Anda.

  • Pastikan Anda telah melakukan inisialisasi gcloud CLI untuk digunakan dengan project Anda.

Penyiapan cluster

Sebelum aplikasi di fleet Anda dapat menerima workload identity, cluster tempatnya dijalankan harus didaftarkan ke fleet Anda dan dikonfigurasi dengan benar agar dapat menggunakan Workload Identity fleet. Cara melakukannya bergantung pada jenis cluster. Sebagian besar cluster GKE di luar Google Cloud didaftarkan secara otomatis ke fleet project Anda saat Anda membuatnya. Cluster GKE di Google Cloud dan cluster yang terpasang harus didaftarkan secara manual.

Lihat dokumentasi setiap jenis cluster untuk mengetahui informasi selengkapnya tentang konfigurasi cluster.

GKE

  1. Aktifkan GKE Workload Identity di cluster Google Kubernetes Engine Anda jika belum diaktifkan.
  2. Ikuti petunjuk untuk mendaftarkan cluster menggunakan Workload Identity.

Cluster GKE di luar Google Cloud

Cluster lokal di VMware dan on bare metal, serta cluster GKE multicloud (baik di AWS dan Azure) secara otomatis terdaftar ke fleet project Anda pada saat pembuatan cluster. Semua jenis cluster ini secara otomatis mengaktifkan fleet Workload Identity saat terdaftar.

Cluster terpasang

Cluster EKS dan AKS terlampir yang terdaftar menggunakan GKE Multi-Cloud API terdaftar dengan Workload Identity fleet yang diaktifkan secara default. Cluster terlampir lainnya dapat didaftarkan dengan fleet Workload Identity aktif jika memenuhi persyaratan yang diperlukan. Ikuti petunjuk untuk jenis cluster Anda di bagian Mendaftarkan cluster.

Menggunakan Workload Identity fleet

Setelah Anda mendaftarkan cluster, workload yang di-deploy di cluster dapat menggunakan identitas workload dari kumpulan identitas workload fleet. Bagian ini menunjukkan cara menggunakan workload identity untuk meniru identitas akun layanan Google Cloud sehingga workload Anda dapat mengakses Google Cloud API. Bertindak sebagai akun layanan adalah kasus penggunaan umum untuk identitas gabungan, karena memungkinkan beban kerja Anda mengautentikasi ke Google Cloud API mana pun yang dapat diakses oleh akun layanan, sehingga menghilangkan beban pemeliharaan dan keamanan karena harus mengelola kunci akun layanan untuk setiap beban kerja.

Meniru identitas akun layanan

Bagian ini menunjukkan cara mengonfigurasi identitas workload gabungan aplikasi untuk meniru identitas akun layanan dengan memberikan file kredensial default aplikasi di ConfigMap, termasuk membuat dan mengonfigurasi akun layanan dengan izin yang relevan.

Contoh ini menggunakan nilai placeholder berikut:

  • WORKLOAD_IDENTITY_POOL adalah kumpulan identitas workload yang terkait dengan fleet Anda. Seperti yang ditunjukkan di atas, nilai WORKLOAD_IDENTITY_POOL adalah FLEET_PROJECT_ID.svc.id.goog.
  • IDENTITY_PROVIDER adalah nama penyedia identitas yang terkait dengan cluster Kubernetes Anda.
  • K8S_NAMESPACE adalah namespace Kubernetes tempat akun layanan Kubernetes ditentukan.
  • KSA_NAME adalah nama akun layanan Kubernetes yang dilampirkan ke aplikasi.
  • GSA_NAME adalah nama akun layanan Google yang akan digunakan aplikasi Anda.
  • GSA_PROJECT_ID adalah project ID tempat akun layanan Google ditentukan.

Untuk mengonfigurasi identitas workload fleet agar meniru identitas akun layanan:

  1. Pastikan cluster Anda terdaftar ke fleet dengan mengikuti langkah-langkah di bagian Penyiapan cluster di atas.

  2. Dapatkan nilai WORKLOAD_IDENTITY_POOL dan IDENTITY_PROVIDER untuk cluster terdaftar Anda dengan mengambil detail keanggotaan fleet cluster, menggunakan perintah berikut. Ganti MEMBERSHIP dengan nama keanggotaan unik cluster Anda di fleet:

    gcloud container fleet memberships describe MEMBERSHIP
    

    Output dari penjelasan keanggotaan akan terlihat seperti ini (beberapa kolom telah dihilangkan agar lebih jelas):

    authority:
     identityProvider: IDENTITY_PROVIDER
     workloadIdentityPool: WORKLOAD_IDENTITY_POOL
    name: projects/FLEET_PROJECT_ID/locations/global/memberships/MEMBERSHIP
    
  3. Buat akun layanan Google Cloud yang dapat ditiru identitas aplikasi Anda saat melakukan autentikasi ke Google, jika Anda belum memilikinya:

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

    Akun layanan tidak harus ada dalam project host fleet Anda. Anda dapat menggunakan akun layanan Google Cloud apa pun di organisasi Anda. Anda dapat mengetahui lebih lanjut tentang akun layanan dan cara kerjanya di Akun layanan.

  4. Pastikan Anda telah memberi akun layanan izin apa pun yang diperlukan untuk mengakses Google Cloud API dengan menambahkan binding kebijakan IAM yang diperlukan. Anda dapat melakukannya dengan menggunakan gcloud iam service-accounts add-iam-policy-binding, atau metode lain jika diinginkan. Anda dapat mencari tahu izin yang diperlukan untuk menggunakan Google Cloud API dalam dokumentasi setiap layanan, dan melihat daftar lengkap peran bawaan dengan izin yang diperlukan dalam Memahami peran.

  5. Izinkan identitas workload aplikasi Anda untuk meniru identitas akun layanan dengan membuat binding kebijakan IAM, sebagai berikut. Dengan binding ini, identitas workload gabungan aplikasi Anda dapat bertindak sebagai akun layanan Google Cloud.

    gcloud iam service-accounts add-iam-policy-binding \
      GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/iam.workloadIdentityUser \
      --member="serviceAccount:WORKLOAD_IDENTITY_POOL[K8S_NAMESPACE/KSA_NAME]"
    

    Kolom --member adalah representasi IAM dari identitas workload gabungan aplikasi Anda.

  6. Buat ConfigMap yang berisi file kredensial default aplikasi untuk beban kerja Anda. File ini memberi tahu cara mengautentikasi ke Google oleh library klien yang dikompilasi ke dalam beban kerja Anda. File kredensial default aplikasi berisi kumpulan workload identity dan informasi akun layanan yang relevan, serta jalur ke token yang diproyeksikan yang akan dipasang di sistem file container Anda di langkah berikutnya. GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com adalah alamat email akun layanan untuk ditiru identitasnya.

    Konfigurasi ini sendiri tidak memberikan akses untuk meniru akun layanan. Jika binding IAM tidak ada juga, Pod tidak akan dapat menggunakan akun layanan.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      namespace: K8S_NAMESPACE
      name: my-cloudsdk-config
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@GSA_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"
          }
        }
    
  7. Ikuti contoh di bawah untuk mengonfigurasi beban kerja Anda. Perhatikan bahwa ConfigMap dari langkah sebelumnya dipasang di sistem file container sebagai google-application-credentials.json, bersama file token akun layanan yang diproyeksikan di /var/run/secrets/tokens/gcp-ksa. Token yang diproyeksikan dikeluarkan oleh Kubernetes dan merepresentasikan identitas workload di dalam cluster. Token ini otomatis dipertukarkan dengan Google oleh Library Klien Cloud untuk mendapatkan token yang dapat diautentikasi dengan Google API. Kolom audience di token yang diproyeksikan harus ditetapkan ke nilai WORKLOAD_IDENTITY_POOL.

    kind: Namespace
    apiVersion: v1
    metadata:
      name:  K8S_NAMESPACE
    ---
    kind: ServiceAccount
    apiVersion: v1
    metadata:
      namespace:  K8S_NAMESPACE
      name: KSA_NAME
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace:  K8S_NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: my-container
        image: my-image
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: WORKLOAD_IDENTITY_POOL
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
                - key: "config"
                  path: "google-application-credentials.json"
    
    

Melakukan autentikasi dari kode

Library Klien Cloud secara otomatis menangani autentikasi ke Google Cloud saat Anda menggunakannya untuk mengakses layanan Google dari kode Anda. Untuk menggunakan penyiapan yang ditunjukkan di atas di aplikasi, Anda harus menggunakan Library Klien Cloud yang mendukung Workload Identity Federation. Berikut adalah versi minimum Library Klien Cloud yang diperlukan, serta petunjuk cara memeriksa versi Anda saat ini:

C++

Sebagian besar Library Klien Google Cloud untuk C++ mendukung penggabungan identitas menggunakan objek ChannelCredentials, yang dibuat dengan memanggil grpc::GoogleDefaultCredentials(). Untuk melakukan inisialisasi kredensial ini, Anda harus membangun library klien dengan gRPC versi 1.36.0 atau yang lebih baru.

Library Klien Cloud Storage untuk C++ menggunakan REST API, bukan gRPC, sehingga tidak mendukung penggabungan identitas.

Go

Library klien untuk Go mendukung penggabungan identitas jika menggunakan modul golang.org/x/oauth2 versi v0.0.0-20210218202405-ba52d332ba99 atau versi lebih baru.

Untuk memeriksa versi modul yang digunakan library klien Anda, jalankan perintah berikut:

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

Library klien untuk Java mendukung penggabungan identitas jika menggunakan artefak com.google.auth:google-auth-library-oauth2-http versi 0.24.0 atau versi lebih baru.

Untuk memeriksa versi artefak yang digunakan library klien Anda, jalankan perintah Maven berikut di direktori aplikasi Anda:

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

Library klien untuk Node.js mendukung penggabungan identitas jika menggunakan paket google-auth-library versi 7.0.2 atau yang lebih baru.

Untuk memeriksa versi paket yang digunakan library klien Anda, jalankan perintah berikut di direktori aplikasi Anda:

npm list google-auth-library

Saat membuat objek GoogleAuth, Anda dapat menentukan project ID atau mengizinkan GoogleAuth untuk otomatis menemukan project ID. Untuk otomatis menemukan project ID, akun layanan dalam file konfigurasi harus memiliki peran Browser (roles/browser), atau peran dengan izin yang setara, di project Anda. Untuk mengetahui detailnya, lihat README untuk paket google-auth-library.

Python

Library klien untuk Python mendukung penggabungan identitas jika menggunakan paket google-auth versi 1.27.0 atau versi lebih baru.

Untuk memeriksa versi paket yang digunakan library klien Anda, jalankan perintah berikut di lingkungan tempat paket diinstal:

pip show google-auth

Untuk menentukan project ID bagi klien autentikasi, Anda dapat menetapkan variabel lingkungan GOOGLE_CLOUD_PROJECT atau mengizinkan klien untuk otomatis menemukan project ID. Untuk otomatis menemukan project ID, akun layanan dalam file konfigurasi harus memiliki peran Browser (roles/browser), atau peran dengan izin yang setara, di project Anda. Untuk mengetahui detailnya, lihat panduan pengguna untuk paket google-auth.