目录标题
📘 etcd 切主日志分析笔记
📍 背景描述:
etcd 在某时段出现性能抖动并触发了 Raft 协议下的 leader 切换,期间伴随多个错误与资源瓶颈现象。
🧩 一、异常日志摘要
- 心跳延迟与过载告警
failed to send out heartbeat on time (exceeded the 100ms timeout for ~2.9s)
server is likely overloaded
- 读请求耗时严重超标
read-only range request "key:\"/registry/health\"" ... took too long (~2s)
- GRPC 通信异常
grpc: Server.processUnaryRPC failed to write status: connection error: desc = "transport is closing"
- Raft 选举日志
[Node A] received MsgAppResp from [Node B] with higher term -> became follower
[Node A] received MsgVote from [Node C] with higher term -> became follower again
[Node A] became candidate -> 发起新一轮投票
[Node A] 拒绝来自其他节点的投票请求,因 log index 更高
- Kubelet 重启失败
failed to load Kubelet config file "/var/lib/kubelet/config.yaml": no such file or directory
⚙️ 二、问题根因分析
1️⃣ 节点资源过载(CPU 或 I/O)
- etcd 多次报告心跳发送失败,说明控制消息未在指定的超时时间内发出(raft 默认 100ms)。
- 节点可能被高负载任务占用,或系统资源调度能力不足。
2️⃣ raft 协议触发主从切换
- etcd 节点收到了 term 更高的消息,根据 Raft 规则自动降为 follower 并参与新一轮选举。
- 日志显示节点先后成为 follower → candidate → 再次 follower,说明 leader 多次易主或未能稳定选出 leader。
3️⃣ kubelet 配置文件缺失
- kubelet 启动失败导致容器控制逻辑异常,可能会干扰 etcd pod 的生命周期(如果 etcd 是以容器运行)。
- config.yaml 丢失可能是节点初始化失败、挂载未成功或磁盘异常。
🛠️ 三、排查建议
✅ 1. 分析节点资源情况
检查关键时间段的负载与 I/O 情况:
sar -u 1 60 # CPU 使用率
iostat -xm 1 60 # 磁盘 I/O 延迟
vmstat 1 60 # 内存与上下文切换
✅ 2. 检查 kubelet 配置
- 恢复或重新挂载
/var/lib/kubelet/config.yaml
。 - 如有配置管理工具(如 kubeadm、salt、ansible),检查 kubelet 启动参数和配置文件来源。
✅ 3. 调优 etcd 节点
- 增加 etcd 容器或物理节点的 CPU / 内存配额。
- 将 etcd 与高负载服务(如监控 exporter、容器 runtime)隔离。
- 确保 etcd 存储目录位于高性能磁盘。
✅ 4. 检查 etcd 日志写入性能
- 使用工具如
etcd-dump-logs
或etcdctl check perf
分析 etcd 的持久化延迟。
📎 补充建议
项目 | 建议 |
---|---|
etcd 节点部署 | 建议部署在专用节点,不与 kubelet 或 exporter 混合部署 |
节点健康探针 | 启用 node-exporter / cadvisor 并集中分析资源瓶颈 |
etcd 配置 | 调整 --election-timeout , --heartbeat-interval 以适应实际部署环境 |