Halaman ini menunjukkan cara mengonfigurasi aplikasi Anda untuk melakukan autentikasi ke Google Cloud API seperti Compute Engine API atau AI Platform API dari kumpulan instance yang memiliki model kepercayaan campuran di seluruh kumpulan instance. Jika armada Anda memiliki model kepercayaan bersama di seluruh armada, lihat Mengautentikasi ke Google Cloud API dari beban kerja armada kepercayaan bersama.
Halaman ini ditujukan untuk admin dan operator Platform serta Engineer keamanan yang ingin mengautentikasi secara terprogram dari workload fleet ke API Google Cloud. Untuk mempelajari lebih lanjut peran pengguna dan contoh tugas yang kami referensikan dalam dokumentasi, lihat Peran dan tugas pengguna umum GKE Enterprise. Google Cloud
Sebelum membaca halaman ini, pastikan Anda memahami konsep berikut:
- Tentang Workload Identity Federation armada
- ConfigMaps Kubernetes
- Kebijakan izin Identity and Access Management (IAM)
- Cakupan tim dan namespace armada
Tentang Workload Identity Federation armada untuk lingkungan dengan tingkat kepercayaan campuran
Dengan Fleet Workload Identity Federation, Anda dapat memberikan peran IAM diGoogle Cloud API dan resource kepada entitas di fleet Anda, seperti workload di namespace tertentu. Secara default, project host fleet Anda menggunakan workload identity pool yang dikelola Google untuk menyediakan identitas bagi entitas di seluruh fleet. Namun, di lingkungan dengan kepercayaan campuran seperti fleet multi-tenant atau di project host fleet yang menjalankan cluster mandiri, sebaiknya Anda mengonfigurasi workload identity pool yang dikelola sendiri terpisah untuk sebagian workload dan cluster Anda.
Entitas yang menggunakan workload identity pool yang dikelola sendiri memiliki ID yang berbeda dalam kebijakan IAM dibandingkan dengan entitas yang menggunakan workload identity pool yang dikelola Google dari project host armada. Hal ini memastikan bahwa pemberian akses ke akun utama di namespace armada tertentu tidak secara tidak sengaja memberikan akses ke akun utama lain yang cocok dengan ID.
Workload identity pool yang dikelola sendiri mengharuskan Anda menggunakan cakupan tim. Cakupan tim memungkinkan Anda mengontrol akses ke subset resource fleet per tim. Anda mengikat cakupan tim tertentu ke cluster anggota fleet tertentu untuk mengizinkan tim tersebut men-deploy beban kerja di cluster tersebut. Dalam cakupan tim, anggota tim hanya dapat men-deploy workload ke namespace fleet.
Menggunakan workload identity pool yang dikelola sendiri untuk menyediakan identitas bagi workload cakupan tim memiliki manfaat seperti berikut:
- Pastikan pemberian akses ke entitas di namespace fleet tidak secara tidak sengaja berlaku untuk entitas di namespace atau cluster lain.
- Konfigurasi sekumpulan cluster fleet untuk mendapatkan identitas dari pool yang dikelola sendiri dengan mengikatnya ke cakupan tim dan menyiapkan pool yang dikelola sendiri sebagai penyedia identitas di cluster tersebut.
- Konfigurasi subset cluster terikat cakupan tim untuk mendapatkan identitas dari pool yang dikelola sendiri dengan hanya menyiapkan pool yang dikelola sendiri sebagai penyedia identitas di cluster tertentu.
Contoh kesamaan identitas dalam lingkungan dengan tingkat kepercayaan campuran
Pertimbangkan skenario berikut:
- Anda memiliki dua cluster anggota fleet:
frontend-cluster
danfinance-cluster
. - Anda belum mengonfigurasi workload identity pool yang dikelola sendiri.
- Anda membuat cakupan tim
finance-team
dan namespace fleetfinance-ns
dalam cakupan tim. - Anda mengikat cluster
finance-cluster
ke cakupan timfinance-team
. - Anda memberikan peran IAM ke
finance-sa
Kubernetes ServiceAccount di namespace fleetfinance-ns
.
Workload yang memenuhi kriteria berikut berbagi identitas yang sama:
- Berjalan di namespace armada
finance-ns
. - Gunakan
finance-sa
ServiceAccount.
Namun, jika seseorang di cluster frontend-cluster
membuat namespace Kubernetes finance-ns
dan ServiceAccount finance-sa
, dia akan mendapatkan identitas yang sama dengan workload di cluster finance-cluster
. Hal ini karena seluruh fleet menggunakan workload identity pool yang dikelola Google dari project host fleet, dan karena ID utama tidak menentukan cluster host.
Pertimbangkan perubahan berikut pada skenario sebelumnya:
- Anda menyiapkan workload identity pool yang dikelola sendiri di fleet Anda.
- Anda mengonfigurasi cluster
finance-cluster
untuk mendapatkan identitas dari kumpulan yang dikelola sendiri, bukan dari kumpulan yang dikelola Google. - Anda membuat pemberian peran IAM yang menentukan pool yang dikelola sendiri dalam ID akun utama, bukan pool yang dikelola Google.
Workload yang berjalan di namespace armada finance-ns
di finance-cluster
kini mendapatkan identitas dari kumpulan yang dikelola sendiri. Namun, entitas di namespace Kubernetes finance-ns
dalam kluster frontend-cluster
akan terus mendapatkan identitas dari workload identity pool yang dikelola Google di project host fleet.
Perubahan ini menghasilkan manfaat berikut:
- Anda dapat memberikan peran secara eksplisit ke entitas di namespace armada
finance-ns
. - Entitas di cluster
frontend-cluster
tidak bisa mendapatkan akses yang sama karena identitas di clusterfrontend-cluster
berasal dari workload identity pool yang dikelola Google.
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 menginisialisasi gcloud CLI untuk digunakan dengan project Anda.
Persyaratan
Anda harus menggunakan fitur pengelolaan tim fleet seperti cakupan tim dan namespace fleet di fleet Anda. Petunjuk di halaman ini menunjukkan cara mengonfigurasi contoh cakupan tim dan namespace armada.
Menyiapkan cluster
Sebelum aplikasi di fleet Anda dapat menerima identitas gabungan, cluster tempat aplikasi berjalan harus didaftarkan ke fleet Anda dan dikonfigurasi dengan benar untuk menggunakan Workload Identity Federation fleet. Bagian berikut menjelaskan cara menyiapkan Workload Identity Federation armada untuk berbagai jenis cluster.
GKE
Untuk cluster GKE, lakukan hal berikut:
- Aktifkan Federasi Workload Identity untuk GKE di cluster Google Kubernetes Engine Anda, jika belum diaktifkan.
- Daftarkan cluster ke fleet.
Anda juga dapat mengaktifkan Workload Identity Federation untuk GKE selama proses pembuatan cluster dan pendaftaran fleet.
Cluster di luar Google Cloud
Jenis cluster berikut otomatis mengaktifkan Workload Identity Federation fleet dan didaftarkan ke fleet Anda selama pembuatan cluster:
- Google Distributed Cloud (khusus software) di VMware
- Google Distributed Cloud (khusus software) di bare metal
- GKE di AWS
- GKE di Azure
Cluster terpasang
Cluster terlampir EKS dan AKS yang didaftarkan menggunakan GKE Multi-Cloud API didaftarkan dengan Workload Identity Federation fleet yang diaktifkan secara default. Cluster terlampir lainnya dapat didaftarkan dengan Workload Identity Federation fleet yang diaktifkan jika memenuhi persyaratan yang diperlukan. Ikuti petunjuk untuk jenis cluster Anda di Mendaftarkan cluster.
Menyiapkan IAM workload identity pool
Di bagian ini, Anda membuat IAM workload identity pool baru di project host fleet dan memberikan akses agen layanan fleet ke pool baru.
Buat workload identity pool:
gcloud iam workload-identity-pools create POOL_NAME \ --location=global \ --project=POOL_HOST_PROJECT_ID \ --mode=TRUST_DOMAIN
Ganti kode berikut:
POOL_NAME
: nama workload identity pool baru.POOL_HOST_PROJECT_ID
: project ID dari project tempat Anda ingin membuat workload identity pool yang dikelola sendiri. Anda dapat menggunakan project Google Cloud apa pun, termasuk project host fleet Anda.
Berikan peran IAM Workload Identity Pool Admin (
roles/iam.workloadIdentityPoolAdmin
) di workload identity pool baru kepada agen layanan fleet:gcloud iam workload-identity-pools add-iam-policy-binding POOL_NAME \ --project=POOL_HOST_PROJECT_ID \ --location=global \ --member=serviceAccount:service-FLEET_HOST_PROJECT_NUMBER@gcp-sa-gkehub. \ --role=roles/iam.workloadIdentityPoolAdmin \ --condition=None
Ganti
FLEET_HOST_PROJECT_NUMBER
dengan nomor project untuk project host fleet.
Tambahkan kumpulan yang dikelola sendiri ke konfigurasi armada Anda
Di bagian ini, Anda akan mengaktifkan kumpulan yang dikelola sendiri dengan Workforce Identity Federation armada dan menambahkan kumpulan yang Anda buat ke konfigurasi armada. Bagian ini juga memberikan petunjuk untuk membuat cakupan tim baru dan namespace armada. Jika fleet Anda telah mengonfigurasi cakupan tim dan namespace fleet, lewati langkah-langkah tersebut.
Aktifkan Workload Identity Federation tingkat fleet:
gcloud beta container fleet workload-identity enable \ --project=FLEET_HOST_PROJECT_ID
Ganti
FLEET_HOST_PROJECT_ID
dengan project ID project host fleet Anda.Tambahkan workload identity pool yang dikelola sendiri ke konfigurasi armada:
gcloud beta container fleet workload-identity scope-tenancy-pool set POOL_NAME
Ganti POOL_NAME dengan nama kumpulan identitas beban kerja yang dikelola sendiri. Nilai ini memiliki sintaksis berikut:
POOL_NAME.global.POOL_HOST_PROJECT_NUMBER.workload.id.goog
Buat cakupan tim baru. Jika Anda memiliki cakupan tim dan namespace fleet yang sudah ada, lanjutkan ke bagian Verifikasi konfigurasi workload identity pool.
gcloud container fleet scopes create SCOPE_NAME
Ganti
SCOPE_NAME
dengan nama cakupan tim baru Anda.Buat namespace fleet baru dalam cakupan tim:
gcloud container fleet scopes namespaces create NAMESPACE_NAME \ --scope=SCOPE_NAME
Ganti
NAMESPACE_NAME
dengan nama namespace fleet baru Anda.Ikat cluster di fleet Anda ke cakupan tim:
gcloud container fleet memberships bindings create BINDING_NAME \ --membership=FLEET_CLUSTER_NAME \ --location=global \ --scope=SCOPE_NAME
Ganti kode berikut:
BINDING_NAME
: nama untuk binding keanggotaan baru Anda.FLEET_CLUSTER_NAME
: nama cluster fleet yang ada untuk diikat ke cakupan tim.
Memverifikasi konfigurasi workload identity pool
Di bagian ini, Anda akan memastikan bahwa konfigurasi workload identity pool yang dikelola sendiri berhasil.
Jelaskan konfigurasi keanggotaan fleet:
gcloud container fleet memberships describe FLEET_CLUSTER_NAME \ --location=global
Ganti
FLEET_CLUSTER_NAME
dengan nama cluster fleet yang ada dan terikat ke cakupan tim mana pun di fleet Anda.Outputnya mirip dengan hal berikut ini:
authority: ... scopeTenancyIdentityProvider: https://gkehub.googleapis.com/projects/FLEET_HOST_PROJECT_ID/locations/global/memberships/FLEET_CLUSTER_NAME scopeTenancyWorkloadIdentityPool: POOL_NAME.global.FLEET_HOST_PROJECT_NUMBER.workload.id.goog workloadIdentityPool: FLEET_HOST_PROJECT_ID.svc.id.goog ...
Output ini harus berisi kolom berikut:
scopeTenancyIdentityProvider
: penyedia identitas untuk beban kerja yang berjalan di namespace fleet dalam cakupan tim. Nilainya adalah ID resource untuk cluster Anda.scopeTenancyWorkloadIdentityPool
: workload identity pool yang digunakan oleh workload di namespace fleet dalam cakupan tim untuk mendapatkan ID. Nilainya adalah workload identity pool yang dikelola sendiri, dengan formatPOOL_NAME.global.FLEET_HOST_PROJECT_NUMBER.workload.id.goog
.workloadIdentityPool
: nama workload identity pool yang dikelola Google dari project host fleet, yang digunakan semua workload lain dalam fleet untuk mendapatkan identitas secara default.
Opsional: Periksa apakah workload identity pool Anda memiliki namespace yang memiliki nama yang sama dengan namespace fleet Anda:
gcloud iam workload-identity-pools namespaces list \ --workload-identity-pool=POOL_NAME \ --location=global
Outputnya mirip dengan hal berikut ini:
--- description: Fleet namespace NAMESPACE_NAME name: projects/FLEET_HOST_PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_NAME/namespaces/NAMESPACE_NAME state: ACTIVE
Fleet Anda kini dapat menggunakan workload identity pool yang dikelola sendiri untuk mendapatkan identitas bagi workload yang berjalan di namespace fleet. Untuk mulai menggunakan pool yang dikelola sendiri, konfigurasi cara cluster tertentu mendapatkan identitas, seperti yang dijelaskan di bagian berikutnya.
Membuat beban kerja menggunakan kumpulan yang dikelola sendiri untuk identitas
Agar workload menggunakan kumpulan yang dikelola sendiri, Anda mengonfigurasi namespace fleet tertentu di cluster anggota fleet menggunakan ConfigMap Kubernetes. Konfigurasi per-cluster, per-namespace ini memungkinkan Anda lebih mengurangi cakupan pemberian akses dari seluruh namespace fleet ke workload yang berjalan di namespace fleet tertentu dalam cluster tertentu.
Hubungkan ke cluster anggota fleet Anda:
gcloud container clusters get-credentials FLEET_CLUSTER_NAME \ --project=CLUSTER_PROJECT_ID \ --location=CLUSTER_LOCATION
Ganti kode berikut:
FLEET_CLUSTER_NAME
: nama cluster anggota fleet yang sudah terikat ke cakupan tim.CLUSTER_PROJECT_ID
: project ID project cluster.CLUSTER_LOCATION
: lokasi cluster.
Mendapatkan nama lengkap self-managed workload identity pool. Anda akan memerlukannya nanti.
kubectl get membership membership -o json | jq -r ".spec.scope_tenancy_workload_identity_pool"
Outputnya mirip dengan hal berikut ini:
POOL_NAME.global.FLEET_HOST_PROJECT_NUMBER.workload.id.goog
Mendapatkan nama penyedia identitas untuk cakupan tim. Anda akan membutuhkannya nanti.
kubectl get membership membership -o json | jq -r ".spec.scope_tenancy_identity_provider"
Outputnya mirip dengan hal berikut ini:
https://gkehub.googleapis.com/projects/FLEET_HOST_PROJECT_ID/locations/global/memberships/FLEET_CLUSTER_NAME
Di editor teks, simpan manifes YAML berikut untuk ConfigMap sebagai
self-managed-pool.yaml
:kind: ConfigMap apiVersion: v1 metadata: namespace: NAMESPACE_NAME name: google-application-credentials data: config: | { "type": "external_account", "audience": "identitynamespace:SELF_MANAGED_POOL_FULL_NAME:IDENTITY_PROVIDER", "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" } }
Ganti kode berikut:
NAMESPACE_NAME
: nama namespace fleet.SELF_MANAGED_POOL_FULL_NAME
: nama lengkap self-managed workload identity pool dari output langkah-langkah sebelumnya di bagian ini. Contoh,example-pool.global.1234567890.workload.id.goog
.IDENTITY_PROVIDER
: nama penyedia identitas dari output langkah sebelumnya di bagian ini. Sebagai contoh,https://gkehub.googleapis.com/projects/1234567890/locations/global/memberships/example-cluster.
Deploy ConfigMap di cluster Anda:
kubectl create -f self-managed-pool.yaml
Men-deploy ConfigMap menunjukkan kepada GKE bahwa workload di namespace tersebut harus menggunakan workload identity pool yang dikelola sendiri untuk mendapatkan identitas.
Memberikan peran IAM ke akun utama
Di bagian ini, Anda akan membuat Akun Layanan Kubernetes di namespace fleet dan memberikan peran IAM ke Akun Layanan. Pod yang menggunakan ServiceAccount ini kemudian dapat mengakses resource Google Cloud tempat Anda memberikan peran.
Buat Akun Layanan Kubernetes di namespace armada Anda:
kubectl create serviceaccount SERVICEACCOUNT_NAME \ --namespace=NAMESPACE_NAME
Ganti kode berikut:
SERVICEACCOUNT_NAME
: nama ServiceAccount baru Anda.NAMESPACE_NAME
: nama namespace fleet.
Memberikan peran IAM ke ServiceAccount. Contoh perintah berikut memberikan peran Storage Object Viewer (
roles/storage.objectViewer
) pada bucket ke ServiceAccount:gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=principal://iam.googleapis.com/projects/FLEET_HOST_PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_NAME.global.FLEET_HOST_PROJECT_NUMBER.workload.id.goog/subject/ns/NAMESPACE_NAME/sa/SERVICEACCOUNT_NAME \ --role=roles/storage.objectViewer \ --condition=None
Flag member
berisi ID akun utama untuk ServiceAccount baru
yang Anda buat. Permintaan yang dikirim workload Anda ke API Google Cloud
menggunakan
token akses gabungan.
Token akses gabungan ini mencakup ID akun utama entitas yang mengirim permintaan. Jika akun utama dalam kebijakan izin yang memberikan peran pada
target resource cocok dengan akun utama dalam token akses gabungan,
autentikasi dan otorisasi dapat dilanjutkan.
Men-deploy workload yang menggunakan kumpulan yang dikelola sendiri
Manifes Kubernetes yang Anda terapkan di namespace armada harus dikonfigurasi untuk mendapatkan identitas dari kumpulan yang dikelola sendiri. Workload yang Anda deploy yang perlu memanggil API Google Cloud harus menyertakan kolom berikut:
metadata.namespace
: nama namespace fleet.spec.serviceAccountName
: nama ServiceAccount Kubernetes di namespace fleet.spec.containers.env
: variabel lingkungan bernamaGOOGLE_APPLICATION_CREDENTIALS
yang menunjukkan jalur ke file Kredensial Default Aplikasi (ADC).spec.containers.volumeMounts
: volume hanya baca yang memungkinkan container menggunakan token pembawa untuk ServiceAccount.spec.volumes
: volume yang diproyeksikan yang memasang token ServiceAccount ke dalam Pod. Audiens token adalah workload identity pool yang dikelola sendiri. ConfigMap yang berisi konfigurasi Workload Identity Federation fleet adalah sumber untuk volume.
Untuk contoh file manifes yang dikonfigurasi dengan benar, lihat bagian Verifikasi autentikasi dari workload.
Memverifikasi autentikasi dari workload
Bagian ini memberikan petunjuk opsional untuk memverifikasi bahwa Anda telah mengonfigurasi workload identity pool yang dikelola sendiri dengan benar dengan mencantumkan isi contoh bucket Cloud Storage. Anda membuat bucket, memberikan peran pada bucket ke Akun Layanan di namespace armada, dan men-deploy Pod untuk mencoba mengakses bucket.
Membuat bucket Cloud Storage:
gcloud storage buckets create gs://FLEET_HOST_PROJECT_ID-workload-id-bucket \ --location=LOCATION \ --project=FLEET_HOST_PROJECT_ID
Berikan peran
roles/storage.objectViewer
di bucket ke ServiceAccount di namespace fleet:gcloud storage buckets add-iam-policy-binding gs://FLEET_HOST_PROJECT_ID-workload-id-bucket \ --condition=None \ --role=roles/storage.objectViewer \ --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_NAME.global.FLEET_HOST_PROJECT_NUMBER.workload.id.goog/subject/ns/NAMESPACE_NAME/sa/SERVICEACCOUNT_NAME
Ganti kode berikut:
FLEET_HOST_PROJECT_NUMBER
: nomor project dari project host fleet Anda.POOL_NAME
: nama workload identity pool yang dikelola sendiri.NAMESPACE_NAME
: nama namespace fleet tempat Anda ingin menjalankan Pod.SERVICEACCOUNT_NAME
: nama ServiceAccount Kubernetes yang harus digunakan Pod.
Simpan manifes berikut sebagai
pod-bucket-access.yaml
:apiVersion: v1 kind: Pod metadata: name: bucket-access-pod namespace: NAMESPACE_NAME spec: serviceAccountName: SERVICEACCOUNT_NAME containers: - name: sample-container image: google/cloud-sdk:slim command: ["sleep","infinity"] 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: POOL_NAME.global.FLEET_HOST_PROJECT_NUMBER.workload.id.goog expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"
Ganti kode berikut:
NAMESPACE_NAME
: nama namespace fleet tempat Anda ingin menjalankan Pod.SERVICEACCOUNT_NAME
: nama ServiceAccount Kubernetes yang harus digunakan Pod.POOL_NAME
: nama workload identity pool yang dikelola sendiri.FLEET_HOST_PROJECT_NUMBER
: nomor project dari project host fleet Anda.
Deploy Pod di cluster Anda:
kubectl apply -f pod-bucket-access.yaml
Buka sesi shell di Pod:
kubectl exec -it bucket-access-pod -n NAMESPACE_NAME -- /bin/bash
Coba buat daftar objek di bucket:
curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/FLEET_HOST_PROJECT_ID-workload-id-bucket/o"
Outputnya adalah sebagai berikut:
{ "kind": "storage#objects" }
Secara opsional, Anda dapat memverifikasi bahwa namespace dan ServiceAccount serupa di cluster anggota fleet yang berbeda tidak akan dapat menegaskan identitas yang sama. Di cluster yang menggunakan Workload Identity Federation armada, tetapi tidak memiliki konfigurasi pool yang dikelola sendiri atau namespace armada, lakukan langkah-langkah berikut:
- Buat namespace Kubernetes baru dengan nama yang sama dengan namespace fleet tempat Anda menyiapkan workload identity pool yang dikelola sendiri.
- Buat Akun Layanan Kubernetes baru dengan nama yang sama dengan Akun Layanan yang Anda beri peran IAM di bagian sebelumnya.
Deploy Pod yang menggunakan ServiceAccount dan namespace yang sama, tetapi untuk kolam identitas workload yang dikelola Google ditentukan di kolom
spec.volumes.projected.sources.serviceAccountToken
. Kumpulan ini memiliki sintaksis berikut:FLEET_HOST_PROJECT_ID.svc.id.goog
Coba akses bucket Cloud Storage dari sesi shell di Pod.
Outputnya harus berupa error 401: Unauthorized
, karena ID akun utama
untuk Pod yang menggunakan kumpulan workload identity yang dikelola Google
berbeda dengan ID akun utama untuk Pod yang menggunakan kumpulan
yang dikelola sendiri.