MKE三管理节点集群etcdserver出现request took too long警告问题咨询
问题答复
1. etcd实例间网络问题会触发该警告
你日志中出现的两类请求的处理流程都会受集群网络影响:
- 日志中的只读范围请求:Kubernetes默认部署的etcd使用线性一致性读配置,处理读请求时leader节点需要先向集群过半节点发起心跳确认自己的leader身份有效,拿到过半响应后才会返回读结果。如果节点间网络存在高延迟、丢包、抖动,会直接拉长这个确认流程的耗时,触发
took too long警告。 - 日志中的事务写请求:etcd所有写操作都要走Raft共识流程,需要过半节点确认日志同步完成才会提交返回,网络异常会直接拖慢共识流程,必然会触发这类延迟警告。
2. 这类请求不会完全在本地执行
只有当你主动修改etcd配置开启--read-only-serializable串行读时,只读请求才可以直接从本地节点的状态机返回,不需要和其他节点交互。但该配置会导致读取到过期数据的问题,Kubernetes官方部署方案默认不会开启该配置,所有生产级etcd集群默认的线性读、写请求都需要和集群其他节点交互,不可能完全本地执行。
额外排查建议
你之前怀疑的磁盘IO确实是这类警告最常见的触发原因,优先排查磁盘性能:用fio测试etcd数据盘的随机写延迟,etcd要求随机写延迟P99需低于10ms,超过20ms就会频繁触发这类警告。如果磁盘性能符合要求,再排查节点间网络,正常集群内节点间双向延迟要低于1ms,你可以用etcdctl endpoint health、ping、iperf等工具检测节点间网络状态。
内容的提问来源于stack exchange,提问作者WalterH
相关产品推荐
相关产品推荐

