Memecahkan masalah pembuatan atau upgrade cluster

Anda dapat mendiagnosis dan menyelesaikan masalah yang terjadi saat menginstal atau mengupgrade cluster Google Distributed Cloud. Memeriksa log diagnostik dan status node membantu Anda mengidentifikasi penyebab kegagalan dan memulihkan operasi yang terganggu.

Masalah penginstalan

Bagian berikut dapat membantu Anda memecahkan masalah terkait penginstalan Google Distributed Cloud.

Pesan error sementara

Proses penginstalan untuk Google Distributed Cloud adalah loop rekonsiliasi berkelanjutan. Akibatnya, Anda mungkin melihat pesan error sementara di log selama penginstalan.

Selama penginstalan berhasil diselesaikan, error ini dapat diabaikan dengan aman. Berikut adalah daftar pesan log error sementara yang umum:

  Internal error occurred: failed calling webhook "webhook.cert-manager.io": Post
  https://cert-manager-webhook.cert-manager.svc:443/mutate?timeout=10s:
  dial tcp IP_ADDRESS:443: connect: connection refused
  Internal error occurred: failed calling webhook "vcluster.kb.io": Post
  https://webhook-service.kube-system.svc:443/validate-baremetal-cluster-gke-io-v1-cluster?timeout=30s:
  dial tcp IP_ADDRESS:443: connect: connection refused
  Failed to register cluster with GKE Hub; gcloud output: error running command
  'gcloud container fleet memberships register CLUSTER_NAME  --verbosity=error --quiet':
  error: exit status 1, stderr: 'ERROR: (gcloud.container.hub.memberships.register)
  Failed to check if the user is a cluster-admin: Unable to connect to the server: EOF
  Get
  https://127.0.0.1:34483/apis/infrastructure.baremetal.cluster.gke.io/v1/namespaces/cluster-
  cluster1/baremetalmachines: dial tcp 127.0.0.1:34483: connect: connection refused"
  Create Kind Cluster "msg"="apply run failed" "error"="unable to recognize \"/tmp/kout088683152\": no matches for kind \"NetworkLogging\" in version \"networking.gke.io/v1alpha1\""
  Create Kind Cluster "msg"="apply run failed" "error"="unable to recognize \"/tmp/kout869681888\": no matches for kind \"Provider\" in version \"clusterctl.cluster.x-k8s.io/v1alpha3\""

Jika kunci akun layanan Google Cloud Anda telah habis masa berlakunya, Anda akan melihat pesan error berikut dari bmctl:

Error validating cluster config: 3 errors occurred:
        * GKEConnect check failed: Get https://gkehub.googleapis.com/v1beta1/projects/project/locations/global/memberships/admin: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
        * ClusterOperations check failed: Post https://cloudresourcemanager.googleapis.com/v1/projects/project:testIamPermissions?alt=json&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
        * GCR pull permission for bucket: artifacts.anthos-baremetal-release.appspot.com failed: Get https://storage.googleapis.com/storage/v1/b/artifacts.anthos-baremetal-release.appspot.com/iam/testPermissions?alt=json&permissions=storage.objects.get&permissions=storage.objects.list&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}

Anda perlu membuat kunci akun layanan baru.

Menggunakan cluster bootstrap untuk men-debug masalah

Saat Google Distributed Cloud membuat cluster yang dikelola sendiri (admin, hybrid, atau mandiri), Google Distributed Cloud akan men-deploy cluster Kubernetes di Docker (kind) untuk menghosting sementara pengontrol Kubernetes yang diperlukan untuk membuat cluster. Cluster sementara ini disebut cluster bootstrap. Cluster pengguna dibuat dan diupgrade oleh cluster admin atau hybrid pengelolanya tanpa menggunakan cluster bootstrap.

Jika cluster kind sudah ada dalam deployment Anda saat Anda mencoba menginstal, Google Distributed Cloud akan menghapus cluster kind yang ada. Penghapusan hanya terjadi setelah penginstalan atau upgrade berhasil. Untuk mempertahankan cluster kind yang ada bahkan setelah berhasil, gunakan flag --keep-bootstrap-cluster dari bmctl.

Google Distributed Cloud membuat file konfigurasi untuk cluster bootstrap di bagian WORKSPACE_DIR/.kindkubeconfig. Anda dapat terhubung ke cluster bootstrap hanya selama pembuatan dan upgrade cluster.

Cluster bootstrap perlu mengakses repositori Docker untuk mengambil image. Registry ditetapkan secara default ke Artifact Registry, kecuali jika Anda menggunakan registry pribadi. Selama pembuatan cluster,bmctl membuat file berikut:

  • bmctl-workspace/config.json: Berisi kredensial akun layanan Google Cloud untuk akses registry. Kredensial diperoleh dari kolom gcrKeyPath di file konfigurasi cluster.

  • bmctl-workspace/config.toml: Berisi konfigurasi containerd di cluster kind.

Memeriksa log cluster bootstrap

Untuk men-debug cluster bootstrap, Anda dapat melakukan langkah-langkah berikut:

  • Terhubung ke cluster bootstrap selama pembuatan dan upgrade cluster.
  • Dapatkan log cluster bootstrap.

Anda dapat menemukan log di mesin yang Anda gunakan untuk menjalankan bmctl di folder berikut:

  • bmctl-workspace/CLUSTER_NAME/log/create-cluster-TIMESTAMP/bootstrap-cluster/
  • bmctl-workspace/CLUSTER_NAME/log/upgrade-cluster-TIMESTAMP/bootstrap-cluster/

Ganti CLUSTER_NAME dan TIMESTAMP dengan nama cluster Anda dan waktu sistem yang sesuai.

Untuk mendapatkan log dari cluster bootstrap secara langsung, Anda dapat menjalankan perintah berikut selama pembuatan dan upgrade cluster:

docker exec -it bmctl-control-plane bash

Perintah ini akan membuka terminal di dalam container bidang kontrol bmctl yang berjalan di cluster bootstrap.

Untuk memeriksa log kubelet dan containerd, gunakan perintah berikut dan cari error atau peringatan dalam output:

journalctl -u kubelet
journalctl -u containerd

Mengaktifkan logging debug containerd

Jika log containerd standar tidak memberikan informasi yang cukup untuk pemecahan masalah, Anda dapat meningkatkan level logging. Meningkatkan level logging sering kali diperlukan saat mendiagnosis masalah yang kompleks, seperti masalah dengan mirror registry atau error ImagePullBackOff.

Untuk meningkatkan level logging, lakukan hal berikut:

  1. Aktifkan logging debug:

    1. Buka file konfigurasi containerd (/etc/containerd/config.toml) menggunakan editor teks pilihan Anda.

    2. Dalam file, temukan bagian [debug] dan ubah nilai level dari "" menjadi "debug".

    3. Simpan file dan keluar dari editor teks.

    4. Pastikan Anda berhasil memperbarui file konfigurasi:

      cat /etc/containerd/config.toml | grep debug
      

      Output harus berupa yang berikut ini:

      [debug]
        level = "debug"
          shim_debug = false
      
    5. Untuk menerapkan perubahan pada level logging, mulai ulang containerd:

      sudo systemctl restart containerd
      
  2. Untuk membuat entri log baru, coba ambil image yang tidak ada atau tidak digunakan oleh node atau cluster apa pun. Contoh:

    # This command fails because the image doesn't exist
    crictl pull us-west1-docker.pkg.dev/gdc-project/samples/non-existent-image:latest
    

    Tindakan ini akan memaksa containerd untuk melakukan tindakan dan membuat log mendetail.

  3. Tunggu hingga image ditarik atau gagal, lalu kumpulkan log containerd dalam file bernama containerd_log.txt:

    journalctl -u containerd --no-pager --since TIME_PERIOD > containerd_log.txt
    

    Ganti TIME_PERIOD dengan nilai yang menentukan waktu mulai untuk log. Sertakan nilai apa pun yang berisi spasi dalam tanda kutip ganda. Contoh, "2 hours ago".

  4. Setelah Anda selesai memecahkan masalah, kembalikan level log ke default. Membiarkan logging debug diaktifkan dapat membanjiri log sistem Anda, memengaruhi performa, dan berpotensi mengekspos informasi sensitif.

    1. Buka file /etc/containerd/config.toml dan ubah nilai level kembali ke "", level logging default.

    2. Pastikan Anda berhasil memperbarui konfigurasi:

      cat /etc/containerd/config.toml | grep level
      

      Output harus berupa yang berikut ini:

      level = ""
      
    3. Untuk menerapkan perubahan, mulai ulang containerd:

      sudo systemctl restart containerd
      

      Sistem Anda kini kembali ke konfigurasi logging standarnya.

Masalah upgrade cluster

Saat mengupgrade cluster Google Distributed Cloud, Anda dapat memantau progres dan memeriksa status cluster dan node.

Panduan berikut dapat membantu menentukan apakah upgrade berlanjut seperti biasa atau ada masalah.

Memantau progres upgrade

Gunakan perintah kubectl describe cluster untuk melihat status cluster selama proses upgrade:

kubectl describe cluster CLUSTER_NAME \
    --namespace CLUSTER_NAMESPACE \
    --kubeconfig ADMIN_KUBECONFIG

Ganti nilai berikut:

  • CLUSTER_NAME: nama cluster Anda.
  • CLUSTER_NAMESPACE: namespace cluster Anda.
  • ADMIN_KUBECONFIG: file kubeconfig admin.
    • Secara default, cluster admin, hybrid, dan mandiri menggunakan upgrade di tempat. Jika Anda menggunakan flag --use-bootstrap=true dengan perintah bmctl upgrade, operasi upgrade akan menggunakan cluster bootstrap. Untuk memantau progres upgrade saat cluster bootstrap digunakan, tentukan jalur ke file kubeconfig cluster bootstrap, .kindkubeconfig. File ini terletak di direktori ruang kerja.

Lihat bagian Status pada output, yang menampilkan agregasi status upgrade cluster. Jika cluster melaporkan error, gunakan bagian berikut untuk memecahkan masalahnya.

Memeriksa apakah node sudah siap

Gunakan perintah kubectl get nodes untuk melihat status node dalam cluster selama proses upgrade:

kubectl get nodes --kubeconfig KUBECONFIG

Untuk memeriksa apakah node telah berhasil menyelesaikan proses upgrade, lihat kolom VERSION dan AGE dalam respons perintah. VERSION adalah versi Kubernetes untuk cluster. Untuk melihat versi Kubernetes untuk versi Google Distributed Cloud tertentu, lihat Pembuatan Versi.

Jika node menampilkan NOT READY, coba hubungkan node dan periksa status kubelet:

systemctl status kubelet

Anda juga dapat meninjau log kubelet:

journalctl -u kubelet

Tinjau output status kubelet dan log untuk pesan yang menunjukkan penyebab node mengalami masalah.

Memeriksa node yang sedang diupgrade

Untuk memeriksa node mana dalam cluster yang sedang dalam proses upgrade, gunakan perintah kubectl get baremetalmachines:

kubectl get baremetalmachines --namespace CLUSTER_NAMESPACE \
    --kubeconfig ADMIN_KUBECONFIG

Ganti nilai berikut:

  • CLUSTER_NAMESPACE: namespace cluster Anda.
  • ADMIN_KUBECONFIG: file kubeconfig admin.
    • Jika cluster bootstrap digunakan untuk upgrade admin, hybrid, atau mandiri, tentukan file kubeconfig cluster bootstrap (bmctl-workspace/.kindkubeconfig).

Contoh output berikut menunjukkan bahwa node yang diupgrade memiliki ABM VERSION yang berbeda dari DESIRED ABM VERSION:

NAME         CLUSTER    READY   INSTANCEID               MACHINE      ABM VERSION   DESIRED ABM VERSION
10.200.0.2   cluster1   true    baremetal://10.200.0.2   10.200.0.2   1.13.0        1.14.0
10.200.0.3   cluster1   true    baremetal://10.200.0.3   10.200.0.3   1.13.0        1.13.0

Memeriksa node yang sedang dalam proses pengosongan

Selama proses upgrade, Pod akan dikosongkan dari node, dan penjadwalan akan dinonaktifkan hingga node berhasil diupgrade. Untuk melihat node mana yang sedang dikosongkan, gunakan perintah kubectl get nodes:

kubectl get nodes --kubeconfig USER_CLUSTER_KUBECONFIG | grep "SchedulingDisabled"

Ganti USER_CLUSTER_KUBECONFIG dengan jalur ke file kubeconfig cluster pengguna.

Kolom STATUS difilter menggunakan grep untuk hanya menampilkan node yang melaporkan SchedulingDisabled. Status ini menunjukkan bahwa node sedang dikosongkan.

Anda juga dapat memeriksa status node dari cluster admin:

kubectl get baremetalmachines -n CLUSTER_NAMESPACE \
  --kubeconfig ADMIN_KUBECONFIG

Ganti nilai berikut:

  • CLUSTER_NAMESPACE: namespace cluster Anda.
  • ADMIN_KUBECONFIG: file kubeconfig admin.
    • Jika cluster bootstrap digunakan untuk upgrade admin, hybrid, atau mandiri, tentukan file kubeconfig cluster bootstrap (bmctl-workspace/.kindkubeconfig).

Node yang dikosongkan menampilkan status di kolom MAINTENANCE.

Memeriksa alasan node berada dalam status pengosongan untuk waktu yang lama

Gunakan salah satu metode di bagian sebelumnya untuk mengidentifikasi node yang dikosongkan menggunakan perintah kubectl get nodes. Gunakan perintah kubectl get pods dan filter pada nama node ini untuk melihat detail tambahan:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=NODE_NAME

Ganti NODE_NAME dengan nama node yang sedang dikosongkan. Output akan menampilkan daftar Pod yang macet atau lambat untuk dikosongkan. Upgrade akan dilanjutkan, meskipun ada Pod yang macet, jika proses pengosongan pada node memerlukan waktu lebih dari 20 menit.

Mulai rilis 1.29, proses pengosongan node menggunakan Eviction API, yang mematuhi PodDisruptionBudgets (PDB).

Setelan PDB berikut dapat menyebabkan masalah pengosongan node:

  • Pod yang dikelola oleh beberapa PDB

  • Konfigurasi statis PDB seperti berikut:

    • maxUnavailable == 0
    • minUnavailable >= total replika

    Total jumlah replika sulit ditentukan dari resource PDB, karena ditentukan dalam resource tingkat yang lebih tinggi, seperti Deployment, ReplicaSet, atau StatefulSet. PDB cocok dengan pod hanya berdasarkan pemilih dalam konfigurasinya. Pendekatan yang baik untuk mendiagnosis apakah konfigurasi PDB statis menyebabkan masalah adalah dengan melihat apakah pdb.Status.ExpectPods <= pdb.Status.DesiredHealthy terlebih dahulu dan melihat apakah salah satu konfigurasi statis yang disebutkan memungkinkan hal ini terjadi.

Pelanggaran runtime, seperti nilai DisruptionsAllowed yang dihitung untuk resource PDB yang bernilai 0, juga dapat memblokir pengosongan node. Jika Anda memiliki objek PodDisruptionBudget yang dikonfigurasi untuk tidak mengizinkan gangguan tambahan, upgrade node mungkin akan gagal untuk mengupgrade ke versi bidang kontrol setelah beberapa percobaan. Untuk mencegah kegagalan ini, sebaiknya tingkatkan skala Deployment atau HorizontalPodAutoscaler agar node dapat dihabiskan sambil tetap mematuhi konfigurasi PodDisruptionBudget.

Untuk melihat semua objek PodDisruptionBudget yang tidak mengizinkan gangguan, gunakan perintah berikut:

kubectl get poddisruptionbudget --all-namespaces \
    -o jsonpath='{range .items[?(@.status.disruptionsAllowed==0)]}{.metadata.name}/{.metadata.namespace}{"\n"}{end}'

Memeriksa alasan Pod tidak responsif

Upgrade dapat gagal jika Pod berisi alamat IP bidang kontrol upgrade-first-node atau upgrade-node. Perilaku ini biasanya terjadi karena Pod statis tidak responsif.

  1. Periksa Pod statis dengan perintah crictl ps -a dan cari Pod Kubernetes atau etcd yang error. Jika ada Pod yang gagal, tinjau log untuk Pod tersebut guna mengetahui penyebab errornya.

    Beberapa kemungkinan perilaku crashloop mencakup hal berikut:

    • Izin atau pemilik file yang dipasang ke Pod statis tidak benar.
    • Konektivitas ke alamat IP virtual tidak berfungsi.
    • Masalah terkait etcd.
  2. Jika perintah crictl ps tidak berfungsi atau tidak menampilkan apa pun, periksa status kubelet dan containerd. Gunakan perintah systemctl status SERVICE dan journalctl -u SERVICE untuk melihat log.

Langkah berikutnya

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care. Anda juga dapat melihat Mendapatkan dukungan untuk mengetahui informasi selengkapnya tentang referensi dukungan, termasuk referensi berikut:

  • Persyaratan untuk membuka kasus dukungan.
  • Alat untuk membantu Anda memecahkan masalah, seperti konfigurasi lingkungan, log, dan metrik.
  • Komponen yang didukung.