K8S重启之后无法启动故障排查 与 修复

文章目录

K8S重启过程分析报告

重启操作记录

1. 初始状态检查

  • 执行时间: 2025-11-07 15:07
  • 检查静态Pod配置文件: /etc/kubernetes/manifests/
  • 发现etcd.yaml存在配置问题: 包含重复的readinessProbe配置

2. 配置修复

  • 恢复etcd原始配置: cp /etc/kubernetes/manifests/etcd.yaml.backup /etc/kubernetes/manifests/etcd.yaml
  • 修改startupProbe时间参数: initialDelaySeconds=10, periodSeconds=10
  • 重启kubelet服务: systemctl restart kubelet

3. 组件启动观察

第一轮启动 (15:08:00-15:08:30)
  • etcd: ✅ 成功启动 (容器ID: 3a35af5e98b3f)
  • kube-apiserver: ✅ 成功启动 (容器ID: ce533d077482f)
  • kube-controller-manager: ✅ 成功启动
  • kube-scheduler: ❌ 启动失败,后重新启动成功
第二轮状态 (15:08:30-15:09:00)
  • etcd: ❌ 异常退出 (收到终止信号)
  • kube-apiserver: ❌ 连接etcd失败,异常退出
  • kube-controller-manager: ❌ CrashLoopBackOff
  • kube-scheduler: ❌ 异常退出

关键问题分析

1. etcd连接问题

症状:

  • API服务器日志显示: connection error: desc = "transport: Error while dialing: dial tcp 127.0.0.1:2379: connect: connection refused"
  • 端口检查: 2379端口未监听,仅2381端口监听

根本原因:

  • etcd配置文件中listen-client-urls设置为监听2379端口
  • 但实际etcd容器启动后未监听2379端口
  • 导致API服务器无法连接etcd存储

2. etcd异常退出

症状:

  • etcd容器收到终止信号后正常关闭
  • 日志显示: received signal; shutting down

可能原因:

  • kubelet健康检查失败导致Pod重启
  • 系统资源不足或配置问题

3. 网络插件依赖问题

症状:

  • kubelet日志显示Calico网络插件错误
  • 错误: dial tcp 10.96.0.1:443: connect: connection refused

根本原因:

  • Calico尝试连接API服务器(10.96.0.1:443)失败
  • 因为API服务器依赖etcd,而etcd未正常运行
  • 形成循环依赖: API服务器需要etcd,网络插件需要API服务器

完整故障流程

复制代码
1. 重启kubelet
   ↓
2. etcd启动成功,但未监听2379端口
   ↓
3. API服务器启动,尝试连接etcd:2379失败
   ↓
4. API服务器异常退出
   ↓
5. Controller Manager和Scheduler因API服务器不可用而失败
   ↓
6. 网络插件(Calico)因无法连接API服务器而失败
   ↓
7. kubelet因健康检查失败重启etcd
   ↓
8. 所有核心组件进入CrashLoopBackOff状态
   ↓
9. K8S集群完全不可用

核心问题总结

主要故障点

  1. etcd端口监听异常 - 配置监听2379端口但实际未监听
  2. 组件依赖链断裂 - etcd→API服务器→其他组件的依赖关系中断
  3. 网络插件循环依赖 - 网络需要API服务器,API服务器需要etcd存储

影响范围

  • ✅ etcd: 可启动但无法提供客户端服务
  • ❌ kube-apiserver: 无法连接etcd存储
  • ❌ kube-controller-manager: 无法连接API服务器
  • ❌ kube-scheduler: 无法连接API服务器
  • ❌ 网络插件: 无法连接API服务器配置服务
  • ❌ DNS服务: 依赖网络插件和API服务器
  • ❌ 整个K8S集群: 完全不可用

建议修复方案

  1. 检查etcd配置和证书,确保2379端口正常监听
  2. 验证etcd数据目录权限和完整性
  3. 检查系统资源(内存、磁盘)是否充足
  4. 考虑重新初始化etcd集群数据
  5. 按顺序重启组件: etcd→API服务器→Controller Manager→Scheduler→网络插件
相关推荐
研究司马懿4 小时前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
java_logo5 小时前
SGLANG Docker容器化部署指南
linux·运维·docker·容器·eureka·1024程序员节
Qayrup5 小时前
各个系统的 docker安装
运维·docker·容器
代码or搬砖6 小时前
Docker 部署 Java 项目实践
java·docker·容器
蓝象_6 小时前
docker下载配置redis
redis·docker·容器
恋上钢琴的虫8 小时前
openEuler上安装高版本的docker
运维·docker·容器
半梦半醒*10 小时前
k8s——service详解
linux·运维·docker·容器·kubernetes
期待のcode10 小时前
Dockerfile镜像构建
java·docker·容器
悠闲蜗牛�10 小时前
技术融合新纪元:深度学习、大数据与云原生的跨界实践
大数据·深度学习·云原生