다음을 통해 공유


AKS(Azure Kubernetes Service) 노드의 NPD(노드 문제 감지기)

NPD(노드 문제 감지기)는 노드 관련 문제를 검색하고 이에 대해 보고하는 오픈 소스 Kubernetes 구성 요소입니다. 클러스터의 각 노드에서 시스템 서비스로 실행되며 CPU 사용량, 디스크 사용량 및 네트워크 연결과 같은 다양한 메트릭 및 시스템 정보를 수집합니다. 문제가 검색되면 이벤트 및/또는 노드 조건을 생성합니다. AKS(Azure Kubernetes Service)는 NPD를 사용하여 Azure 클라우드 플랫폼에서 실행되는 Kubernetes 클러스터의 노드를 모니터링하고 관리합니다. AKS Linux 확장은 기본적으로 NPD를 사용하도록 설정합니다.

참고 항목

NPD로의 업그레이드는 노드 이미지 및 Kubernetes 버전 업그레이드 프로세스와 독립적입니다. 노드 풀이 비정상인 경우(즉, 실패 상태) 새 NPD 버전이 설치되지 않습니다.

노드 조건

노드 상태는 노드를 사용할 수 없게 만드는 영구적인 문제를 나타냅니다. AKS는 NPD의 다음 노드 조건을 사용하여 노드의 영구적인 문제를 노출합니다. NPD는 해당 Kubernetes 이벤트도 내보냅니다.

문제 디먼 형식 NodeCondition 원인
CustomPluginMonitor FilesystemCorruptionProblem FilesystemCorruptionDetected
CustomPluginMonitor KubeletProblem KubeletIsDown
CustomPluginMonitor ContainerRuntimeProblem ContainerRuntimeIsDown
CustomPluginMonitor VMEventScheduled VMEventScheduled
CustomPluginMonitor FrequentUnregisterNetDevice UnregisterNetDevice
CustomPluginMonitor FrequentKubeletRestart FrequentKubeletRestart
CustomPluginMonitor FrequentContainerdRestart FrequentContainerdRestart
CustomPluginMonitor FrequentDockerRestart FrequentDockerRestart
SystemLogMonitor KernelDeadlock DockerHung
SystemLogMonitor ReadonlyFilesystem FilesystemIsReadOnly

이벤트

NPD는 근본적인 문제를 진단하는 데 도움이 되는 관련 정보가 포함된 이벤트를 내보냅니다.

문제 디먼 형식 원인
CustomPluginMonitor EgressBlocked
CustomPluginMonitor FilesystemCorruptionDetected
CustomPluginMonitor KubeletIsDown
CustomPluginMonitor ContainerRuntimeIsDown
CustomPluginMonitor FreezeScheduled
CustomPluginMonitor RebootScheduled
CustomPluginMonitor RedeployScheduled
CustomPluginMonitor TerminateScheduled
CustomPluginMonitor PreemptScheduled
CustomPluginMonitor DNSProblem
CustomPluginMonitor PodIPProblem
SystemLogMonitor OOMKilling
SystemLogMonitor TaskHung
SystemLogMonitor UnregisterNetDevice
SystemLogMonitor KernelOops
SystemLogMonitor DockerSocketCannotConnect
SystemLogMonitor KubeletRPCDeadlineExceeded
SystemLogMonitor KubeletRPCNoSuchContainer
SystemLogMonitor CNICannotStatFS
SystemLogMonitor PLEGUnhealthy
SystemLogMonitor KubeletStart
SystemLogMonitor DockerStart
SystemLogMonitor ContainerdStart

어떤 경우에는 AKS가 자동으로 노드를 차단하고 드레이닝하여 워크로드 중단을 최소화합니다. 이벤트 및 작업에 대한 자세한 내용은 노드 자동 드레이닝을 참조하세요.

노드 조건 및 이벤트 확인

  • kubectl describe node 명령을 사용하여 노드 조건 및 이벤트를 확인합니다.

    kubectl describe node my-aks-node
    

    출력은 다음 요약 출력 예와 유사해야 합니다.

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

이러한 이벤트는 KubeEvents를 통해 Container Insights에서도 사용할 수 있습니다.

메트릭

NPD는 또한 모니터링 및 경고에 사용할 수 있는 노드 문제를 기반으로 Prometheus 메트릭을 노출합니다. 이러한 메트릭은 노드 IP의 포트 20257에 노출되며 Prometheus는 이를 스크랩할 수 있습니다.

다음 예 YAML은 Azure Managed Prometheus 추가 기능을 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']

다음 예에서는 스크랩된 메트릭을 보여 줍니다.

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

다음 단계

NPD에 대한 자세한 내용은 kubernetes/node-problem-Detector를 참조하세요.