Menggunakan Workload Identity fleet

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

Apa itu Workload Identity fleet?

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

Dengan fleet, cluster terdaftar bisa mendapatkan manfaat tambahan dari penggunaan Workload Identity fleet. Cluster terdaftar dengan Workload Identity yang diaktifkan pada keanggotaan fleet-nya dapat menggunakan kumpulan identitas workload fleet 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 Anthos Service Mesh.

Cara kerjanya

Fleet menggunakan federasi identitas workload untuk memberi setiap aplikasi identitas gabungan yang berbeda, yang dapat digunakan untuk melakukan autentikasi ke Google Cloud dan layanan lain yang Anda kembangkan. Aplikasi yang berjalan dalam 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 workload untuk fleet Anda. Hanya ada satu kumpulan workload tetap per fleet yang 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 workload yang sama, sehingga aplikasi memiliki identitas gabungan yang memisahkan tempat setiap aplikasi dihosting. Hal ini memungkinkan untuk memberi aplikasi dalam suatu fleet akses ke resource (seperti Google Cloud API) hanya sekali, bukan membuat cluster per cluster, meskipun aplikasi tersebut di-deploy di berbagai project Google Cloud atau di berbagai cloud. Seperti fitur berkemampuan fleet lainnya, hal ini bergantung pada prinsip fleet kesamaan, di mana objek Kubernetes dengan nama yang sama di cluster berbeda diperlakukan sebagai hal yang sama. Jadi, misalnya, jika Anda memiliki aplikasi dengan backend yang di-deploy di beberapa cluster pada fleet yang sama, dan yang perlu diautentikasi ke Google API, Anda dapat mengonfigurasi aplikasi dengan mudah sehingga semua layanan di namespace "backend" dapat mengakses API tersebut. Anda dapat membaca selengkapnya tentang cara armada menggunakan kesamaan, termasuk kesamaan identitas, dalam Cara kerja armada.

Cluster di luar Google Cloud juga dapat menggunakan Workload Identity fleet untuk memberikan identitas bagi Agen Connect agar dapat diautentikasi 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 diinstal untuk Anda.

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

Penyiapan cluster

Sebelum aplikasi dalam fleet Anda dapat menerima identitas workload, cluster yang dijalankan harus didaftarkan ke fleet Anda dan dikonfigurasi dengan benar untuk 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 membuatnya. Cluster GKE di Google Cloud dan cluster yang terpasang harus didaftarkan secara manual.

Baca 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

GKE di VMware, GKE di Bare Metal, dan cluster GKE multicloud (baik di AWS maupun Azure) secara otomatis terdaftar ke fleet project Anda pada saat pembuatan cluster. Mulai GKE Enterprise 1.8, semua jenis cluster ini otomatis mengaktifkan Workload Identity fleet saat terdaftar. Cluster terdaftar yang ada akan diupdate untuk menggunakan Workload Identity ketika diupgrade ke GKE Enterprise 1.8 atau lebih tinggi.

Cluster terlampir

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

Menggunakan Workload Identity fleet

Setelah cluster didaftarkan, beban kerja yang di-deploy di cluster dapat menggunakan identitas beban kerja dari kumpulan workload identity fleet. Bagian ini menunjukkan cara menggunakan Workload Identity untuk meniru identitas akun layanan Google Cloud sehingga beban kerja 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 apa pun yang dapat diakses 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 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 tempat aplikasi Anda akan bertindak.
  • GSA_PROJECT_ID adalah project ID tempat akun layanan Google ditentukan.

Untuk mengonfigurasi identitas workload fleet agar meniru 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 Anda yang terdaftar 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 untuk mendeskripsikan keanggotaan 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 oleh 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 perlu ada dalam project host fleet Anda. Anda dapat menggunakan akun layanan Google Cloud apa pun di organisasi Anda. Anda dapat mengetahui lebih lanjut akun layanan dan cara kerjanya di Akun layanan.

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

  5. Otorisasi identitas workload aplikasi Anda untuk meniru akun layanan dengan membuat binding kebijakan IAM, sebagai berikut. Dengan binding ini, identitas workload gabungan aplikasi Anda dapat berfungsi 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 library klien yang dikompilasi ke dalam beban kerja Anda cara melakukan autentikasi ke Google. 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 pada langkah berikutnya. GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com adalah alamat email akun layanan yang akan ditiru.

    Konfigurasi ini sendiri tidak memberikan akses untuk meniru identitas akun layanan. Jika binding IAM juga tidak ada, 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. Perlu diperhatikan, 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 diterbitkan oleh Kubernetes dan mewakili identitas beban kerja di dalam cluster. Token ini secara otomatis ditukarkan dengan Google oleh Library Klien Cloud untuk mendapatkan token yang dapat diautentikasi dengan Google API. Kolom audience dari 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 Anda

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, Anda harus menggunakan Library Klien Cloud yang mendukung Workload Identity Federation. Berikut ini 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.