K8S集群的etcd,分为以pod的方式启动和外置etcd集群两种,都需要配置监控。
大概分为三个部分:
- 配置 Target,让 Prometheus 采集 etcd 指标
- 配置 Grafana 模板
- 配置告警规则
了解 Etcd metrics
官方文档:https://etcd.io/docs/v3.5/metrics/
etcd 默认会在2379 端口上暴露 metrics。
测试检测数据暴露是否正常
对于开启 tls的 etcd 集群,则需要指定客户端证书,例如
Etcd 中的指标可以分为三大类:
Server
以下指标前缀为etcd_server_
- has_leader: 集群是否存在Leader
- leader_changes_seen_total: leader 切换次数
- proposals_committed_total: 已提交的共识提案总数。
- 如果member 和 leader 差距较大,说明member 可能有问题,比如运行比较慢
- proposals_applied_total:记录应用的提案总数。
- 已提交提案数和已提交提案数差值应该比较小,持续升高说明etcd 负责较高
- proposals_pending:等待提交的提案数
- 该值升高说明 etcd 负载较高或者 member 无法提交提案
- proposals_failed_total:失败的提案数
Disk
以下指标前缀为 etcd_disk_
- wal_fsync_duration_seconds_bucket:反映系统执行 fdatasync 系统调用耗时
- backend_commit_duration_seconds_bucket:提交耗时
高磁盘操作延迟(wal_fsync_duration_seconds
或backend_commit_duration_seconds
)通常表明磁盘存在问题。它可能会导致较高的请求延迟或使集群不稳定。
Network
以下指标前缀为etcd_network_
。
- peer_sent_bytes_total:发送到其他 member 的字节数
- peer_received_bytes_total:从其他 member 收到的字节数
- peer_sent_failures_total: 发送失败数
- peer_received_failures_total:接收失败数
- peer_round_trip_time_seconds:节点间的 RTT
- client_grpc_sent_bytes_total:发送给客户端的字节数
- client_grpc_received_bytes_total:从客户端收到的字节数
核心指标
上面就是 etcd 的所有指标了,其中比较核心的是下面这几个:
- **
etcd_server_has_leader
**:etcd 集群是否存在 leader,为 0 则表示不存在 leader,整个集群不可用
- **
etcd_server_leader_changes_seen_total
**: etcd 集群累计 leader 切换次数
- **
etcd_disk_wal_fsync_duration_seconds_bucket
**:wal fsync 调用耗时,正常应该低于 10ms
- **
etcd_disk_backend_commit_duration_seconds_bucket
**:db fsync 调用耗时,正常应该低于 120ms
- **
etcd_network_peer_round_trip_time_seconds_bucket
**:节点间 RTT 时间
配置 etcd 监控
配置Prometheus所需的ETCD证书
创建secret 给Prometheus 挂载
挂载etcd-certs 到Prometheus Server中。
文件目录:/apps/kube-prometheus/manifests/prometheus-prometheus.yaml
登录查看证书文件
创建ServiceMonitor
创建一个 ServiceMonitor 对象,让 Prometheus 去采集 etcd 的指标
创建 etcd service & endpoint
对于外置的 etcd 集群,或者以静态 pod 方式启动的 etcd 集群,都不会在 k8s 里创建 service,而 Prometheus 需要根据 service + endpoint 来抓取,因此需要手动创建。
配置告警
官方策略
Etcd 官方也提供了一个告警规则,点击查看–> etcd3_alert.rules.yml
简化指标内容如下:
核心策略
实际上只需要对前面提到的几个核心指标配置上告警规则即可
只包含上述指标告警的精简版
配置到 Prometheus
创建 PrometheusRule
使用 PrometheusRule 对象来存储这部分规则
比较重要的是label,后续会根据 label 来关联到此告警规则。
这里的 label 和 默认生成的内置 PrometheusRule 对象label 一致,就不会影响到其他 rule。
配置到 Prometheus
Prometheus server的yaml文件,默认ruleSelector 是匹配所有 label,所以不需要配置此字段,Prometheus 就可以自动获取到 PrometheusRules