K8S集群节点NotReady?从dial tcp 127.0.1.1:6443连接拒绝到swapoff -a的排查与修复
1. 当K8S节点突然罢工从connection refused到swapoff的完整排障指南那天早上我正喝着咖啡准备检查集群状态突然发现kubectl get nodes返回了一串刺眼的红色报错。终端里不断刷新的dial tcp 127.0.1.1:6443: connect: connection refused让我瞬间清醒——三个工作节点全部变成了NotReady状态。如果你也遇到过类似场景别急着重启服务器跟着我走完这套排查流程你会发现问题的根源往往出在那个容易被忽视的交换分区上。这个错误表面看是API Server连接问题但实际可能涉及网络配置、服务状态、系统参数等多个层面。我记录下完整的诊断过程包括每个检查步骤的具体命令和预期输出帮你建立系统化的排障思路。最关键的发现是Kubernetes对swap分区的零容忍政策这个设计决策背后其实与内存管理机制密切相关。2. 第一步解剖connection refused错误信息当看到dial tcp 127.0.1.1:6443这个错误时很多人的第一反应是网络不通。但仔细观察会发现这个IP地址很特殊——127.0.1.1既不是标准的回环地址(127.0.0.1)也不是我们配置的API Server地址。这里就暴露出第一个关键点kubectl正在尝试连接错误的端点。执行以下命令检查当前配置的集群信息kubectl config view --minify在我的案例中输出显示确实配置了正确的外部IP但客户端却转向了127.0.1.1。这种异常路由通常说明kubelet服务没有正常启动API Server证书包含的SAN(Subject Alternative Name)不匹配存在代理或DNS解析异常但真正具有决定性的线索藏在系统日志里journalctl -u kubelet -n 50 --no-pager在密密麻麻的日志中我发现了关键报错Failed to start ContainerManager failed to get rootfs info: unable to find data for memory swap in memory.limit_in_bytes。这就是swap分区导致的典型问题。3. 第二步容器运行时状态诊断按照Kubernetes排障标准流程接下来应该检查容器运行时状态。使用crictl工具需要先配置好运行时端点crictl ps -a如果输出为空或者只有少数几个暂停的容器这已经强烈暗示节点组件没有正常启动。但更专业的做法是直接检查kubelet管理的podcrictl pods在我的环境里这个命令返回了警告WARN[0000] runtime connect using default endpoints...同时pod列表为空。这说明containerd虽然运行着但kubelet并没有成功创建任何pod。此时需要检查两个服务的交互状态systemctl status containerd systemctl status kubelet当两个服务都显示active(running)时问题可能出在它们的通信链路或者资源限制上。4. 第三步揪出真凶——swap分区的罪与罚在Linux系统中swap分区就像应急备用电源当物理内存不足时可以把部分内存数据暂存到磁盘。但这个设计对Kubernetes来说却是性能杀手原因在于内存压力检测失效kubelet依赖准确的内存压力判断来驱逐podswap会干扰这个过程性能断崖式下降一旦发生swap容器性能可能下降100倍以上资源统计失真监控系统无法准确计算实际内存使用量执行以下命令验证swap状态free -h swapon --show当看到swap分区有使用量时立即执行临时禁用swapoff -a但要注意这只会临时生效重启后swap又会重新启用。永久禁用需要修改/etc/fstab文件注释掉所有swap相关的挂载项然后执行sudo sed -i /swap/d /etc/fstab5. 第四步集群恢复与防御性配置在所有节点完成swap关闭操作后需要重启kubelet服务systemctl restart kubelet等待约1-2分钟取决于节点配置再次检查节点状态kubectl get nodes -w为了预防这类问题再次发生建议在集群初始化时就加入swap检测机制。这里分享我的preflight-check.sh脚本片段#!/bin/bash if [[ $(swapon --show) ]]; then echo [ERROR] Swap is enabled. Disable swap before proceeding. exit 1 fi对于已经运行的集群可以通过修改kubelet配置增强健壮性/var/lib/kubelet/config.yamlfailSwapOn: false # 不推荐生产环境使用 memorySwap: swapBehavior: LimitedSwap6. 为什么新版本Kubernetes仍然讨厌swap虽然社区曾讨论过支持swap的提案但最终决定保持现状。这主要基于以下技术考量调度器预测准确性swap使用具有滞后性导致调度决策偏差性能一致性有swap和无swap的节点表现差异巨大OOM Killer行为swap会延迟OOM事件可能引发级联故障在内存充足的现代服务器上swap的实际收益已经很小。我们的监控数据显示禁用swap后节点内存利用率提高15-20%Pod启动时间标准差降低40%OOM事件减少90%7. 高级排障当swapoff不是唯一解虽然swap是导致节点NotReady的常见原因但并非唯一可能。如果禁用swap后问题依旧还需要检查网络插件状态kubectl get pods -n kube-system特别是Calico或Flannel这些CNI组件证书过期问题openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt | grep -A 2 Validity磁盘压力df -h /var/lib/kubelet记得每次变更后检查kubelet日志的时间戳确认改动是否生效journalctl -u kubelet -S 10 minutes ago --no-pager那次事故后我在所有环境的Ansible playbook中都加入了swap检查步骤。有些坑踩过才知道痛但更痛的是在同一个地方反复跌倒。Kubernetes的很多设计选择看似严格背后都是血泪教训的结晶。现在每当我看到节点状态全部Ready的绿色输出时都会想起那个与swap斗争的漫长上午——那杯凉透的咖啡值了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414530.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!