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→网络插件
相关推荐
CodeMartain2 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
牛奶咖啡133 小时前
k8s容器编排技术实践——使用containerd作为容器运行时部署k8s集群
kubernetes·k8s的安装部署·开启系统的ipvs支持·安装containerd·containerd配置加速器·安装k8s的工具·安装calico网络插件
万里侯3 小时前
云原生数据备份与恢复:保障数据安全的最佳实践
微服务·容器·k8s
llrraa20103 小时前
配置docker国内镜像源
运维·docker·容器
阿里云云原生3 小时前
阿里云 STAROps 全域智能运维平台发布!从“被动救火”到“主动自治”
云原生
2301_780789664 小时前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos
35岁程序员的自救之路5 小时前
AiBBS - 面向下一个十年的AI + 云原生社区系统
人工智能·云原生
珂玥c5 小时前
k8s集群ingress碎碎念
云原生·容器·kubernetes
佳杰云星6 小时前
如何给大模型集群选“大脑”?智算调度与管理平台 10 维选型指南(附选型评分表)
人工智能·kubernetes·大模型·云计算·gpu·算力调度·智算中心
比特森林探险记7 小时前
context 在 gRPC / Gin / K8s 中的实战
容器·kubernetes·gin