文章目录
- 背景
- Master与Slave反亲和
- Master间反亲和
- 效果图
背景
首先说一下亲和性和反亲和性:
- 亲和性可以实现就近部署,增强网络能力实现通信上的就近路由,减少网络的损耗
- 反亲和性主要是出于高可靠性考虑,尽量分散实例,某个节点故障的时候,对应用的影响只是N分之一或者只是一个实例
由于Redis集群的分片机制以及failover机制,需要保证在部署时,保证节点尽量分散,即满足反亲和,这样才能保证当k8s集群中有节点故障时,不至于导致redis集群不可用。所以,做节点的反亲和是非常必要的,我们使用的k8s集群配置的规则并不能保证强制反亲和,所以需要通过Prometheus和alertmanager,在发现节点未满足反亲和条件时,发送告警,人为干预,告警整理如下:
- 同一集群,不同master分配在相同node上,告警,即master间反亲和
- 同一组master/slave,位于相同node上,告警,即master与slave反亲和
Master与Slave反亲和
同一组的节点是通过同一个StatefulSet创建的,所以根据StatefulSet和k8s节点的信息count,如果结果大于1,则不满足反亲和性,告警。 这一个比较好做,通过Prometheus,找到一个指标,正好可以拿到所需要的指标:
其中created_by_name这个指标就是创建同一组redis节点的StatefulSet名称,node这个指标就是k8s节点的IP,所以这条规则的表达式如下:
(count by(created_by_name,node) (kube_pod_info{namespace="redis"}))>1
在Prometheus的rule中添加告警规则:
- alert: pod of the same master-slave group was deployed in same node
annotations:
description: 当集群中同一组Master/Slave部署到相同的Node上,触发该告警
summary: '{{$labels.created_by_name}} 的主从节点部署到了相同的主机,主机IP为:{{$labels.node}}'
expr: (count by(created_by_name,node) (kube_pod_info{namespace="redis"}))>1
labels:
group: xadd-redis
severity: critical
Master间反亲和
要做这个告警,我们需要拿到的信息有:集群名、集群内所有master角色的节点信息、k8s集群信息,通过查找,发现有两个指标,可以拿到这些信息,第一个就是上面的kube_pod_info,还有一个是下面的redis_instance_info :
现在需要把这两个结果关联起来,通过什么关联呢?对比两个label发现,两个label的结果中都有pod这个指标,只不过名称不一样,kube_pod_info中是pod,而redis_instance_info中是kubernetes_pod_name,所以第一步是讲两个指标名称统一,才能做后面的关联。
label_replace(redis_instance_info, "pod", "$1", "kubernetes_pod_name", "(.*)")
这样一来,两个label就可以通过pod来关联了
kube_pod_info{namespace="redis"} * on (pod) group_left(redis_kun_name) label_replace(redis_instance_info{role="master"}, "pod", "$1", "kubernetes_pod_name", "(.*)")
通过这个PromQL,可以拿到所有redis集群中角色为master的pod信息
redis_kun_name就是集群名称,node为当前pod所在的k8s主机IP,所以通过这两个字段count,如果大于1,则不满足反亲和性:
count by (redis_kun_name, node) (kube_pod_info{namespace="redis"} * on (pod) group_left(redis_kun_name) label_replace(redis_instance_info{role="master"}, "pod", "$1", "kubernetes_pod_name", "(.*)"))
在Prometheus的rule中添加告警规则:
- alert: more than one master of the same cluster was deployed in same node
annotations:
description: 当集群中多个Master部署到相同的Node上,触发该告警
summary: '发现集群:{{$labels.redis_kun_name}} 有{{value}}个Master部署到了相同的主机,主机IP为:{{$labels.node}}'
expr: count by (redis_kun_name, node) (kube_pod_info{namespace="redis"} * on (pod) group_left(redis_kun_name) label_replace(redis_instance_info{role="master"}, "pod", "$1", "kubernetes_pod_name", "(.*)"))>1
labels:
group: xadd-redis
severity: critical
效果图