背景

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

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

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

效果图


大功告成!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐