Kubernetes中Helm部署Prometheus Node-Exporter端口调度失败排查
Node-Exporter Pod Pending(端口占用报错)排查与解决
排查步骤
1. 检查Node-Exporter DaemonSet的端口配置
执行命令查看DaemonSet的端口定义,确认是否存在多端口请求或配置错误:
kubectl get daemonset prometheus-node-exporter -o yaml | grep -A 10 "ports:"
重点关注hostPort字段,确认是否仅请求9100端口,无重复或多余端口配置。
2. 排查节点上的hostPort占用情况
列出集群中所有使用hostPort的Pod,确认是否有其他Pod在目标节点占用9100端口:
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\t"}{range .spec.containers[*].ports[*]}{.hostPort}{","}{end}{"\n"}' | grep -v "0," | grep "<你的节点名称>"
若发现有其他Pod占用9100,记录该Pod名称。
3. 检查kubelet端口预留配置
查看kubelet启动参数,确认9100是否被标记为预留端口(预留端口不允许Pod使用):
ps aux | grep kubelet | grep "reserved-ports"
若输出包含9100,说明该端口被kubelet预留。
4. 验证DaemonSet的节点调度配置
确认Node-Exporter的DaemonSet是否正确配置了容忍度和节点选择器,确保能调度到目标节点:
kubectl get daemonset prometheus-node-exporter -o yaml | grep -A 15 "tolerations:" kubectl get daemonset prometheus-node-exporter -o yaml | grep -A 5 "nodeSelector:"
对比目标节点的污点(通过kubectl describe node <节点名>查看Taints字段),确认容忍度规则匹配。
解决方案
1. 修正DaemonSet端口配置
如果DaemonSet存在多余或错误的端口请求,修改Helm values文件(如values.yaml):
nodeExporter: ports: metrics: port: 9100 hostPort: 9100 # 针对master节点的容忍度配置 tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"
重新部署:
helm upgrade prometheus prometheus-community/prometheus -f values.yaml
2. 释放被占用的hostPort
如果发现其他Pod占用9100端口,删除该Pod或修改其hostPort配置:
kubectl delete pod <占用端口的Pod名称> -n <对应命名空间>
3. 调整kubelet预留端口
若9100被kubelet预留,编辑kubelet配置文件(通常在/var/lib/kubelet/config.yaml或启动参数文件),移除reservedPorts中的9100,然后重启kubelet:
systemctl restart kubelet
4. 清理残留Pod
如果存在Terminating状态的Node-Exporter Pod,强制清理:
kubectl delete pod <Terminating状态的Pod名称> --force --grace-period=0
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

