Node Problem Detector¶
Node Problem Detector は、略して NPD と呼ばれ、Kubernetes のオープンソースクラスターノード監視プラグインで、ノード障害の検査に使用します。
NPD の機能
- イベント情報を生成し、APIServer に報告します。
- メトリクス情報を検出し、Metrics として出力します。
設定¶
前提条件¶
- K8S 環境をインストールする
- DataKit をインストールする
NPD のインストール¶
インストールドキュメントを参照できます。ここでは yaml 方式でインストールします。
-
関連する yaml をダウンロードする
-
実行する
kubectl apply -f rbac.yaml
kubectl apply -f node-problem-detector-config.yaml
kubectl apply -f node-problem-detector.yaml
ログイベントモード¶
NPD をデフォルトでインストールすると、追加設定は不要です。Datakit はデフォルトで Kubernetes イベントを収集し、データソースが Kubernetes_events のログの reason(tag)に保存します。
メトリクスモード¶
イベントモードに加えて、NPD はメトリクスの出力もサポートします
事前準備¶
- Prometheus Operator をインストールする
DataKit で ServiceMonitor を有効化する¶
Pod/Service の Prometheus メトリクスを自動検出する
以下では ServiceMonitor 方式で NPD のメトリクス情報を収集します
- node-problem-detector.yaml を調整する
...
- name: node-problem-detector
command:
- /node-problem-detector
- --logtostderr
- --config.system-log-monitor=/config/kernel-monitor.json,/config/docker-monitor.json
- --address=0.0.0.0
- --prometheus-address=0.0.0.0
...
ports:
- containerPort: 20257
hostPort: 20257
name: man-port
npd-service.yamlを作成する
apiVersion: v1
kind: Service
metadata:
name: node-problem-detector
namespace: kube-system
labels:
app: node-problem-detector
spec:
selector:
app: node-problem-detector
ports:
- protocol: TCP
port: 20257
targetPort: 20257
name: metrics
npd-server-monitor.yamlを作成する
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: npd-server-metrics
labels:
app: node-problem-detector
namespace: kube-system
spec:
selector:
matchLabels:
app: node-problem-detector
endpoints:
- port: metrics
params:
measurement:
- node-problem-detector
- 実行する
kubectl apply -f rbac.yaml
kubectl apply -f node-problem-detector-config.yaml
kubectl apply -f node-problem-detector.yaml
kubectl apply -f npd-service.yaml
kubectl apply -f npd-server-monitor.yaml
メトリクス¶
problem_gauge¶
| Tag | 説明 |
|---|---|
type="ConntrackFullProblem" |
ノードの接続追跡テーブル障害 |
| type="EmptyDirVolumeGroupStatusError" | 一時ボリュームのストレージプール障害 |
| type="MemoryProblem" | ノードメモリ障害 |
| type="LocalPvVolumeGroupStatusError" | ノード上の永続ボリュームのストレージプール障害 |
| type="MountPointProblem" | ノードのマウントポイント障害 |
| type="FDProblem" | システムの重要リソースである FD ファイルハンドル数の障害 |
| type="DiskHung" | ノードのディスクに IO 停滞があるかどうか |
| type="DiskReadonly" | ノードのディスクが読み取り専用かどうか |
| type="DiskProblem" | ノードのシステムディスク障害 |
| type="DiskSlow" | ノードのディスクに低速 IO 障害があるかどうか |
| type="FrequentCRIRestart" | CRI が頻繁に再起動している |
| type="FrequentDockerRestart" | Docker が頻繁に再起動している |
| type="FrequentKubeletRestart" | Kubelet が頻繁に再起動している |
| type="FrequentContainerdRestart" | Containerd が頻繁に再起動している |
| type="NTPProblem" | ntpd 同期異常 |
| type="PIDProblem" | システムの重要リソースである PID プロセス資源が不足している |
type="ResolvConfFileProblem" |
ResolvConf の設定異常 |
| type="CNIProblem" | CNI(コンテナネットワーク)コンポーネント異常 |
| type="CRIProblem" | コンテナランタイムコンポーネントである Docker または Containerd の稼働状態異常 |
type="KUBEPROXYProblem" |
Kube-proxy の動作異常 |
type="KUBELETProblem" |
Kubelet の状態異常 |
| type="ScheduledEvent" | ホストの予定イベントが存在するかどうか |
| type="ProcessD" | ノードに D プロセスが存在する |
| type="ProcessZ" | ノードに Z プロセスが存在する |
ログ¶
以下の一覧には、デフォルト設定下で NPD が検出できるイベントが含まれますが、これに限定されません。イベントはデータソースが Kubernetes_events のログに書き込まれます。
| 原因 | 永続性 | 説明 |
|---|---|---|
DockerHung |
はい | Docker がハングする、または応答しない |
ReadonlyFilesystem |
はい | ファイルシステムが読み取り専用モードでマウントされています。通常は保護機構の一種であり、場合によってはファイルシステムの破損を防ぎます |
CorruptDockerOverlay2 |
はい | Overlay2 ストレージドライバに問題がある |
ContainerdUnhealthy |
はい | Containerd が異常状態にある |
KubeletUnhealthy |
はい | Kubelet が異常状態にある |
DockerUnhealthy |
はい | Docker が異常状態にある |
OOMKilling |
いいえ | Kubernetes が OOM により Pod を終了した |
TaskHung |
いいえ | タスクがハングした |
UnregisterNetDevice |
いいえ | ネットワークインターフェースの異常 |
KernelOops |
いいえ | カーネルが検出した異常動作。例: NULL ポインタ、デバイスエラー |
Ext4Error |
いいえ | Ext4 ファイルシステムの問題 |
Ext4Warning |
いいえ | Ext4 ファイルシステムの問題 |
IOError |
いいえ | バッファの問題 |
MemoryReadError |
いいえ | 修復可能なメモリエラー。頻発する場合はメモリハードウェアに問題がある可能性があります |
KubeletStart |
いいえ | Kubelet の起動。頻繁に発生する場合は Kubelet が頻繁に再起動していることを意味します |
DockerStart |
いいえ | Docker の起動。頻繁に発生する場合は Docker が頻繁に再起動していることを意味します |
ContainerdStart |
いいえ | Containerd の起動。頻繁に発生する場合は Containerd が頻繁に再起動していることを意味します |
CorruptDockerImage |
いいえ | Docker registry で使用されるディレクトリが空ではない |
DockerContainerStartupFailure |
いいえ | Docker を起動できない |
ConntrackFull |
いいえ | ネットワーク接続追跡数が上限に達しており、NAT やファイアウォールなどのネットワーク機能に影響します |
NTPIsDown |
いいえ | NTP 時刻同期異常 |