Detektor Masalah Node (NPD) di node Layanan Kubernetes Azure (AKS)

Node Problem Detector (NPD) adalah komponen Kubernetes sumber terbuka yang mendeteksi masalah terkait node dan melaporkannya. Dijalankan sebagai layanan systemd di setiap node dalam kluster dan mengumpulkan berbagai metrik serta informasi sistem, seperti penggunaan CPU, penggunaan disk, dan konektivitas jaringan. Ketika mendeteksi masalah, itu menghasilkan peristiwa dan/atau kondisi node. Layanan Azure Kubernetes (AKS) menggunakan NPD untuk memonitor dan mengelola node dalam kluster Kubernetes yang berjalan di platform cloud Azure. Ekstensi AKS Linux mengaktifkan NPD secara default.

Catatan

Peningkatan ke NPD tidak bergantung pada citra simpul dan proses pembaruan versi Kubernetes. Jika kumpulan simpul tidak sehat (yaitu, dalam keadaan gagal), versi NPD baru tidak diinstal.

Kondisi Node

Kondisi node menunjukkan masalah permanen yang membuat node tidak tersedia. AKS menggunakan kondisi node berikut dari NPD untuk mengungkap masalah permanen pada node tersebut. NPD juga memancarkan event Kubernetes yang sesuai.

Jenis Daemon Masalah NodeCondition Alasan Jenis komputasi
CustomPluginMonitor Masalah Kerusakan Sistem File Kerusakan Sistem Berkas Terdeteksi Tujuan umum
CustomPluginMonitor KubeletProblem KubeletIsDown Tujuan umum
CustomPluginMonitor MasalahRuntimeContainer Container runtime sedang tidak beroperasi. Tujuan umum
CustomPluginMonitor VMEventScheduled VMEventScheduled Tujuan umum
CustomPluginMonitor SeringMencabutPendaftaranPerangkatJaringan UnregisterNetDevice Tujuan umum
CustomPluginMonitor FrequentKubeletRestart FrequentKubeletRestart Tujuan umum
CustomPluginMonitor FrequentContainerdRestart FrequentContainerdRestart Tujuan umum
CustomPluginMonitor SeringMulaiUlangDocker SeringMulaiUlangDocker Tujuan umum
CustomPluginMonitor GPUMissing Jumlah GPU yang diamati tidak cocok dengan jumlah GPU yang diharapkan Hanya GPU
CustomPluginMonitor Status NVLink Tidak Aktif Status NVLink Tidak Aktif Hanya GPU
CustomPluginMonitor XIDErrors Kesalahan XID ada di log kernel Hanya GPU
CustomPluginMonitor IBLinkFlapping Konektivitas perangkat InfiniBand terputus-terputus Hanya GPU
CustomPluginMonitor Pembatasan Kecepatan Jam GPU (GPUClockThrottling) Pembatasan jam GPU bermasalah terdeteksi Hanya GPU
CustomPluginMonitor PluginPerangkatNvidiaTidakSehat Layanan plugin perangkat NVIDIA tidak aktif Hanya GPU (GPU terkelola)
SystemLogMonitor KernelDeadlock DockerHung Tujuan umum
SystemLogMonitor ReadonlyFilesystem Sistem FileHanyaBaca Tujuan umum

Catatan

Kondisi GPU only berlaku untuk semua node pool GPU yang menggunakan driver GPU yang dikelola oleh AKS (node pool tidak dibuat dengan --gpu-driver none). Kondisi GPU only (managed GPU) hanya berlaku untuk kumpulan simpul dengan pengalaman GPU yang dikelola sepenuhnya diaktifkan. Pemantauan kesehatan GPU didukung pada kumpulan simpul GPU standar dan GPU yang mendukung MIG.

Peristiwa

NPD memancarkan kejadian yang dilengkapi dengan informasi yang relevan untuk membantu Anda mendiagnosis masalah mendasar.

Jenis Daemon Masalah Alasan Frekuensi Deskripsi Tindakan
CustomPluginMonitor EgressBlocked 30 menit Peristiwa ini memeriksa konektivitas eksternal ke titik akhir Periksa apakah firewall atau NSG memblokir konektivitas ke titik akhir yang ditandai
CustomPluginMonitor Kerusakan Sistem Berkas Terdeteksi 5 menit Ini memeriksa kerusakan sistem file yang disebabkan oleh Docker
CustomPluginMonitor KubeletIsDown 30 detik Ini memeriksa apakah layanan kubelet berjalan dan sehat
CustomPluginMonitor Container runtime sedang tidak beroperasi. 30 detik Pemeriksaan ini memeriksa apakah runtime kontainer, seperti containerd, sedang berjalan dan dalam kondisi baik.
CustomPluginMonitor FreezeScheduled 1 menit Kejadian ini memeriksa apakah Peristiwa Beku dijadwalkan pada simpul. Lihat https://aka.ms/aks/scheduledevents untuk informasi lebih lanjut
CustomPluginMonitor Jadwal Ulang Mulai 1 menit Kejadian ini memeriksa apakah peristiwa reboot dijadwalkan pada simpul Check https://aka.ms/aks/scheduledevents untuk informasi lebih lanjut
CustomPluginMonitor Penjadwalan Ulang Penerapan 1 menit Acara ini memeriksa apakah Acara Penempatan Ulang dijadwalkan pada node. Lihat https://aka.ms/aks/scheduledevents untuk informasi lebih lanjut
CustomPluginMonitor Terminasikan Terjadwal 1 menit Peristiwa ini memeriksa apakah Peristiwa Penghentian dijadwalkan pada node. Lihat https://aka.ms/aks/scheduledevents untuk informasi lebih lanjut
CustomPluginMonitor Dijadwalkan Ulang 2 detik Kejadian ini memeriksa apakah Peristiwa Preemptif dijadwalkan pada node. Lihat https://aka.ms/aks/scheduledevents untuk informasi lebih lanjut
CustomPluginMonitor DNSProblem
SystemLogMonitor OOMKilling
SystemLogMonitor TaskHung
SystemLogMonitor UnregisterNetDevice
SystemLogMonitor KernelOops
SystemLogMonitor DockerSocketTidakDapatTerhubung
SystemLogMonitor KubeletRPCDeadlineExceeded
SystemLogMonitor KubeletRPCNoSuchContainer
SystemLogMonitor CNICannotStatFS
SystemLogMonitor PLEGTidak Sehat
SystemLogMonitor KubeletStart
SystemLogMonitor DockerStart
SystemLogMonitor ContainerdStart

Dalam beberapa kasus, AKS secara otomatis mengisolasi dan menguras node untuk meminimalkan gangguan pada beban kerja. Untuk informasi selengkapnya tentang peristiwa dan tindakan, lihat Pengurasan otomatis simpul.

EgressBlocked

Daftar titik akhir yang diperiksa oleh EgressBlocked tercantum di bawah ini

Catatan

Titik akhir aktual akan bergantung pada jenis kluster dan lokasi tempatnya dihosting (Cloud publik vs cloud Airgapped). Tinjau dokumentasi untuk akses keluar di sini. Dokumentasi ini untuk cloud publik

Tipe Contoh Catatan
MCR https://mcr.microsoft.com
Microsoft Entra ID https://login.microsoftonline.com
Resource Manager https://management.azure.com
Paket https://packages.microsoft.com
Binari Kube https://acs-mirror.azureedge.net/acs-mirror/healthz
https://packages.aks.azure.com/acs-mirror/healthz

Periksa kondisi dan kejadian simpul

  • Periksa kondisi node dan peristiwa menggunakan perintah kubectl describe node.

    kubectl describe node my-aks-node
    

    Output Anda akan terlihat mirip dengan contoh output ringkas berikut:

    ...
    ...
    
    Conditions:
      Type                          Status  LastHeartbeatTime                 LastTransitionTime                Reason                          Message
      ----                          ------  -----------------                 ------------------                ------                          -------
      VMEventScheduled              False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoVMEventScheduled              VM has no scheduled event
      FrequentContainerdRestart     False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentContainerdRestart     containerd is functioning properly
      FrequentDockerRestart         False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentDockerRestart         docker is functioning properly
      FilesystemCorruptionProblem   False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   FilesystemIsOK                  Filesystem is healthy
      FrequentUnregisterNetDevice   False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentUnregisterNetDevice   node is functioning properly
      ContainerRuntimeProblem       False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:40 +0000   ContainerRuntimeIsUp            container runtime service is up
      KernelDeadlock                False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   KernelHasNoDeadlock             kernel has no deadlock
      FrequentKubeletRestart        False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentKubeletRestart        kubelet is functioning properly
      KubeletProblem                False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   KubeletIsUp                     kubelet service is up
      ReadonlyFilesystem            False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   FilesystemIsNotReadOnly         Filesystem is not read-only
      NetworkUnavailable            False   Thu, 01 Jun 2023 03:58:39 +0000   Thu, 01 Jun 2023 03:58:39 +0000   RouteCreated                    RouteController created a route
      MemoryPressure                True    Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 19:16:50 +0000   KubeletHasInsufficientMemory    kubelet has insufficient memory available
      DiskPressure                  False   Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 03:57:22 +0000   KubeletHasNoDiskPressure        kubelet has no disk pressure
      PIDPressure                   False   Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 03:57:22 +0000   KubeletHasSufficientPID         kubelet has sufficient PID available
      Ready                         True    Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 03:57:23 +0000   KubeletReady                    kubelet is posting ready status. AppArmor enabled
    ...
    ...
    ...
    Events:
      Type    Reason                   Age                  From     Message
      ----    ------                   ----                 ----     -------
      Normal  NodeHasSufficientMemory  94s (x176 over 15h)  kubelet  Node aks-agentpool-40622340-vmss000009 status is now: NodeHasSufficientMemory
    

Acara-acara ini juga tersedia di Container Insights melalui KubeEvents.

Metode pengukuran

NPD juga menampilkan metrik Prometheus berdasarkan masalah node, yang dapat Anda gunakan untuk pemantauan dan pemberitahuan. Metrik-metrik ini diekspos pada port 20257 dari IP Node dan Prometheus dapat mengumpulkannya.

Contoh YAML berikut menunjukkan konfigurasi scrape yang dapat Anda gunakan dengan Azure Managed Prometheus add-on sebagai DaemonSet:

kind: ConfigMap
apiVersion: v1
metadata:
  name: ama-metrics-prometheus-config-node
  namespace: kube-system
data:
  prometheus-config: |-
    global:
      scrape_interval: 1m
    scrape_configs:
    - job_name: node-problem-detector
      scrape_interval: 1m
      scheme: http
      metrics_path: /metrics
      relabel_configs:
      - source_labels: [__metrics_path__]
        regex: (.*)
        target_label: metrics_path
      - source_labels: [__address__]
        replacement: '$NODE_NAME'
        target_label: instance
      static_configs:
      - targets: ['$NODE_IP:20257']

Contoh berikut menunjukkan metrik yang diambil:

problem_gauge{reason="UnregisterNetDevice",type="FrequentUnregisterNetDevice"} 0
problem_gauge{reason="VMEventScheduled",type="VMEventScheduled"} 0

Langkah selanjutnya

Untuk informasi lebih lanjut tentang NPD, lihat kubernetes/node-problem-detector.