非GCE环境下K8S node-problem-detector使用及数据输出问询
关于Kubernetes Node Problem Detector的两个问题解答
Hey,针对你的两个问题,我来给你详细捋一捋,都是实际使用NPD的经验总结:
问题一:如何使用K8S node-problem-detector?
其实用node-problem-detector(大家常简称NPD)还是挺直观的,核心就是部署+配置两步走,我给你拆解成几个关键步骤:
1. 部署NPD
默认Kubernetes集群不会自带NPD,因为它需要在每个节点上运行,用DaemonSet是最合适的部署方式。你可以创建一个自定义的DaemonSet配置文件(比如npd-daemonset.yaml),内容如下:
apiVersion: apps/v1 kind: DaemonSet metadata: name: node-problem-detector namespace: kube-system labels: k8s-app: node-problem-detector spec: selector: matchLabels: k8s-app: node-problem-detector template: metadata: labels: k8s-app: node-problem-detector spec: containers: - name: node-problem-detector image: k8s.gcr.io/node-problem-detector:v0.8.10 args: - --config=/config/kernel-monitor.json,/config/file-log-monitor.json resources: limits: cpu: 100m memory: 100Mi requests: cpu: 10m memory: 20Mi volumeMounts: - name: log mountPath: /var/log readOnly: true - name: config mountPath: /config volumes: - name: log hostPath: path: /var/log - name: config configMap: name: node-problem-detector-config
执行以下命令完成部署:
kubectl apply -f npd-daemonset.yaml
部署完成后,用这个命令检查每个节点上的NPD Pod是否正常运行:
kubectl get pods -n kube-system -l k8s-app=node-problem-detector
2. 配置问题检测器
NPD靠插件来检测节点问题,比如内核死锁、文件系统异常、自定义日志错误等。你需要用ConfigMap来管理这些插件的配置。创建一个npd-configmap.yaml文件,内容如下(包含通用的内核日志和系统日志检测规则):
apiVersion: v1 kind: ConfigMap metadata: name: node-problem-detector-config namespace: kube-system data: kernel-monitor.json: | { "plugin": "kernel-monitor", "config": { "watchKernelLog": true, "logPath": "/var/log/kern.log", "rules": [ { "type": "NodeCondition", "conditionType": "KernelDeadlock", "conditionStatus": "True", "matchPattern": "task.*blocked for more than.*seconds", "reason": "KernelDeadlock", "message": "Detected kernel deadlock in node" } ] } } file-log-monitor.json: | { "plugin": "file-log-monitor", "config": { "logPath": "/var/log/syslog", "checkPeriod": 20, "rules": [] } }
执行命令应用配置:
kubectl apply -f npd-configmap.yaml
如果需要自定义检测规则(比如检测特定应用的错误日志),直接修改ConfigMap里的rules字段即可,添加对应的匹配正则、问题类型和描述。
3. 查看检测结果
NPD检测到问题后,会生成两种类型的信息:
- NodeCondition:会更新节点的状态,你可以用这个命令查看:
在kubectl describe node <你的节点名称>Conditions部分就能看到NPD上报的异常状态,比如KernelDeadlock。 - Event:会在K8S事件系统中生成告警事件,用这个命令查看:
能看到NPD触发的事件详情,包括问题原因和描述。kubectl get events -n kube-system
问题二:非GCE环境下如何使用node-problem-detector?是否向Dashboard推送信息/提供API指标?
非GCE环境的适配
官方默认的NPD配置是为GCE(Google Compute Engine)优化的,在其他环境(比如AWS、阿里云、自建物理机集群)使用时,只需要做这几个简单调整:
- 移除GCE特定配置:不要使用官方默认的GCE专属DaemonSet配置(里面包含GCE节点特有的挂载路径和环境变量),直接用我上面给你的通用DaemonSet配置即可——它没有任何GCE相关的依赖,只挂载了通用的
/var/log目录和ConfigMap。 - 调整日志路径:不同操作系统的日志路径可能不一样,比如CentOS的内核日志是
/var/log/messages,而Debian/Ubuntu是/var/log/kern.log。你需要修改ConfigMap里kernel-monitor.json的logPath字段,匹配你的节点操作系统。 - 自定义检测规则:根据你的环境需求添加专属的检测规则,比如检测云服务商特定的节点告警日志,或者自定义应用的错误日志。
是否向Dashboard推送信息/提供API指标?
- Dashboard展示:NPD本身不会主动向Dashboard推送信息,但Dashboard是从K8S API Server拉取数据的——只要NPD把问题上报成NodeCondition或者Event,你在Dashboard的节点详情页就能看到这些异常:比如节点状态的Conditions列表里会出现NPD上报的异常类型,或者事件列表里会显示NPD触发的告警事件。
- API指标支持:NPD默认会在Pod的
20257端口暴露Prometheus格式的指标,路径是/metrics。你可以用端口转发的方式本地查看:
然后访问kubectl port-forward <NPD-Pod的名称> 20257:20257 -n kube-systemhttp://localhost:20257/metrics就能看到所有指标,比如问题检测的次数、各个检测器的运行状态等。如果要让Prometheus自动抓取这些指标,只要给NPD的Pod添加以下注解(修改DaemonSet的template.metadata.annotations):
这样Prometheus就能自动发现并采集NPD的指标了。annotations: prometheus.io/scrape: "true" prometheus.io/port: "20257"
内容的提问来源于stack exchange,提问作者mon
相关产品推荐
相关产品推荐

