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→网络插件
相关推荐
阿里云云原生1 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生1 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事3 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
阿里云云原生5 天前
AI 开发新常态:当 Cursor、Claude、Codex 并行,如何统一管理散落的 Skill 资产?
云原生·ai编程
探索云原生5 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美6 天前
从edge-trigger到level-trigger,谈谈 Kubernetes controller 的开发范式
云原生
阿里云云原生6 天前
深度解构:当 Append-only 的 SLS 遇上 Update/Delete,是如何实现设计权衡的?
云原生