本文从探索了TKEStack 1.6中部分告警失效的原因,并提出修复手段。

日前在使用TKEStack v1.6.0的时候,发现针对工作负载的(也就是pod状态、重启次数)告警失效。我们进行了一定的分析,最终找到原因和Kubernetes 1.19以后版本中一个kubelet metrics名称修改有关。

TKEStack v1.6.0针对pod的告警使用了k8s_pod_status_ready, k8s_pod_restart_total两个metrics作为判定参数。继续查看这两个metrics的定义,发现他们都与一个名为__pod_info2的metrics相关,其定义如下:

- record: __pod_info2
  expr:  label_replace(label_replace(__pod_info1{workload_kind="ReplicaSet"} * on (workload_name,namespace) group_left(owner_name, owner_kind) label_replace(kube_replicaset_owner,"workload_name","$1","replicaset","(.*)"),"workload_name","$1","owner_name","(.*)"),"workload_kind","$1","owner_kind","(.*)")  or on(pod_name,namesapce)  __pod_info1{workload_kind != "ReplicaSet"}

__pod_info2又与__pod_info1相关,其定义如下:

  - record: __pod_info1
    expr: kube_pod_info* on(node) group_left(node_role) kube_node_labels

__pod_info1,关联到kube_node_labels。到这里时,我们发现在v1.19版本中,kube_node_labels已经没有数据,看来问题就出在这里。查看其定义如下:

  - record: kube_node_labels
    expr: kubelet_running_pod_count*0 + 1

定义很简单,只与kubelet_running_pod_count相关,而这个值在prometheus中也未能查询到,看来问题发生在这里。

简单的google之后,我们迅速发现了问题的原因:kubernetes在v1.19版本中进行了两个kubelet metrics的修改(kubernetes/kubernetes#92407):

kubelet: following metrics have been renamed:
kubelet_running_container_count --> kubelet_running_containers
kubelet_running_pod_count --> kubelet_running_pods

该修改造成了kube_node_labels的失效,从而导致许多tke自定义的metrics失效。

解决方案有两种:

  1. 按选择版本配置不同的prometheus
  2. 使用正则表达式匹配所有版本的metrics

毫无疑问第二种方式更加简单。相关代码位于:pkg/monitor/controller/prometheus/yamls.go 测试之后问题解决。相关issuepr已经提交到TKEStack。