Etcd在Kubernetes中的重要性
Etcd是一个高可靠、分布式的键值存储系统,Kubernetes的设计基本都是围绕Etcd设计的,可谓成也Etcd,败也Etcd。Etcd负责Kubernetes集群的数据存储,提供了集群数据一致性保证及监测(watch)等机制,是整个集群的核心,但由于Etcd本身的性能限制,制约了Kubernetes集群的规模,当前官宣的最大节点数是5000,但目前原生Kubernetes在生产环境中基本都不超过3000个节点,所以针对Etcd的监控尤为重要。
监控指标
在生产环境中,可以通过Prometheus很好地监控Etcd的状态
leader的切换频次
当Etcd通过raft协议选举出leader后,leader应该是固定不变的。如果leader一直发生切换,是非常不稳定的。Etcd提供了etcd_server_leader_changes_seen_total指标,表示Etcd的leader切换次数。生产环境如果在一个小时内发生超过三次的leader切换,需要发出告警。
提交失败次数
Etcd是一种基于日志的存储系统,无论是选主节点,还是数据存储都需要集群内大部分节点参与。在分布式系统中数据提交(proposal)失败的情况会大大增加。Etcd通过etcd_server_proposals_committed_total(已提交)、etcd_server_proposals_failed_total(提交失败)、etcd_server_proposals_pending(等待提交)表示集群的提交情况或生产环境。如果集群在一个小时内5次提交失败,可以认为是异常情况。
数据写入性能
Kubernetes集群规模如果超过了两百台,建议Etcd加装SSD硬盘,这样性能会提升很多。Etcd的性能主要取决于磁盘的读写性能,每次数据提交分离,follow节点都必须落盘后才回复leader节点。Etcd提供了etcd_disk_wal_fsync_duration_seconds_bucket(wal日志同步磁盘耗时)和etcd_disk_backend_commit_duration_seconds_bucket(数据提交写入耗时)。为了避免常委效应,这两个指标通常使用分位指标告警。如果0.99分位的wal日志磁盘同步超过0.5ms或者0.99分位的数据提交写入超过0.25ms,则发出告警。
grpc指标
无论是Etcd节点之间的交互,还是客户端连接Etcd,v3版本的API已经全部切换到grpc。相比http方式,grpc有更高的性能。Etcd通过etcd_grpc_requests_failed_total指标表示grpc请求失败的次数,除以etcd_grpc_total(grpc请求总数)得出失败率。如果大于0.1可以认为请求的失败次数过多,应该提醒注意。
raft 共识算法总结