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.
- Versi terbaru Google Cloud CLI, yang mencakup
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
- Aktifkan GKE Workload Identity di cluster Google Kubernetes Engine Anda jika belum diaktifkan.
- 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:
Pastikan cluster Anda terdaftar ke fleet dengan mengikuti langkah-langkah di bagian Penyiapan cluster di atas.
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
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.
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.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.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" } }
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. Kolomaudience
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
.