NPD(노드 문제 감지기)는 노드 관련 문제를 검색하고 이에 대해 보고하는 오픈 소스 Kubernetes 구성 요소입니다. 클러스터의 각 노드에서 시스템 서비스로 실행되며 CPU 사용량, 디스크 사용량 및 네트워크 연결과 같은 다양한 메트릭 및 시스템 정보를 수집합니다. 문제가 검색되면 이벤트 및/또는 노드 조건을 생성합니다. AKS(Azure Kubernetes Service)는 NPD를 사용하여 Azure 클라우드 플랫폼에서 실행되는 Kubernetes 클러스터의 노드를 모니터링하고 관리합니다. AKS Linux 확장은 기본적으로 NPD를 사용하도록 설정합니다.
참고
NPD로의 업그레이드는 노드 이미지 및 Kubernetes 버전 업그레이드 프로세스와 독립적입니다. 노드 풀이 비정상 상태인 경우(즉, 실패한 상태) 새 NPD 버전이 설치되지 않습니다.
노드 조건
노드 상태는 노드를 사용할 수 없게 만드는 영구적인 문제를 나타냅니다. AKS는 NPD의 다음 노드 조건을 사용하여 노드의 영구적인 문제를 노출합니다. NPD는 해당 Kubernetes 이벤트도 내보냅니다.
| 문제 디먼 형식 | NodeCondition | 원인 | 컴퓨팅 형식 |
|---|---|---|---|
| 사용자 지정 플러그인 모니터 | 파일 시스템 손상 문제 | 파일 시스템 손상 감지됨 | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | KubeletProblem | KubeletIsDown | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | 컨테이너 런타임 문제 | 컨테이너 런타임이 중단되었습니다 | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | VM 이벤트 예정 | VM 이벤트 예정 | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | FrequentUnregisterNetDevice | 네트워크 장치 등록 해제 | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | FrequentKubeletRestart | FrequentKubeletRestart | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | FrequentContainerdRestart | FrequentContainerdRestart | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | 잦은 도커 재시작 | 잦은 도커 재시작 | 일반적인 용도 |
| 사용자 지정 플러그인 모니터 | GPUMissing | 관찰된 GPU 수가 예상 GPU 수와 일치하지 않음 | GPU만 |
| 사용자 지정 플러그인 모니터 | NVLinkStatusInactive | NVLinkStatusInactive | GPU만 |
| 사용자 지정 플러그인 모니터 | XIDErrors | 커널 로그에 있는 XID 오류 | GPU만 |
| 사용자 지정 플러그인 모니터 | IBLinkFlapping (인피니밴드 링크 플래핑) | 일시적인 InfiniBand 디바이스 연결 | GPU만 |
| 사용자 지정 플러그인 모니터 | GPU 클럭 스로틀링 | 문제가 있는 GPU 클록 스로틀링이 감지됨 | GPU만 |
| 사용자 지정 플러그인 모니터 | UnhealthyNvidiaDevicePlugin | NVIDIA 디바이스 플러그 인 서비스가 활성화되지 않음 | GPU만(관리되는 GPU) |
| 시스템 로그 모니터 | 커널 데드락 | DockerHung | 일반적인 용도 |
| 시스템 로그 모니터 | 읽기 전용 파일 시스템 | 파일 시스템이 읽기 전용입니다 | 일반적인 용도 |
참고
GPU only 노드 조건은 --gpu-driver none으로 생성되지 않은 노드 풀을 제외한, AKS 관리 GPU 드라이버를 사용하는 모든 GPU 노드 풀에 적용됩니다. 조건은 GPU only (managed GPU)완전히 관리되는 GPU 환경을 사용하도록 설정된 노드 풀에만 적용됩니다. GPU 상태 모니터링은 표준 GPU 및 MIG 지원 GPU 노드 풀에서 지원됩니다.
이벤트
NPD는 근본적인 문제를 진단하는 데 도움이 되는 관련 정보가 포함된 이벤트를 내보냅니다.
| 문제 디먼 형식 | 원인 | 빈도 | 설명 | 조치 |
|---|---|---|---|---|
| 사용자 지정 플러그인 모니터 | 출구 차단됨 | 30분 | 이 이벤트는 외부 엔드포인트에 대한 연결을 확인 합니다. | 엔드포인트에 대한 연결을 차단하는 방화벽 또는 NSG 플래그가 지정되었는지 확인합니다. |
| 사용자 지정 플러그인 모니터 | 파일 시스템 손상 감지됨 | 5분 | Docker에서 노출되는 파일 시스템 손상을 확인합니다. | |
| 사용자 지정 플러그인 모니터 | KubeletIsDown | 30초 | 그러면 kubelet 서비스가 실행 중이고 정상 상태인지 확인합니다. | |
| 사용자 지정 플러그인 모니터 | 컨테이너 런타임이 중단되었습니다 | 30초 | 이 이벤트는 컨테이너 런타임이 실행 중이고 정상 상태인지 확인합니다. | |
| 사용자 지정 플러그인 모니터 | FreezeScheduled | 1분 | 이 이벤트는 노드에서 Freeze 이벤트가 예약되어 있는지 확인합니다. 자세한 정보 확인 https://aka.ms/aks/scheduledevents | |
| 사용자 지정 플러그인 모니터 | 재부팅 예약됨 | 1분 | 이 이벤트는 노드에서 다시 부팅 이벤트가 예약되었는지 확인합니다. 자세한 내용은 https://aka.ms/aks/scheduledevents를 확인하십시오. | |
| 사용자 지정 플러그인 모니터 | RedeployScheduled | 1분 | 이 이벤트는 노드에서 재배포 이벤트가 예약되어 있는지 확인합니다. 자세한 정보 확인 https://aka.ms/aks/scheduledevents | |
| 사용자 지정 플러그인 모니터 | TerminateScheduled | 1분 | 이 이벤트는 노드에서 Terminate 이벤트가 예약되어 있는지 확인합니다. 자세한 정보 확인 https://aka.ms/aks/scheduledevents | |
| 사용자 지정 플러그인 모니터 | PreemptScheduled | 2초 | 이 이벤트는 노드에서 선점 이벤트가 예약되어 있는지 확인합니다. 자세한 정보 확인 https://aka.ms/aks/scheduledevents | |
| 사용자 지정 플러그인 모니터 | DNSProblem | |||
| 시스템 로그 모니터 | OOMKilling | |||
| 시스템 로그 모니터 | TaskHung | |||
| 시스템 로그 모니터 | 네트워크 장치 등록 해제 | |||
| 시스템 로그 모니터 | 커널옵스 | |||
| 시스템 로그 모니터 | 닥커 소켓 연결 불가 | |||
| 시스템 로그 모니터 | KubeletRPCDeadlineExceeded | |||
| 시스템 로그 모니터 | KubeletRPCNoSuchContainer | |||
| 시스템 로그 모니터 | CNICannotStatFS | |||
| 시스템 로그 모니터 | PLEGUnhealthy | |||
| 시스템 로그 모니터 | KubeletStart | |||
| 시스템 로그 모니터 | DockerStart | |||
| 시스템 로그 모니터 | ContainerdStart |
어떤 경우에는 AKS가 자동으로 노드를 차단하고 드레이닝하여 워크로드 중단을 최소화합니다. 이벤트 및 작업에 대한 자세한 내용은 노드 자동 드레인을 참조하세요.
출구 차단됨
EgressBlocked에서 확인한 엔드포인트 목록은 다음과 같습니다.
참고
실제 엔드포인트는 클러스터의 유형과 클러스터가 호스트되는 위치(퍼블릭 클라우드 및 Airgapped 클라우드)에 따라 달라집니다. 아웃바운드 액세스에 대한 설명서를 여기에서 검토하십시오. 설명서는 퍼블릭 클라우드용입니다.
| 유형 | 예시 | 참고 |
|---|---|---|
| MCR | https://mcr.microsoft.com | |
| Microsoft Entra ID (마이크로소프트 엔트라 ID) | https://login.microsoftonline.com |
|
| 자원 관리자 | https://management.azure.com | |
| 패키지 | https://packages.microsoft.com | |
| Kube Binary | https://acs-mirror.azureedge.net/acs-mirror/healthz https://packages.aks.azure.com/acs-mirror/healthz |
노드 조건 및 이벤트 확인
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를 참조하세요.