Memecahkan masalah error 4xx


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:

  1. Menghubungkan ke cluster menggunakan curl
  2. Mengonfigurasi plugin di kubeconfig

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.

  1. Menetapkan variabel lingkungan:

    APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \
        --location=COMPUTE_LOCATION --format "value(endpoint)")
    TOKEN=$(gcloud auth print-access-token)
    
  2. 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.

  3. 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:

  1. Instal alat command line kubectl dengan versi 1.24 atau yang lebih lama menggunakan curl. Contoh berikut menginstal alat dengan versi 1.24:

    curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
    
  2. 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.

  3. Tambahkan baris berikut ke file skrip startup dan simpan:

    export USE_GKE_GCLOUD_AUTH_PLUGIN=False
    
  4. Jalankan skrip startup:

    source ~/.bashrc
    
  5. Dapatkan kredensial untuk cluster Anda, yang menyiapkan file .kube/config:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=COMPUTE_LOCATION
    

    Ganti kode berikut:

  6. 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 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:

  1. Identifikasi akun yang memiliki masalah akses:

    gcloud auth list
    
  2. 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, seperti compute.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:

  1. 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.
  2. 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:

Saat Anda mengaktifkan Compute Engine atau Kubernetes Engine API, Google Cloud akan membuat akun layanan dan agen berikut:

  • Akun layanan default Compute Engine dengan izin edit pada project Anda.
  • Agen Layanan Google API dengan izin edit di project Anda.
  • Akun layanan Google Kubernetes Engine 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.

Untuk memverifikasi apakah akun layanan Google Kubernetes Engine memiliki peran Agen Layanan Kubernetes Engine yang ditetapkan pada project, selesaikan langkah-langkah berikut:

  1. 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.

  2. 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

  1. Buka halaman APIs & Services di Konsol Google Cloud.

    Buka API & Layanan

  2. Pilih project Anda.

  3. Klik Aktifkan API dan Layanan.

  4. Telusuri Kubernetes, lalu pilih API dari hasil penelusuran.

  5. 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.