Memecahkan masalah cluster Autopilot


Halaman ini menunjukkan cara menyelesaikan masalah pada cluster Autopilot Google Kubernetes Engine (GKE).

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.

Masalah cluster

Tidak dapat membuat cluster: 0 node terdaftar

Masalah berikut terjadi saat Anda mencoba membuat cluster Autopilot dengan akun layanan IAM nonaktif atau tidak memiliki izin yang diperlukan. Pembuatan cluster gagal dengan pesan error berikut:

All cluster resources were brought up, but: only 0 nodes out of 2 have registered.

Untuk mengatasi masalah tersebut, lakukan langkah berikut:

  1. Periksa apakah akun layanan Compute Engine default atau akun layanan IAM kustom yang ingin Anda gunakan sedang nonaktif:

    gcloud iam service-accounts describe SERVICE_ACCOUNT
    

    Ganti SERVICE_ACCOUNT dengan alamat email akun layanan, seperti my-iam-account@my-first-project.iam.gserviceaccount.com.

    Jika akun layanan nonaktif, output-nya akan mirip dengan berikut ini:

    disabled: true
    displayName: my-service-account
    email: my-service-account@my-project.iam.gserviceaccount.com
    ...
    
  2. Jika akun layanan nonaktif, aktifkan:

    gcloud iam service-accounts enable SERVICE_ACCOUNT
    

Jika akun layanan sudah aktif dan error tetap berlanjut, berikan izin minimum yang diperlukan untuk GKE kepada akun layanan:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:SERVICE_ACCOUNT" \
    --role roles/container.nodeServiceAccount

Namespace macet dalam status Terminating saat cluster memiliki 0 node

Masalah berikut terjadi saat Anda menghapus namespace di sebuah cluster setelah cluster memperkecil skala hingga nol node. Komponen metrics-server tidak dapat menerima permintaan penghapusan namespace karena komponen tidak memiliki replika.

Untuk mendiagnosis masalah ini, jalankan perintah berikut:

kubectl describe ns/NAMESPACE_NAME

Ganti NAMESPACE_NAME dengan nama namespace.

Output-nya adalah sebagai berikut:

Discovery failed for some groups, 1 failing: unable to retrieve the complete
list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to
handle the request

Untuk mengatasi masalah ini, tingkatkan skala workload apa pun untuk memicu GKE guna membuat node baru. Saat node sudah siap, permintaan penghapusan namespace akan otomatis selesai. Setelah GKE menghapus namespace, turunkan skala workload.

Masalah penskalaan

Peningkatan skala node gagal: Pod berisiko tidak dijadwalkan

Masalah berikut terjadi jika logging port serial dinonaktifkan di project Google Cloud Anda. Cluster Autopilot GKE memerlukan logging port serial untuk men-debug masalah node secara efektif. Jika logging port serial dinonaktifkan, Autopilot tidak dapat menyediakan node untuk menjalankan workload Anda.

Pesan error di log peristiwa Kubernetes Anda mirip dengan pesan berikut:

LAST SEEN   TYPE      REASON          OBJECT                          MESSAGE
12s         Warning   FailedScaleUp   pod/pod-test-5b97f7c978-h9lvl   Node scale up in zones associated with this pod failed: Internal error. Pod is at risk of not being scheduled

Logging port serial mungkin dinonaktifkan di tingkat organisasi melalui kebijakan organisasi yang menerapkan batasan compute.disableSerialPortLogging. Logging port serial juga dapat dinonaktifkan di tingkat project atau instance virtual machine (VM).

Untuk mengatasi masalah ini, lakukan langkah berikut:

  1. Minta administrator kebijakan organisasi Google Cloud Anda untuk menghapus batasan compute.disableSerialPortLogging dalam project yang berisi cluster Autopilot Anda.
  2. Jika Anda tidak memiliki kebijakan organisasi yang menerapkan batasan ini, coba aktifkan logging port serial di metadata project Anda. Tindakan ini memerlukan izin IAM compute.projects.setCommonInstanceMetadata.

Peningkatan skala node gagal: GCE kehabisan resource

Masalah berikut terjadi saat workload Anda meminta lebih banyak resource daripada yang tersedia untuk digunakan di region atau zona Compute Engine tersebut. Pod Anda mungkin tetap dalam status Pending.

  • Periksa peristiwa Pod Anda:

    kubectl events --for='pod/POD_NAME' --types=Warning
    

    Ganti RESOURCE_NAME dengan nama resource Kubernetes yang tertunda. Contohnya, pod/example-pod.

    Outputnya mirip dengan hal berikut ini:

    LAST SEEN         TYPE            REASON                  OBJECT                   Message
    19m               Warning         FailedScheduling        pod/example-pod          gke.io/optimize-utilization-scheduler  0/2 nodes are available: 2 node(s) didn't match Pod's node affinity/selector. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
    14m               Warning         FailedScheduling        pod/example-pod          gke.io/optimize-utilization-scheduler  0/2 nodes are available: 2 node(s) didn't match Pod's node affinity/selector. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
    12m (x2 over 18m) Warning         FailedScaleUp           cluster-autoscaler       Node scale up in zones us-central1-f associated with this pod failed: GCE out of resources. Pod is at risk of not being scheduled.
    34s (x3 over 17m) Warning         FailedScaleUp           cluster-autoscaler       Node scale up in zones us-central1-b associated with this pod failed: GCE out of resources. Pod is at risk of not being scheduled.
    

Untuk mengatasi masalah ini, coba langkah-langkah berikut:

  • Deploy Pod di region atau zona yang berbeda. Jika Pod Anda memiliki pembatasan zona seperti pemilih topologi, hapus pembatasan jika memungkinkan. Untuk mengetahui petunjuknya, lihat Menempatkan Pod GKE di zona tertentu.
  • Buat cluster di region lain dan coba lagi deployment.
  • Coba gunakan class komputasi yang berbeda. Class komputasi yang didukung oleh jenis mesin Compute Engine yang lebih kecil cenderung memiliki resource yang tersedia. Misalnya, jenis mesin default untuk Autopilot memiliki ketersediaan tertinggi. Untuk mengetahui daftar class komputasi dan jenis mesin yang sesuai, lihat Kapan harus menggunakan class komputasi tertentu.
  • Jika Anda menjalankan beban kerja GPU, GPU yang diminta mungkin tidak tersedia di lokasi node Anda. Coba deploy workload Anda di lokasi lain atau minta jenis GPU yang berbeda.

Untuk menghindari masalah penskalaan yang disebabkan oleh ketersediaan resource di masa mendatang, pertimbangkan pendekatan berikut:

Node gagal ditingkatkan skalanya: Resource zona pod terlampaui

Masalah berikut terjadi saat Autopilot tidak menyediakan node baru untuk Pod di zona tertentu karena node baru akan melanggar batas resource.

Pesan error di log Anda mirip dengan berikut ini:

    "napFailureReasons": [
            {
              "messageId": "no.scale.up.nap.pod.zonal.resources.exceeded",
              ...

Error ini merujuk ke peristiwa noScaleUp, di mana penyediaan node secara otomatis tidak menghasilkan grup node apa pun untuk Pod di zona itu.

Jika Anda mengalami error ini, konfirmasi hal berikut:

Masalah workload

Workload macet dengan error penyimpanan efemeral

GKE tidak akan membuat Pod jika permintaan penyimpanan sementara Pod Anda melebihi maksimum Autopilot sebesar 10 GiB di GKE versi 1.28.6-gke.1317000 dan yang lebih baru.

Untuk mendiagnosis masalah ini, jelaskan pengontrol beban kerja, seperti Deployment atau Tugas:

kubectl describe CONTROLLER_TYPE/CONTROLLER_NAME

Ganti kode berikut:

  • CONTROLLER_TYPE: jenis pengontrol beban kerja, seperti replicaset atau daemonset. Untuk daftar jenis pengontrol, lihat Pengelolaan workload.
  • CONTROLLER_NAME: nama workload yang macet.

Jika Pod tidak dibuat karena permintaan penyimpanan sementara melebihi maksimum, output-nya akan seperti berikut:

# lines omitted for clarity

Events:

{"[denied by autogke-pod-limit-constraints]":["Max ephemeral-storage requested by init containers for workload '' is higher than the Autopilot maximum of '10Gi'.","Total ephemeral-storage requested by containers for workload '' is higher than the Autopilot maximum of '10Gi'."]}

Untuk mengatasi masalah ini, perbarui permintaan penyimpanan efemeral Anda sehingga total penyimpanan efemeral yang diminta oleh penampung workload dan oleh penampung yang dimasukkan webhook kurang dari atau sama dengan maksimum yang diizinkan. Untuk informasi selengkapnya tentang maksimum, lihat Permintaan resource di Autopilot. untuk konfigurasi workload.

Pod terjebak dalam status Pending

Pod mungkin macet dalam status Pending jika Anda memilih node tertentu untuk digunakan Pod, tetapi jumlah permintaan resource di Pod dan DaemonSets yang harus berjalan di node melebihi kapasitas maksimum yang dapat dialokasikan untuk node tersebut. Hal ini dapat menyebabkan Pod Anda mendapatkan status Pending dan tetap tidak terjadwal.

Untuk menghindari masalah ini, evaluasi workload yang di-deploy guna memastikan ukurannya tidak melampaui batas permintaan resource maksimum yang didukung untuk Autopilot.

Anda juga dapat mencoba menjadwalkan DaemonSets sebelum menjadwalkan Pod workload reguler.

Performa workload di node tertentu selalu tidak dapat diandalkan

Pada GKE versi 1.24 dan yang lebih baru, jika workload di node tertentu terus-menerus mengalami gangguan, error, atau perilaku negatif serupa, Anda dapat memberi tahu GKE tentang node yang bermasalah dengan menutup aksesnya menggunakan perintah berikut:

kubectl drain NODE_NAME --ignore-daemonsets

Ganti NODE_NAME dengan nama node yang bermasalah. Anda dapat menemukan nama node dengan menjalankan kubectl get nodes.

GKE melakukan hal berikut:

  • Mengeluarkan workload yang ada dari node dan menghentikan penjadwalan workload di node tersebut.
  • Otomatis membuat ulang workload yang dikeluarkan yang dikelola oleh pengontrol, seperti Deployment atau StatefulSet, di node lain.
  • Menghentikan workload apa pun yang masih ada di node dan memperbaiki atau membuat ulang node tersebut dari waktu ke waktu.
  • Jika Anda menggunakan Autopilot, GKE akan langsung mematikan dan mengganti node tersebut serta mengabaikan semua PodDisruptionBudget yang telah dikonfigurasi.

Pod memerlukan waktu lebih lama dari yang diperkirakan untuk dijadwalkan di cluster kosong

Peristiwa ini terjadi saat Anda men-deploy workload ke cluster Autopilot yang tidak memiliki workload lain. Cluster Autopilot dimulai dengan nol node yang dapat digunakan dan diskalakan menjadi nol node jika cluster kosong untuk menghindari resource komputasi yang tidak digunakan di cluster. Men-deploy workload di cluster yang tidak memiliki node akan memicu peristiwa penskalaan.

Jika Anda mengalami hal ini, Autopilot berfungsi sebagaimana mestinya, dan Anda tidak perlu melakukan tindakan apa pun. Workload Anda akan di-deploy seperti yang diharapkan setelah node baru di-booting.

Periksa apakah Pod Anda menunggu node baru:

  1. Deskripsikan Pod yang tertunda:

    kubectl describe pod POD_NAME
    

    Ganti POD_NAME dengan nama Pod yang tertunda.

  2. Periksa bagian Events output. Jika Pod menunggu node baru, output-nya akan mirip dengan berikut ini:

    Events:
      Type     Reason            Age   From                                   Message
      ----     ------            ----  ----                                   -------
      Warning  FailedScheduling  11s   gke.io/optimize-utilization-scheduler  no nodes available to schedule pods
      Normal   TriggeredScaleUp  4s    cluster-autoscaler                     pod triggered scale-up: [{https://www.googleapis.com/compute/v1/projects/example-project/zones/example-zone/instanceGroups/gk3-example-cluster-pool-2-9293c6db-grp 0->1 (max: 1000)} {https://www.googleapis.com/compute/v1/projects/example-project/zones/example-zone/instanceGroups/gk3-example-cluster-pool-2-d99371e7-grp 0->1 (max: 1000)}]
    

    Peristiwa TriggeredScaleUp menunjukkan bahwa cluster Anda diskalakan dari nol node hingga sebanyak node yang diperlukan untuk menjalankan beban kerja yang di-deploy.

Akses ke node yang mendasarinya dilarang di cluster GKE Autopilot. Oleh karena itu, Anda harus menjalankan utilitas tcpdump dari dalam Pod, lalu menyalinnya menggunakan perintah kubectl cp. Jika Anda biasanya menjalankan utilitas tcpdump dari dalam Pod di cluster Autopilot GKE, Anda mungkin melihat error berikut:

    tcpdump: eth0: You don't have permission to perform this capture on that device
    (socket: Operation not permitted)

Hal ini terjadi karena GKE Autopilot, secara default, menerapkan konteks keamanan ke semua Pod yang menghapus kemampuan NET_RAW untuk mengurangi potensi kerentanan. Contoh:

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: tcpdump
  name: tcpdump
spec:
  containers:
  - image: nginx
    name: nginx
    resources:
      limits:
        cpu: 500m
        ephemeral-storage: 1Gi
        memory: 2Gi
      requests:
        cpu: 500m
        ephemeral-storage: 1Gi
        memory: 2Gi
    securityContext:
      capabilities:
        drop:
        - NET_RAW

Sebagai solusi, jika beban kerja Anda memerlukan kemampuan NET_RAW, Anda dapat mengaktifkannya kembali:

  1. Tambahkan kemampuan NET_RAW ke bagian securityContext dalam spesifikasi YAML Pod Anda:

    securityContext:
      capabilities:
        add:
        - NET_RAW
    
  2. Jalankan tcpdump dari dalam Pod:

    tcpdump port 53 -w packetcap.pcap
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
    
  3. Gunakan perintah kubectl cp untuk menyalinnya ke komputer lokal Anda untuk analisis lebih lanjut:

    kubectl cp POD_NAME:/PATH_TO_FILE/FILE_NAME/PATH_TO_FILE/FILE_NAME
    
  4. Gunakan kubectl exec untuk menjalankan perintah tcpdump guna melakukan pengambilan paket jaringan dan mengalihkan output:

    kubectl exec -it POD_NAME -- bash -c "tcpdump port 53 -w -" > packet-new.pcap
    

Langkah selanjutnya

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.