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

image

 

image

 

1. 主节点(master)有污点:node-role.kubernetes.io/master:,这是 Kubernetes 默认设置,防止普通 Pod 调度到主节点上,以保证控制平面的稳定性。

2. 两个工作节点处于不可达状态:它们被标记了 node.kubernetes.io/unreachable污点,这意味着这两个节点与控制平面失去了网络连接,调度器认为它们不可用。

根据图片内容,节点 xianchaonode1​ 出现了严重的 内存溢出(OOM)问题,导致 Java 进程被系统强制终止,并引发了节点状态不稳定(频繁在 Ready和 NotReady之间切换)。

问题诊断

  1. 内存使用率过高:节点内存的限制使用率已达 93%(2288Mi/总量约2.5Gi),非常接近上限。

  2. 频繁发生 OOM:事件显示多个 Java 进程(PID: 57846、57853、55614等)因系统 OOM 被终止。

  3. 节点状态不稳定:由于内存压力,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%

  • 考虑使用更轻量的基础镜像

预防措施

  1. 设置资源配额:为命名空间设置资源配额,防止单个应用占用过多资源。

  2. 监控告警:部署监控系统(如 Prometheus),设置内存使用率超过 80% 时告警。

  3. 定期巡检:定期使用 kubectl describe nodes检查节点资源分配情况。

总结

当前问题的核心是节点内存严重不足,导致系统频繁 OOM。请立即排查具体是哪些 Pod 内存占用过高,并调整其资源配置。长期来看,需要为所有 Pod 设置合适的内存限制,并考虑增加节点资源。

posted on 2026-03-17 20:59  luzhouxiaoshuai  阅读(43)  评论(0)    收藏  举报

导航