監控節點健康狀況

Node Problem Detector 是一個用於監控和報告節點健康狀況的守護程序。你可以將 Node Problem Detector 作為 DaemonSet 或獨立守護程序執行。Node Problem Detector 從各種守護程序收集有關節點問題的資訊,並將這些狀況作為節點 ConditionEvent 報告給 API 伺服器。

要了解如何安裝和使用 Node Problem Detector,請參閱 Node Problem Detector 專案文件

準備工作

你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個非控制平面主機的節點叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一

限制

啟用 Node Problem Detector

一些雲提供商將 Node Problem Detector 作為附加元件啟用。你也可以使用 kubectl 或透過建立附加元件 DaemonSet 來啟用 Node Problem Detector。

使用 kubectl 啟用 Node Problem Detector

kubectl 提供了最靈活的 Node Problem Detector 管理。你可以覆蓋預設配置以使其適應你的環境,或者檢測自定義節點問題。例如:

  1. 建立一個類似於 node-problem-detector.yaml 的 Node Problem Detector 配置

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-problem-detector-v0.1
      namespace: kube-system
      labels:
        k8s-app: node-problem-detector
        version: v0.1
        kubernetes.io/cluster-service: "true"
    spec:
      selector:
        matchLabels:
          k8s-app: node-problem-detector  
          version: v0.1
          kubernetes.io/cluster-service: "true"
      template:
        metadata:
          labels:
            k8s-app: node-problem-detector
            version: v0.1
            kubernetes.io/cluster-service: "true"
        spec:
          hostNetwork: true
          containers:
          - name: node-problem-detector
            image: registry.k8s.io/node-problem-detector:v0.1
            securityContext:
              privileged: true
            resources:
              limits:
                cpu: "200m"
                memory: "100Mi"
              requests:
                cpu: "20m"
                memory: "20Mi"
            volumeMounts:
            - name: log
              mountPath: /log
              readOnly: true
          volumes:
          - name: log
            hostPath:
              path: /var/log/
  2. 使用 kubectl 啟動節點問題檢測器

    kubectl apply -f https://k8s.io/examples/debug/node-problem-detector.yaml
    

使用附加元件 Pod 啟用 Node Problem Detector

如果你正在使用自定義叢集引導解決方案,並且不需要覆蓋預設配置,你可以利用附加元件 Pod 進一步自動化部署。

建立 node-problem-detector.yaml,並將配置儲存到控制平面節點上附加元件 Pod 的目錄 /etc/kubernetes/addons/node-problem-detector 中。

覆蓋配置

當構建 Node Problem Detector 的 Docker 映象時,預設配置是嵌入在其中的。

但是,你可以使用 ConfigMap 覆蓋配置

  1. 修改 config/ 中的配置檔案

  2. 建立 ConfigMap node-problem-detector-config

    kubectl create configmap node-problem-detector-config --from-file=config/
    
  3. 修改 node-problem-detector.yaml 以使用 ConfigMap

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-problem-detector-v0.1
      namespace: kube-system
      labels:
        k8s-app: node-problem-detector
        version: v0.1
        kubernetes.io/cluster-service: "true"
    spec:
      selector:
        matchLabels:
          k8s-app: node-problem-detector  
          version: v0.1
          kubernetes.io/cluster-service: "true"
      template:
        metadata:
          labels:
            k8s-app: node-problem-detector
            version: v0.1
            kubernetes.io/cluster-service: "true"
        spec:
          hostNetwork: true
          containers:
          - name: node-problem-detector
            image: registry.k8s.io/node-problem-detector:v0.1
            securityContext:
              privileged: true
            resources:
              limits:
                cpu: "200m"
                memory: "100Mi"
              requests:
                cpu: "20m"
                memory: "20Mi"
            volumeMounts:
            - name: log
              mountPath: /log
              readOnly: true
            - name: config # Overwrite the config/ directory with ConfigMap volume
              mountPath: /config
              readOnly: true
          volumes:
          - name: log
            hostPath:
              path: /var/log/
          - name: config # Define ConfigMap volume
            configMap:
              name: node-problem-detector-config
  4. 使用新配置檔案重新建立 Node Problem Detector

    # If you have a node-problem-detector running, delete before recreating
    kubectl delete -f https://k8s.io/examples/debug/node-problem-detector.yaml
    kubectl apply -f https://k8s.io/examples/debug/node-problem-detector-configmap.yaml
    

如果 Node Problem Detector 作為叢集附加元件執行,則不支援覆蓋配置。附加元件管理器不支援 ConfigMap

問題守護程序

問題守護程序是 Node Problem Detector 的一個子守護程序。它監控特定型別的節點問題,並將其報告給 Node Problem Detector。支援幾種型別的問題守護程序。

  • SystemLogMonitor 型別的守護程序監控系統日誌,並根據預定義的規則報告問題和指標。你可以為不同的日誌源自定義配置,例如 檔案日誌kmsg核心abrtsystemd

  • SystemStatsMonitor 型別的守護程序將各種與健康相關的系統統計資訊收集為指標。你可以透過更新其配置檔案來自定義其行為。

  • CustomPluginMonitor 型別的守護程序透過執行使用者定義的指令碼來呼叫和檢查各種節點問題。你可以使用不同的自定義外掛監視器來監視不同的問題,並透過更新配置檔案來自定義守護程序行為。

  • HealthChecker 型別的守護程序檢查節點上 kubelet 和容器執行時的健康狀況。

新增對其他日誌格式的支援

系統日誌監視器目前支援基於檔案的日誌、journald 和 kmsg。可以透過實現一個新的日誌監視器來新增其他來源。

新增自定義外掛監視器

你可以透過開發自定義外掛來擴充套件 Node Problem Detector,以執行用任何語言編寫的任何監視指令碼。監視指令碼必須符合退出程式碼和標準輸出中的外掛協議。有關更多資訊,請參閱外掛介面提案

匯出器

匯出器將節點問題和/或指標報告給某些後端。支援以下匯出器:

  • Kubernetes 匯出器:此匯出器將節點問題報告給 Kubernetes API 伺服器。臨時問題報告為事件,永久問題報告為節點狀況。

  • Prometheus 匯出器:此匯出器將節點問題和指標本地報告為 Prometheus(或 OpenMetrics)指標。你可以使用命令列引數指定匯出器的 IP 地址和埠。

  • Stackdriver 匯出器:此匯出器將節點問題和指標報告給 Stackdriver 監控 API。可以透過使用配置檔案來自定義匯出行為。

建議和限制

建議在叢集中執行 Node Problem Detector 以監控節點健康狀況。執行 Node Problem Detector 時,每個節點都會有額外的資源開銷。通常情況下,這沒問題,因為:

  • 核心日誌增長相對緩慢。
  • Node Problem Detector 設定了資源限制。
  • 即使在高負載下,資源使用率也是可以接受的。有關更多資訊,請參閱 Node Problem Detector 基準測試結果
最後修改於 2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 簡碼代替 code 簡碼 (e8b136c3b3)