十一、k8s的node节点报错误node.kubernetes.io/unreachable:,Pod也不能容忍该污点。


1. 主节点(master)有污点:node-role.kubernetes.io/master:,这是 Kubernetes 默认设置,防止普通 Pod 调度到主节点上,以保证控制平面的稳定性。
2. 两个工作节点处于不可达状态:它们被标记了 node.kubernetes.io/unreachable污点,这意味着这两个节点与控制平面失去了网络连接,调度器认为它们不可用。
根据图片内容,节点 xianchaonode1 出现了严重的 内存溢出(OOM)问题,导致 Java 进程被系统强制终止,并引发了节点状态不稳定(频繁在 Ready和 NotReady之间切换)。
问题诊断
-
内存使用率过高:节点内存的限制使用率已达 93%(2288Mi/总量约2.5Gi),非常接近上限。
-
频繁发生 OOM:事件显示多个 Java 进程(PID: 57846、57853、55614等)因系统 OOM 被终止。
-
节点状态不稳定:由于内存压力,kubelet 服务可能受到影响,导致节点状态频繁变化。
解决方案
立即处理措施
1. 查看具体是哪些 Pod 占用了大量内存
# 查看节点上所有 Pod 的内存使用情况
kubectl top pods --all-namespaces --use-protocol-buffers | grep xianchaonode1
# 或按内存使用排序
kubectl top pods -A --sort-by=memory
2. 重启内存占用异常的 Pod(临时缓解)
# 找到占用内存高的 Pod,按命名空间逐个重启
kubectl rollout restart deployment <deployment-name> -n <namespace>
3. 调整 Java 应用的内存参数
对于 Java 应用,在容器启动命令或环境变量中设置合理的 JVM 参数:
env:
- name: JAVA_OPTS
value: "-Xmx512m -Xms256m" # 根据实际情况调整
中长期解决方案
1. 为 Pod 设置合理的资源限制
在 Deployment 中明确设置内存请求和限制:
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi" # 不要设置过高,留出系统余量
cpu: "250m"
2. 调整节点配置
# 在节点上调整 kubelet 配置,为系统预留更多内存
# 编辑 /var/lib/kubelet/config.yaml,增加:
systemReserved:
memory: "500Mi"
cpu: "200m"
kubeReserved:
memory: "500Mi"
cpu: "100m"
# 然后重启 kubelet
sudo systemctl restart kubelet
3. 增加节点资源或添加新节点
-
升级节点内存至 4GB 或更高
-
添加新的工作节点分担负载
4. 优化应用配置
-
对于 Java 应用,合理设置 JVM 堆大小,通常不超过容器内存限制的 80%
-
考虑使用更轻量的基础镜像
预防措施
-
设置资源配额:为命名空间设置资源配额,防止单个应用占用过多资源。
-
监控告警:部署监控系统(如 Prometheus),设置内存使用率超过 80% 时告警。
-
定期巡检:定期使用
kubectl describe nodes检查节点资源分配情况。
总结
当前问题的核心是节点内存严重不足,导致系统频繁 OOM。请立即排查具体是哪些 Pod 内存占用过高,并调整其资源配置。长期来看,需要为所有 Pod 设置合适的内存限制,并考虑增加节点资源。
posted on 2026-03-17 20:59 luzhouxiaoshuai 阅读(43) 评论(0) 收藏 举报
浙公网安备 33010602011771号