Panduan ini menjelaskan cara mengonfigurasi workload identity di GKE di AWS untuk mengontrol akses workload ke resource GCP. Panduan ini mencakup contoh cara mengakses Google Cloud resource dari cluster Anda menggunakan identitas.
Untuk mengetahui informasi tentang cara menggunakan workload identity dengan akun AWS IAM untuk mengontrol akses ke resource AWS, lihat Menggunakan workload identity dengan AWS.
Ringkasan
Workload identity menggunakan Google Cloud izin IAM untuk mengontrol akses ke Google Cloud resource. Dengan workload identity, Anda dapat menetapkan peran IAM yang berbeda ke setiap workload. Kontrol izin yang mendetail ini memungkinkan Anda mengikuti prinsip hak istimewa terendah. Tanpa workload identity, Anda harus menetapkan Google Cloud peran IAM ke node GKE di AWS, sehingga semua workload di node tersebut memiliki izin yang sama dengan node itu sendiri.
Prasyarat
Buat cluster pengguna dengan Kubernetes versi v1.20 atau yang lebih baru.
Jika AWS VPC Anda menggunakan proxy atau firewall, izinkan URL berikut:
securetoken.googleapis.comiamcredentials.googleapis.comsts.googleapis.com
Dari direktori
anthos-aws, gunakananthos-gkeuntuk beralih konteks ke cluster pengguna Anda. Ganti CLUSTER_NAME dengan nama cluster pengguna Anda.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
Aktifkan empat layanan baru yang diperlukan untuk fitur ini dengan perintah berikut:
gcloud services enable securetoken.googleapis.com gcloud services enable iam.googleapis.com gcloud services enable iamcredentials.googleapis.com gcloud services enable sts.googleapis.com
Menyusun nama kumpulan WI dan penyedia
Setiap Google Cloud project otomatis membuat workload
identity pool terkelola dengan nama dalam bentuk PROJECT_ID.svc.id.goog. Demikian pula,
Google Cloud membuat penyedia identitas yang namanya mengikuti pola
https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID.
Untuk mengetahui informasi selengkapnya tentang workload identity pool, lihat
Komponen yang mendukung fleet.
Susun nama ini dari project ID dan ID keanggotaan Anda seperti yang ditunjukkan di sini:
export PROJECT_ID=USER_PROJECT_NAME
export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME
export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}"
export WI_POOL="${PROJECT_ID}.svc.id.goog"
Ganti kode berikut:
- USER_PROJECT_NAME dengan nama project pengguna yang dipilih pengguna
- PROJECT_MEMBERSHIP_NAME dengan nama keanggotaan cluster
Membuat binding kebijakan IAM
Buat binding kebijakan untuk mengizinkan akun layanan Kubernetes (KSA) untuk meniru identitas Google Cloud akun layanan (GSA).
export K8S_NAMESPACE=KUBERNETES_NAMESPACE
export KSA_NAME=KUBERNETES_SA_NAME
export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud iam service-accounts add-iam-policy-binding \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL
Ganti kode berikut:
- KUBERNETES_NAMESPACE dengan namespace Kubernetes tempat akun layanan Kubernetes ditentukan
- WORKLOAD_IDENTITY_TEST dengan nama workload pilihan Anda
- KUBERNETES_SA_NAME dengan nama akun layanan Kubernetes yang terlampir ke aplikasi
Membuat peta konfigurasi SDK
Jalankan skrip shell di bawah untuk menyimpan detail workload identity di ConfigMap. Saat Pod memasang ConfigMap, Google Cloud CLI dapat membaca detail workload identity.
cat << EOF > cfmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
namespace: ${K8S_NAMESPACE}
name: my-cloudsdk-config
data:
config: |
{
"type": "external_account",
"audience": "identitynamespace:${WI_POOL}:${IDP}",
"service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}: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"
}
}
EOF
env HTTPS_PROXY=http://localhost:8118 \
kubectl apply -f cfmap.yaml
Membuat akun layanan Kubernetes
Buat KSA di cluster pengguna Anda dengan nama dan namespace yang sama seperti yang digunakan dalam binding IAM.
cat << EOF > k8s-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${KSA_NAME}
namespace: ${K8S_NAMESPACE}
EOF
env HTTPS_PROXY=http://localhost:8118 \
kubectl apply -f k8s-service-account.yaml
Membuat Pod
Selanjutnya, buat Pod dengan proyeksi token akun layanan dan ConfigMap yang dibuat di atas.
Buat file yaml Pod contoh.
cat << EOF > sample-pod.yaml apiVersion: v1 kind: Pod metadata: name: sample-pod namespace: ${K8S_NAMESPACE} spec: serviceAccountName: ${KSA_NAME} containers: - command: - /bin/bash - -c - while :; do echo '.'; sleep 500 ; done image: google/cloud-sdk name: cloud-sdk 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: ${WI_POOL} expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json" EOFTerapkan YAML Pod ke cluster Anda.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
Menggunakan Google Cloud workload identity
Versi SDK yang didukung
Untuk menggunakan Google Cloud fitur workload identity, Anda harus membuat kode dengan SDK yang mendukungnya. Untuk mengetahui daftar versi SDK yang mendukung Google Cloud workload identity, lihat Workload Identity Fleet.
Contoh kode menggunakan workload identity
Bagian ini mencakup contoh kode Python yang menggunakan Google Cloud workload identity. Akun layanan dalam contoh ini menggunakan identitas dengan "Admin Cloud Storage" hak istimewa untuk mencantumkan semua Google Cloud bucket Cloud Storageproject.
Jalankan shell dalam Pod.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
Jalankan skrip untuk mencantumkan bucket penyimpanan project.
# execute these commands inside the Pod pip install --upgrade google-cloud-storage cat << EOF > sample-list-bucket.py from google.cloud import storage storage_client = storage.Client() buckets = storage_client.list_buckets() for bucket in buckets: print(bucket.name) EOF env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \ python3 sample-list-bucket.py
Ganti USER_PROJECT_NAME dengan Google Cloud project Anda.
Untuk mengetahui informasi selengkapnya
- Workload Identity Fleet
- Workload identity federation
- Mengakses resource dari penyedia identitas OIDC (cluster Kubernetes adalah penyedia identitas OIDC)
- Menggunakan workload identity dengan AWS