Halaman ini menunjukkan cara menyelesaikan masalah yang terkait dengan konfigurasi keamanan di cluster Autopilot dan Standard Google Kubernetes Engine (GKE).
Jika Anda memerlukan bantuan lainnya, hubungi Cloud Customer Care.RBAC dan IAM
Akun IAM yang diautentikasi gagal melakukan tindakan dalam cluster
Masalah berikut terjadi saat Anda mencoba melakukan suatu tindakan di cluster, tetapi GKE tidak dapat menemukan kebijakan RBAC yang mengizinkan tindakan tersebut. GKE mencoba menemukan kebijakan IAM yang memberikan izin yang sama. Jika gagal, Anda akan melihat pesan error seperti berikut:
Error from server (Forbidden): roles.rbac.authorization.k8s.io is forbidden:
User "example-account@example-project.iam.gserviceaccount.com" cannot list resource "roles" in
API group "rbac.authorization.k8s.io" in the namespace "kube-system": requires
one of ["container.roles.list"] permission(s).
Untuk mengatasi masalah ini, gunakan kebijakan RBAC untuk memberikan izin bagi
upaya tindakan. Misalnya, untuk mengatasi masalah dalam contoh sebelumnya,
berikan Peran yang memiliki izin list
pada objek roles
di namespace
kube-system
. Untuk mengetahui petunjuknya, baca
Memberikan otorisasi pada tindakan dalam cluster menggunakan role-based access control.
Federasi Workload Identity untuk GKE
Pod tidak dapat melakukan autentikasi ke Google Cloud
Jika aplikasi Anda tidak dapat melakukan autentikasi ke Google Cloud, pastikan setelan berikut dikonfigurasi dengan benar:
Pastikan Anda telah mengaktifkan IAM Service Account Credentials API dalam project yang berisi cluster GKE.
Pastikan bahwa Workload Identity Federation for GKE diaktifkan di cluster dengan memastikan bahwa cluster telah memiliki kumpulan workload identity:
gcloud container clusters describe CLUSTER_NAME \ --format="value(workloadIdentityConfig.workloadPool)"
Ganti
CLUSTER_NAME
dengan nama cluster GKE Anda.Jika belum menentukan zona atau region default untuk
gcloud
, Anda mungkin juga perlu menentukan flag--region
atau--zone
saat menjalankan perintah ini.Pastikan server metadata GKE dikonfigurasi di kumpulan node tempat aplikasi Anda berjalan:
gcloud container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --format="value(config.workloadMetadataConfig.mode)"
Ganti kode berikut:
NODEPOOL_NAME
dengan nama nodepool Anda.CLUSTER_NAME
dengan nama cluster GKE Anda.
Pastikan akun layanan Kubernetes dianotasi dengan benar:
kubectl describe serviceaccount \ --namespace NAMESPACE KSA_NAME
Ganti kode berikut:
NAMESPACE
dengan namespace cluster GKE Anda.KSA
dengan nama akun layanan Kubernetes Anda.
Output yang diharapkan berisi anotasi yang mirip dengan berikut ini:
iam.gke.io/gcp-service-account: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
Pastikan akun layanan IAM dikonfigurasi dengan benar:
gcloud iam service-accounts get-iam-policy \ GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
Output yang diharapkan berisi binding yang mirip dengan berikut ini:
- members: - serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME] role: roles/iam.workloadIdentityUser
Jika memiliki kebijakan jaringan cluster, Anda harus mengizinkan traffic keluar ke
127.0.0.1/32
pada port988
untuk cluster yang menjalankan versi GKE sebelum versi 1.21.0-gke.1000, atau ke169.254.169.252/32
pada port988
untuk cluster yang menjalankan GKE versi 1.21.0-gke.1000 dan yang lebih baru. Untuk cluster yang menjalankan GKE Dataplane V2, Anda harus mengizinkan traffic keluar ke169.254.169.254/32
pada port80
.kubectl describe networkpolicy NETWORK_POLICY_NAME
Ganti
NETWORK_POLICY_NAME
dengan nama kebijakan jaringan GKE Anda.
Masalah Resolusi DNS
Beberapa library klien Google Cloud dikonfigurasi agar terhubung ke server metadata GKE dan Compute Engine dengan me-resolve nama DNS metadata.google.internal
. Untuk library ini, resolusi DNS dalam cluster yang sehat adalah dependensi yang sangat penting agar workload Anda dapat melakukan autentikasi ke layanan Google Cloud.
Cara Anda mendeteksi masalah ini bergantung pada detail aplikasi yang di-deploy, termasuk konfigurasi logging-nya. Cari pesan error yang:
- memberitahu Anda untuk mengonfigurasi GOOGLE_APPLICATION_CREDENTIALS, atau
- memberi tahu Anda bahwa permintaan ke layanan Google Cloud ditolak karena permintaan tersebut tidak memiliki kredensial.
Jika Anda mengalami masalah dengan resolusi DNS metadata.google.internal
, beberapa library klien Google Cloud dapat diinstruksikan untuk melewati resolusi DNS dengan menetapkan variabel lingkungan GCE_METADATA_HOST
ke 169.254.169.254
:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
namespace: default
spec:
containers:
- image: debian
name: main
command: ["sleep", "infinity"]
env:
- name: GCE_METADATA_HOST
value: "169.254.169.254"
Ini adalah alamat IP hardcode tempat layanan metadata selalu tersedia di platform komputasi Google Cloud.
Library Google Cloud yang didukung:
- Python
- Java
- Node.js
- Golang (Namun, perhatikan bahwa library klien Golang sudah memilih untuk terhubung berdasarkan IP, bukan nama DNS).
Error waktu tunggu saat memulai Pod
Server metadata GKE memerlukan waktu beberapa detik sebelum dapat mulai menerima permintaan pada Pod baru. Upaya mengautentikasi menggunakan Workload Identity Federation for GKE dalam beberapa detik pertama masa pakai Pod mungkin akan gagal untuk aplikasi dan library klien Google Cloud yang dikonfigurasi dengan waktu tunggu singkat.
Jika Anda mengalami error waktu tunggu, coba langkah berikut:
- Update library klien Google Cloud yang digunakan workload Anda.
- Ubah kode aplikasi untuk menunggu beberapa detik dan coba lagi.
Deploy initContainer yang menunggu hingga server metadata GKE siap sebelum menjalankan container utama Pod.
Misalnya, manifes berikut ditujukan untuk Pod dengan
initContainer
:apiVersion: v1 kind: Pod metadata: name: pod-with-initcontainer spec: serviceAccountName: KSA_NAME initContainers: - image: gcr.io/google.com/cloudsdktool/cloud-sdk:alpine name: workload-identity-initcontainer command: - '/bin/bash' - '-c' - | curl -sS -H 'Metadata-Flavor: Google' 'http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token' --retry 30 --retry-connrefused --retry-max-time 60 --connect-timeout 3 --fail --retry-all-errors > /dev/null && exit 0 || echo 'Retry limit exceeded. Failed to wait for metadata server to be available. Check if the gke-metadata-server Pod in the kube-system namespace is healthy.' >&2; exit 1 containers: - image: gcr.io/your-project/your-image name: your-main-application-container
Workload Identity Federation for GKE gagal karena tidak tersedianya bidang kontrol
Server metadata tidak dapat menampilkan Workload Identity Federation untuk GKE jika bidang kontrol cluster tidak tersedia. Panggilan ke server metadata menampilkan kode status 500.
Entri log mungkin terlihat seperti berikut di Logs Explorer:
dial tcp 35.232.136.58:443: connect: connection refused
Perilaku ini menyebabkan tidak tersedianya Workload Identity Federation untuk GKE.
Bidang kontrol mungkin tidak tersedia di cluster zona selama pemeliharaan cluster seperti memutar IP, mengupgrade VM bidang kontrol, atau mengubah ukuran cluster atau kumpulan node. Lihat Memilih bidang kontrol regional atau zona untuk mempelajari ketersediaan bidang kontrol. Beralih ke cluster regional dapat mengatasi masalah ini.
Autentikasi Workload Identity Federation untuk GKE gagal dalam cluster yang menggunakan Istio
Jika server metadata GKE diblokir karena alasan apa pun, autentikasi Workload Identity Federation for GKE akan gagal.
Jika Anda menggunakan Istio atau Anthos Service Mesh, tambahkan anotasi level Pod berikut ke semua workload yang menggunakan Workload Identity Federation for GKE, agar mengecualikan IP dari pengalihan:
traffic.sidecar.istio.io/excludeOutboundIPRanges: 169.254.169.254/32
Anda dapat mengubah kunci global.proxy.excludeIPRanges
Istio ConfigMap untuk melakukan hal yang sama.
Atau, Anda juga dapat menambahkan anotasi level Pod berikut ke semua workload yang menggunakan Workload Identity Federation for GKE, untuk menunda dimulainya container aplikasi hingga file bantuan siap:
proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
Anda dapat mengubah kunci global.proxy.holdApplicationUntilProxyStarts
Istio ConfigMap untuk melakukan hal yang sama.
Pod gke-metadata-server
mengalami error
Pod DaemonSet sistem gke-metadata-server
memfasilitasi Workload Identity Federation for GKE pada node Anda. Pod menggunakan resource memori sebanding dengan jumlah
akun layanan Kubernetes di cluster Anda.
Masalah berikut terjadi saat penggunaan resource Pod gke-metadata-server
melebihi batasnya. kubelet mengeluarkan Pod dengan error kehabisan memori.
Anda mungkin mengalami masalah ini jika cluster memiliki lebih dari 3.000 akun layanan Kubernetes.
Untuk mengidentifikasi masalah, lakukan langkah berikut:
Temukan Pod
gke-metadata-server
yang mengalami error di namespacekube-system
:kubectl get pods -n=kube-system | grep CrashLoopBackOff
Outputnya mirip dengan yang berikut ini:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system gke-metadata-server-8sm2l 0/1 CrashLoopBackOff 194 16h kube-system gke-metadata-server-hfs6l 0/1 CrashLoopBackOff 1369 111d kube-system gke-metadata-server-hvtzn 0/1 CrashLoopBackOff 669 111d kube-system gke-metadata-server-swhbb 0/1 CrashLoopBackOff 30 136m kube-system gke-metadata-server-x4bl4 0/1 CrashLoopBackOff 7 15m
Jelaskan Pod yang mengalami error untuk mengonfirmasi bahwa penyebabnya adalah penghapusan memori habis:
kubectl describe pod POD_NAME --namespace=kube-system | grep OOMKilled
Ganti
POD_NAME
dengan nama Pod yang akan diperiksa.
Untuk memulihkan fungsionalitas ke server metadata GKE, kurangi jumlah akun layanan di cluster Anda menjadi kurang dari 3.000.
Workload Identity Federation for GKE gagal diaktifkan dengan pesan error DeployPatch gagal
GKE menggunakan
Agen Layanan Kubernetes Engine
yang dikelola Google Cloud untuk memfasilitasi Workload Identity Federation for GKE di cluster Anda. Google Cloud secara otomatis
memberikan peran Agen Layanan Kubernetes Engine kepada agen layanan ini
(roles/container.serviceAgent
) pada project Anda saat mengaktifkan
Google Kubernetes Engine API.
Jika Anda mencoba mengaktifkan Workload Identity Federation for GKE pada cluster dalam project yang tidak memiliki peran Agen Layanan Kubernetes Engine, operasi akan gagal dengan pesan error seperti berikut:
Error waiting for updating GKE cluster workload identity config: DeployPatch failed
Untuk mengatasi masalah ini, coba langkah berikut:
Periksa apakah agen layanan ada di project Anda dan dikonfigurasi dengan benar:
gcloud projects get-iam-policy PROJECT_ID \ --flatten=bindings \ --filter=bindings.role=roles/container.serviceAgent \ --format="value[delimiter='\\n'](bindings.members)"
Ganti
PROJECT_ID
dengan project ID Google Cloud Anda.Jika agen layanan dikonfigurasi dengan benar, output akan menampilkan identitas lengkap agen layanan:
serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Jika output tidak menampilkan agen layanan, Anda harus memberinya peran Agen Layanan Kubernetes Engine. Untuk memberikan peran ini, selesaikan langkah-langkah berikut.
Dapatkan nomor project Google Cloud Anda:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
Outputnya mirip dengan hal berikut ini:
123456789012
Berikan peran kepada agen layanan:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role=roles/container.serviceAgent \ --condition=None
Ganti
PROJECT_NUMBER
dengan nomor project Google Cloud Anda.Coba aktifkan lagi Workload Identity Federation for GKE.