Halaman ini membantu Anda menyelesaikan error 400, 401, 403, dan 404 yang mungkin Anda temui saat menggunakan Google Kubernetes Engine (GKE).
Masalah: Error autentikasi dan otorisasi
Saat terhubung ke cluster GKE, Anda bisa mendapatkan error autentikasi dan otorisasi dengan kode status HTTP 401 (Unauthorized)
. Masalah ini
mungkin terjadi saat Anda mencoba menjalankan perintah kubectl
di cluster GKE
dari lingkungan lokal.
Penyebab masalah ini mungkin salah satu dari hal berikut:
- Plugin autentikasi
gke-gcloud-auth-plugin
tidak diinstal atau dikonfigurasi dengan benar. - Anda tidak memiliki izin untuk terhubung ke server API cluster dan menjalankan perintah
kubectl
.
Untuk mendiagnosis penyebabnya, selesaikan langkah-langkah di bagian berikut:
Menghubungkan ke cluster menggunakan curl
Untuk mendiagnosis penyebab error autentikasi dan otorisasi, hubungkan ke
cluster menggunakan curl
. Penggunaan curl
akan mengabaikan alat command line kubectl
dan plugin gke-gcloud-auth-plugin
.
Menetapkan variabel lingkungan:
APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION --format "value(endpoint)") TOKEN=$(gcloud auth print-access-token)
Pastikan token akses Anda valid:
curl https://oauth2.googleapis.com/tokeninfo?access_token=$TOKEN
Jika Anda memiliki token akses yang valid, perintah ini akan mengirimkan permintaan ke server OAuth 2.0 Google dan server akan merespons dengan informasi tentang token.
Coba hubungkan ke endpoint API inti di server API:
# Get cluster CA certificate gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --format "value(masterAuth.clusterCaCertificate)" | \ base64 -d > /tmp/ca.crt # Make API call with authentication and CA certificate curl -s -X GET "${APISERVER}/api/v1/namespaces" \ --header "Authorization: Bearer $TOKEN" \ --cacert /tmp/ca.crt
Jika perintah
curl
berhasil, Anda akan melihat daftar namespace. Lanjutkan untuk memeriksa apakah plugin adalah penyebabnya menggunakan langkah-langkah di bagian Mengonfigurasi plugin di kubeconfig.Jika perintah
curl
gagal dengan output yang mirip dengan yang berikut ini, berarti Anda tidak memiliki izin yang benar untuk mengakses cluster:{ "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }
Untuk mengatasi masalah ini, hubungi administrator Anda guna mendapatkan izin yang benar untuk mengakses cluster.
Mengonfigurasi penggunaan plugin di kubeconfig
Jika Anda mendapatkan error autentikasi dan otorisasi saat menghubungkan ke
cluster, tetapi dapat terhubung ke cluster menggunakan
curl
, pastikan Anda dapat mengakses
cluster tanpa memerlukan plugin gke-gcloud-auth-plugin
.
Untuk mengatasi masalah ini, konfigurasikan lingkungan lokal Anda untuk mengabaikan biner gke-gcloud-auth-plugin
saat mengautentikasi ke cluster. Di klien Kubernetes
yang menjalankan versi 1.25 dan yang lebih baru, biner gke-gcloud-auth-plugin
diperlukan, sehingga Anda harus menggunakan versi 1.24 atau yang lebih lama untuk
alat command line kubectl
.
Ikuti langkah-langkah berikut untuk mengakses cluster tanpa memerlukan plugin:
Instal alat command line
kubectl
dengan versi 1.24 atau yang lebih lama menggunakancurl
. Contoh berikut menginstal alat dengan versi 1.24:curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
Buka file skrip startup shell Anda di editor teks. Misalnya, buka
.bashrc
untuk shell Bash:vi ~/.bashrc
Jika Anda menggunakan macOS, gunakan
~/.bash_profile
, bukan.bashrc
, dalam petunjuk ini.Tambahkan baris berikut ke file skrip startup dan simpan:
export USE_GKE_GCLOUD_AUTH_PLUGIN=False
Jalankan skrip startup:
source ~/.bashrc
Dapatkan kredensial untuk cluster Anda, yang menyiapkan file
.kube/config
:gcloud container clusters get-credentials CLUSTER_NAME \ --location=COMPUTE_LOCATION
Ganti kode berikut:
CLUSTER_NAME
: nama cluster.COMPUTE_LOCATION
: Lokasi Compute Engine.
Jalankan perintah
kubectl
. Contoh:kubectl cluster-info
Jika Anda mendapatkan error 401 atau error otorisasi serupa setelah menjalankan perintah ini, pastikan Anda memiliki izin yang benar, lalu jalankan kembali langkah yang menampilkan error.
Error 400: Node pool memerlukan pembuatan ulang
Error berikut dapat terjadi saat Anda mencoba melakukan tindakan yang membuat ulang panel kontrol dan node:
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.
Misalnya, error ini dapat terjadi saat Anda menyelesaikan rotasi kredensial yang sedang berlangsung.
Di backend, node pool ditandai untuk dibuat ulang, tetapi operasi pembuatan ulang yang sebenarnya mungkin memerlukan waktu beberapa saat untuk dimulai. Oleh karena itu, operasi gagal karena GKE belum membuat ulang satu atau beberapa node pool di cluster Anda.
Untuk mengatasi masalah ini, pilih salah satu solusi berikut:
- Tunggu hingga pembuatan ulang selesai. Proses ini mungkin memerlukan waktu berjam-jam, berhari-hari, atau berminggu-minggu, bergantung pada faktor-faktor seperti masa pemeliharaan dan pengecualian yang ada.
Mulai pembuatan ulang node pool yang terpengaruh secara manual dengan memulai upgrade versi ke versi yang sama dengan panel kontrol.
Untuk memulai pembuatan ulang, jalankan perintah berikut:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME
Setelah upgrade selesai, coba operasi lagi.
Error 401: Unauthorized
GKE menggunakan akun layanan IAM yang dilampirkan ke node Anda untuk
menjalankan tugas sistem seperti logging dan pemantauan. Setidaknya, akun layanan node ini
harus memiliki
peran Akun Layanan Node Default Kubernetes Engine
(roles/container.defaultNodeServiceAccount
) di project Anda. Secara default, GKE menggunakan akun layanan default Compute Engine, yang dibuat secara otomatis di project Anda, sebagai akun layanan node.
Jika organisasi Anda menerapkan batasan kebijakan organisasi iam.automaticIamGrantsForDefaultServiceAccounts
, akun layanan Compute Engine default di project Anda mungkin tidak otomatis mendapatkan izin yang diperlukan untuk GKE.
-
Temukan nama akun layanan yang digunakan node Anda:
console
- Buka halaman Cluster Kubernetes:
- Dalam daftar cluster, klik nama cluster yang ingin diperiksa.
- Bergantung pada mode operasi cluster, lakukan salah satu hal berikut:
- Untuk cluster mode Autopilot, di bagian Keamanan, temukan kolom Service account.
- Untuk cluster mode Standar, lakukan hal berikut:
- Klik tab Nodes.
- Di tabel Node pool, klik nama node pool. Halaman Detail node pool akan terbuka.
- Di bagian Keamanan, temukan kolom Service account.
Jika nilai di kolom Service account adalah
default
, node Anda akan menggunakan akun layanan default Compute Engine. Jika nilai di kolom ini bukandefault
, node Anda menggunakan akun layanan kustom. Untuk memberikan peran yang diperlukan ke akun layanan kustom, lihat Menggunakan akun layanan IAM dengan hak istimewa terendah.gcloud
Untuk cluster mode Autopilot, jalankan perintah berikut:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccountUntuk cluster mode Standar, jalankan perintah berikut:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --format="table(nodePools.name,nodePools.config.serviceAccount)"Jika outputnya adalah
default
, node Anda akan menggunakan akun layanan default Compute Engine. Jika output-nya bukandefault
, node Anda menggunakan akun layanan kustom. Untuk memberikan peran yang diperlukan ke akun layanan kustom, lihat Menggunakan akun layanan IAM dengan hak istimewa terendah. -
Untuk memberikan peran
roles/container.defaultNodeServiceAccount
ke akun layanan default Compute Engine, selesaikan langkah-langkah berikut:console
- Buka halaman Sambutan:
- Di kolom Project number, klik Copy to clipboard.
- Buka halaman IAM:
- Klik Berikan akses.
- Di kolom New principals, tentukan nilai berikut:
GantiPROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
dengan nomor project yang Anda salin. - Di menu Select a role, pilih peran Kubernetes Engine Default Node Service Account.
- Klik Simpan.
gcloud
- Temukan nomor project Google Cloud Anda:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
Ganti
PROJECT_ID
dengan project ID Anda.Outputnya mirip dengan hal berikut ini:
12345678901
- Berikan peran
roles/container.defaultNodeServiceAccount
ke akun layanan default Compute Engine:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
Ganti
PROJECT_NUMBER
dengan nomor project dari langkah sebelumnya.
Error 403: Izin tidak memadai
Error berikut terjadi saat Anda mencoba terhubung ke cluster GKE menggunakan gcloud container clusters get-credentials
, tetapi akun tersebut tidak memiliki izin untuk mengakses server Kubernetes API:
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/<your-project>/locations/<region>/clusters/<your-cluster>".
Untuk mengatasi masalah ini, selesaikan beberapa langkah berikut:
Identifikasi akun yang memiliki masalah akses:
gcloud auth list
Berikan akses yang diperlukan ke akun menggunakan petunjuk di bagian Melakukan autentikasi ke server Kubernetes API.
Error 403: Anggaran percobaan ulang habis
Error berikut dapat terjadi saat Anda mencoba membuat cluster GKE:
Error: googleapi: Error 403: Retry budget exhausted: Google Compute Engine:
Required permission 'PERMISSION_NAME' for 'RESOURCE_NAME'.
Dalam pesan error ini, variabel berikut berlaku:
PERMISSION_NAME
: nama izin, seperticompute.regions.get
.RESOURCE_NAME
: jalur ke resource Google Cloud yang Anda coba akses, seperti region Compute Engine.
Error ini terjadi jika akun layanan IAM yang dilampirkan ke cluster tidak memiliki izin minimum yang diperlukan untuk membuat cluster.
Untuk menyelesaikan masalah ini, lakukan tindakan berikut:
- Buat atau ubah akun layanan IAM agar memiliki semua izin yang diperlukan untuk menjalankan cluster GKE. Untuk mengetahui petunjuknya, lihat Menggunakan akun layanan IAM dengan hak istimewa terendah.
- Tentukan akun layanan IAM yang diperbarui dalam perintah pembuatan cluster Anda menggunakan flag
--service-account
. Untuk mengetahui petunjuknya, lihat Membuat cluster Autopilot.
Atau, hapus tanda --service-account
agar GKE dapat menggunakan akun layanan default Compute Engine dalam project, yang memiliki izin yang diperlukan secara default.
Error 404: Resource tidak ditemukan
Jika Anda mendapatkan error 404, resource not found, saat memanggil perintah gcloud container
, selesaikan masalah dengan mengautentikasi ulang ke Google Cloud CLI:
gcloud auth login
Error 400/403: Izin edit untuk akun tidak ada
Error izin edit untuk akun tidak ada (error 400 atau 403), menunjukkan bahwa salah satu dari hal berikut telah dihapus atau diedit secara manual:
- Akun layanan default Compute Engine Anda.
- Agen Layanan Google API.
- Akun layanan yang terkait dengan GKE.
Saat Anda mengaktifkan Compute Engine atau Kubernetes Engine API, Google Cloud akan membuat akun layanan dan agen berikut:
- Compute Engine default service account di project Anda. GKE meletakkan akun layanan ini ke node secara default untuk tugas sistem seperti logging dan pemantauan.
- Agen Layanan Google API di project terkelola Google, dengan izin edit di project Anda.
- Agen layanan Google Kubernetes Engine dalam project yang dikelola Google, dengan peran Agen Layanan Kubernetes Engine di project Anda.
Pembuatan cluster dan semua pengelolaan akan gagal jika, pada suatu saat, seseorang mengedit izin tersebut, menghapus binding peran pada project, menghapus akun layanan sepenuhnya, atau menonaktifkan API.
Memverifikasi izin untuk agen layanan GKE
Untuk memverifikasi apakah akun layanan Google Kubernetes Engine memiliki peran Agen Layanan Kubernetes Engine yang ditetapkan pada project, selesaikan langkah-langkah berikut:
Tentukan nama akun layanan Google Kubernetes Engine Anda. Semua akun layanan memiliki format berikut:
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Ganti
PROJECT_NUMBER
dengan nomor project Anda.Pastikan akun layanan Google Kubernetes Engine Anda tidak memiliki peran Kubernetes Engine Service Agent yang ditetapkan pada project:
gcloud projects get-iam-policy PROJECT_ID
Ganti
PROJECT_ID
dengan project ID Anda.
Untuk memperbaiki masalah ini, jika seseorang menghapus peran Agen Layanan Kubernetes Engine dari akun layanan Google Kubernetes Engine, tambahkan kembali peran tersebut. Jika tidak, gunakan petunjuk berikut untuk mengaktifkan kembali Kubernetes Engine API, yang akan memulihkan akun layanan dan izin Anda:
Konsol
Buka halaman APIs & Services di Konsol Google Cloud.
Pilih project Anda.
Klik Aktifkan API dan Layanan.
Telusuri Kubernetes, lalu pilih API dari hasil penelusuran.
Klik Enable. Jika sebelumnya telah mengaktifkan API, Anda harus menonaktifkannya terlebih dahulu, lalu mengaktifkannya kembali. Mungkin perlu waktu beberapa menit agar API dan layanan terkait diaktifkan.
gcloud
Jalankan perintah berikut di gcloud CLI:
PROJECT_NUMBER=$(gcloud projects describe "PROJECT_ID"
--format 'get(projectNumber)')
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:service-${PROJECT_NUMBER?}@container-engine-robot.iam.gserviceaccount.com" \
--role roles/container.serviceAgent
Langkah selanjutnya
Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.