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→网络插件
相关推荐
人鱼传说37 分钟前
docker desktop是一个好东西
运维·docker·容器
小章UPUP2 小时前
Kubernetes (K8s) 与 Podman 的比较
容器·kubernetes·podman
忆~遂愿2 小时前
CANN metadef 核心解析:计算图原型定义、算子元数据抽象与异构系统互操作机制
docker·容器
说实话起个名字真难啊3 小时前
用docker来安装openclaw
docker·ai·容器
恬静的小魔龙3 小时前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
Zfox_4 小时前
CANN Catlass 算子模板库深度解析:高性能 GEMM 融合计算、Cube Unit Tiling 机制与编程范式实践
docker·云原生·容器·eureka
农民工老王4 小时前
K8s 1.31 私有化部署实战:从 Calico 崩溃到 NFS 挂载失败的排坑全记录
云原生·kubernetes
灰子学技术4 小时前
istio从0到1:如何解决分布式配置同步问题
分布式·云原生·istio
广州中轴线4 小时前
OpenStack on Kubernetes 生产部署实战(十四)
kubernetes·智能路由器·openstack
春日见4 小时前
如何创建一个PR
运维·开发语言·windows·git·docker·容器