【k8s】etcd集群took too long to execute慢日志告警问题分析

本文分析了k8s集群中etcd出现大量'took too long'慢日志的问题,问题源于kube-controller-manager的cronjob-controller频繁全量查询所有namespace的job。解决方案包括配置job的ttlSecondsAfterFinished属性和避免使用cronjob_controller的全量查询。实施后,etcd慢查询告警显著下降。

背景

  • 目前 机器学习平台 后端采用k8s架构进行GPU和CPU资源的调度和容器编排。总所周知,k8s的后端核心存储使用etcd进行metadata持久化存储。机器学习平台采取External etcd topology结构进行etcd的HA部署。

v2-f1cc49752ade321d2b6b221f320b2fae_b.jpg
  • etcd集群的稳定性直接关系到k8s集群和机器学习平台的稳定性。odin平台直接接入etcd集群的慢日志(etcd请求操作>100ms)告警,实时监控etcd的稳定性。

v2-7a084c2c4f873adec6529228476bb95f_b.jpg

问题记录

  • 2020-01-06 运维同学反馈2019年12月中旬etcd慢日志监控出现大量的告警记录,而且告警呈上升趋势。

v2-6fdaf29e4b6af0638a781250b6c9605e_b.jpg
  • 2020-01-20 运维同学继续反馈etcd慢日志告警数量继续上涨,未呈现稳态趋势。

v2-d3c382095c9fba3f971c727d5ffd45c3_b.jpg

问题分析

  • 2020-01-06 运维同学反馈告警问题时,当时怀疑etcd 集群磁盘latency性能问题,通过etcd metrics接口dump backend_commit_duration_seconds 和 wal_fsync_duration_seconds,latency区间在128ms。etcd官方文档what-does-the-etcd-warning-apply-entries-took-too-long-mean 建议排查磁盘性能问题,保证 "p99 duration should be less than 25ms"。和运维同学讨论,先将etcd设置的慢日志阈值调整到100,继续跟踪告警问题。
root@xxx-ser00:~$ curl -L -s http://localhost:2379/metrics | grep backend_commit_duration_seconds
# HELP etcd_disk_backend_commit_duration_seconds The latency distributions of commit called by backend.
# TYPE etcd_disk_backend_commit_duration_seconds histogram
etcd_disk_backend_commit_duration_seconds_bucket{le="0.001"} 28164
etcd_disk_backend_commit_duration_seconds_bucket{le="0.002"} 357239
etcd_disk_backend_commit_duration_seconds_bucket{le="0.004"} 1.9119004e+07
etcd_disk_back
<think>嗯,用户的问题非常具体,涉及Kubernetes高可用集群的稳定性问题。用户提到在三master节点集群中,当某个master节点磁盘IO延迟升高且etcd报"took too long"时,是否会影响kube-apiserver访问。这显然是个生产环境遇到的实际问题,用户可能是运维工程师或SRE,需要快速定位故障影响范围。 从技术角度看,这个问题可以拆解成三个层面:etcd性能对kube-apiserver的影响、磁盘IO与etcd的关联性、以及高可用集群的容错机制。用户特别强调"三master节点"这个前提,说明ta理解HA架构的基本原理,但需要确认单点故障的具体影响边界。 注意到用户引用了之前的磁盘压力讨论,其中提到DiskPressure污点会阻止调度,但这次的问题更聚焦在控制平面组件间的连锁反应。尤其etcd的"took too long"警告很关键,这是典型磁盘延迟导致的写入超时,而kube-apiserver所有写操作都依赖etcd。 值得补充的是,虽然理论上三个master节点能容忍单节点故障,但实际影响取决于:1) 故障master是否当前leader;2) 客户端连接是否恰好指向该节点;3) 请求类型(读操作可能通过缓存完成)。用户没有说明具体报错现象,可能需要区分"完全不可用"和"性能下降"两种情况。 在回答中特别强调了etcd与磁盘IO的关系,因为机械磁盘的寻道延迟对etcd写性能影响极大。如果用户集群使用云盘,可能需要额外检查云监控中的IOPS突发配额。另外补充了kubelet驱逐机制这个隐藏风险点——虽然用户没直接问,但磁盘问题持续恶化会导致节点被标记NotReady,进而触发控制平面的pod驱逐。 </think>在三Master节点集群中,**当某个Master节点的磁盘IO延迟升高且etcd报错 `took too long` 时,确实可能导致该节点上的 `kube-apiserver` 访问失败,甚至影响整个集群的稳定性**。以下是详细分析--- ### **根本原因分析** 1. **etcd 对磁盘IO高度敏感** etcd 需要低延迟的磁盘IO保证写入一致性。当磁盘IO延迟升高时: - etcd 心跳超时(`took too long`),触发 leader 选举风暴 - 写操作阻塞,导致 `kube-apiserver` 请求堆积超时 - 集群元数据更新延迟,节点状态误判(如误报 `NotReady`) 2. **kube-apiserver 依赖 etcd** 所有 `kube-apiserver` 的请求(如 Pod 调度、资源变更)需读写 etcd。若 etcd 响应延迟: - `kube-apiserver` 返回 `504 Gateway Timeout` 或 `500 Internal Server Error` - 客户端(kubectl、kubelet)连接中断 3. **高可用架构的容错极限** - **三Master集群** 可容忍 **1个节点故障** - 但若故障节点是 **etcd leader**,切换过程(5-10秒)会导致短暂中断 - **磁盘IO问题持续恶化** 可能引发雪崩:剩余节点负载激增,最终全集群不可用 --- ### **故障链条演示** ```mermaid graph TD A[磁盘IO延迟升高] --> B[etcd 写操作超时] B --> C[etcd leader 选举风暴] C --> D[该节点 kube-apiserver 响应失败] D --> E[客户端请求转向其他 Master] E --> F[剩余节点负载骤增] F --> G[集群整体性能下降] ``` --- ### **关键影响证据** 1. **etcd 警告日志** ```bash etcdserver: request "took too long" to execute ``` - 直接表明磁盘IO或网络问题导致操作超时 [^2] 2. **kube-apiserver 错误日志** ```bash Unable to connect to the server: net/http: TLS handshake timeout ``` - 客户端访问超时的典型表现 3. **节点状态异常** ```bash kubectl get nodes NAME STATUS ROLES master1 NotReady control-plane,etcd # 故障节点 ``` - 磁盘压力可能触发 `kubelet` 驱逐 Pod,节点标记为 `NotReady` [^1] --- ### **紧急处理建议** 1. **隔离故障节点** ```bash kubectl cordon <故障Master节点> ``` - 停止新 Pod 调度到该节点 2. **转移 etcd leader** ```bash ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 move-leader <健康节点ID> ``` 3. **扩容磁盘/迁移数据** - 清理日志(`/var/log/etcd`) - 扩展磁盘空间(需至少保留 **20% 空闲空间** [^2]) - 检查是否启用 SSD(etcd 必须使用 SSD) 4. **移除污点(临时恢复)** ```bash kubectl taint node <节点名> node.kubernetes.io/disk-pressure:NoSchedule- ``` > **警告**:仅临时方案,需根治磁盘问题 [^2] --- ### **预防措施** | 措施 | 作用 | |-------------------------------|----------------------------------------------------------------------| | **SSD 磁盘** | 确保 etcd IO延迟 <10ms | | **独立 etcd 磁盘** | 避免其他服务(如日志)抢占 IO 资源 | | **监控磁盘 IOPS/延迟** | 设置告警阈值(如写入延迟 >50ms) | | **定期清理 etcd 快照** | 配置 `etcd` 自动压缩历史数据 (`--auto-compaction-retention=24h`) | --- ### 总结 ✅ **磁盘IO延迟 + etcd 超时** 会直接影响 `kube-apiserver` 可用性,尤其在单节点故障时易引发雪崩。 ✅ 三Master集群虽提供冗余,但**磁盘性能是控制平面的生命线**,必须使用SSD并严格监控。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值