【Redis】K8S内Redis集群高可用之Pod反亲和告警规则整理

背景

首先说一下亲和性和反亲和性:

  • 亲和性可以实现就近部署,增强网络能力实现通信上的就近路由,减少网络的损耗

  • 反亲和性主要是出于高可靠性考虑,尽量分散实例,某个节点故障的时候,对应用的影响只是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

效果图


大功告成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值