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 terjadi. 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
Mengidentifikasi cluster dengan akun layanan node yang tidak memiliki izin penting
Untuk mengidentifikasi cluster dengan akun layanan node yang tidak memiliki izin penting, gunakan rekomendasi GKE dari subjenis perekomendasikan NODE_SA_MISSING_PERMISSIONS
:
- Menggunakan Konsol Google Cloud. Buka halaman Cluster Kubernetes dan periksa rekomendasi Berikan izin penting di kolom Notifikasi untuk cluster tertentu.
Gunakan gcloud CLI atau Recommender API, dengan menentukan subjenis recommender
NODE_SA_MISSING_PERMISSIONS
.Untuk membuat kueri rekomendasi, jalankan perintah berikut:
gcloud recommender recommendations list \ --recommender=google.container.DiagnosisRecommender \ --location LOCATION \ --project PROJECT_ID \ --format yaml \ --filter="recommenderSubtype:NODE_SA_MISSING_PERMISSIONS"
Perhatikan bahwa mungkin diperlukan waktu hingga 24 jam agar rekomendasi muncul. Untuk petunjuk mendetail, lihat cara melihat insight dan rekomendasi.
Untuk menerapkan rekomendasi ini, berikan peran roles/container.defaultNodeServiceAccount
ke akun layanan node.
Anda dapat mengikuti skrip ini untuk menemukan semua akun layanan node yang tidak memiliki izin penting untuk cluster mode Standar dalam project.
#!/bin/bash
# Set your project ID
project_id=PROJECT_ID
project_number=$(gcloud projects describe "$project_id" --format="value(projectNumber)")
declare -a all_service_accounts
declare -a sa_missing_permissions
# Function to check if a service account has a specific permission
# $1: project_id
# $2: service_account
# $3: permission
service_account_has_permission() {
local project_id="$1"
local service_account="$2"
local permission="$3"
local roles=$(gcloud projects get-iam-policy "$project_id" \
--flatten="bindings[].members" \
--format="table[no-heading](bindings.role)" \
--filter="bindings.members:\"$service_account\"")
for role in $roles; do
if role_has_permission "$role" "$permission"; then
echo "Yes" # Has permission
return
fi
done
echo "No" # Does not have permission
}
# Function to check if a role has the specific permission
# $1: role
# $2: permission
role_has_permission() {
local role="$1"
local permission="$2"
gcloud iam roles describe "$role" --format="json" | \
jq -r ".includedPermissions" | \
grep -q "$permission"
}
echo "--- 1. List all service accounts in all GKE node pools"
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" "service_account" "project_id" "cluster_name" "cluster_location" "nodepool_name"
while read cluster; do
cluster_name=$(echo "$cluster" | awk '{print $1}')
cluster_location=$(echo "$cluster" | awk '{print $2}')
while read nodepool; do
nodepool_name=$(echo "$nodepool" | awk '{print $1}')
while read nodepool_details; do
service_account=$(echo "$nodepool_details" | awk '{print $1}')
if [[ "$service_account" == "default" ]]; then
service_account="${project_number}-compute@developer.gserviceaccount.com"
fi
if [[ -n "$service_account" ]]; then
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" $service_account $project_id $cluster_name $cluster_location $nodepool_name
all_service_accounts+=( ${service_account} )
else
echo "cannot find service account" for node pool "$project_id\t$cluster_name\t$cluster_location\t$nodepool_details"
fi
done <<< "$(gcloud container node-pools describe "$nodepool_name" --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](config.serviceAccount)")"
done <<< "$(gcloud container node-pools list --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](name)")"
done <<< "$(gcloud container clusters list --project "$project_id" --format="value(name,location)")"
echo "--- 2. Check if service accounts have permissions"
unique_service_accounts=($(echo "${all_service_accounts[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
echo "Service accounts: ${unique_service_accounts[@]}"
printf "%-60s| %-40s| %-40s| %-20s\n" "service_account" "has_logging_permission" "has_monitoring_permission" "has_performance_hpa_metric_write_permission"
for sa in "${unique_service_accounts[@]}"; do
logging_permission=$(service_account_has_permission "$project_id" "$sa" "logging.logEntries.create")
monitoring_permission=$(service_account_has_permission "$project_id" "$sa" "monitoring.timeSeries.create")
performance_hpa_metric_write_permission=$(service_account_has_permission "$project_id" "$sa" "autoscaling.sites.writeMetrics")
printf "%-60s| %-40s| %-40s| %-20s\n" $sa $logging_permission $monitoring_permission $performance_hpa_metric_write_permission
if [[ "$logging_permission" == "No" || "$monitoring_permission" == "No" || "$performance_hpa_metric_write_permission" == "No" ]]; then
sa_missing_permissions+=( ${sa} )
fi
done
echo "--- 3. List all service accounts that don't have the above permissions"
if [[ "${#sa_missing_permissions[@]}" -gt 0 ]]; then
printf "Grant roles/container.defaultNodeServiceAccount to the following service accounts: %s\n" "${sa_missing_permissions[@]}"
else
echo "All service accounts have the above permissions"
fi
Mengidentifikasi akun layanan node yang tidak memiliki izin penting di cluster
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 outputnya 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 Akun utama baru, 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 Google Cloud nomor project 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
untuk mengizinkan GKE 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 Agen Layanan Kubernetes Engine 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 berikutnya
Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.