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.
- Versi terbaru Google Cloud CLI, yang mencakup
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
- 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
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:
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 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
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.
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.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.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" } }
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. Kolomaudience
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
.