暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OpenShift 3.11.98使用prometheus监控etcd遇到的两个bug

野架构师 2020-03-06
1822


概述

openshift 3.11默认安装了prometheus,但是默认的监控项是没有包含etcd的,所以这次实施需要将etcd也包含在,按照官方文档的步骤实施没啥问题,但是在我3.11.98的版本中遇到了两个bug,1. prometheus需要对etcd的证书ca进行信任,这个步骤中就需要prometheus加载按照文档中生成的证书,但是prometheus没有加载成功。2. 在解决第一个bug后成功监控到了etcd,但是prometheus一直报EtcdHighNumberOfFailedGRPCRequests,altermanager一直发送邮件,按照prometheus的rule中的监控表达式去查询了另个没有报错的etcd集群,两个etcd集群的结果一模一样,但是其中一个集群就是不断告警。

监控etcd

这里步骤就大致写一下,按照官方文档即可,不过在多个master的情况下,只有其中一台机器有/etc/etcd/ca/ca.crt 和 etc/etcd/ca/ca.key文件。

  1. 编辑cluster-monitoring-config configmap

oc -n openshift-monitoring edit configmap cluster-monitoring-config

  1. 添加etcd参数

...
data:
config.yaml: |+
...
etcd:
targets:
selector:
openshift.io/component: etcd
openshift.io/control-plane: "true"

  1. 验证etcd servicemonitor是否出现

$ oc -n openshift-monitoring get servicemonitor
NAME AGE
alertmanager 35m
etcd 1m
kube-apiserver 36m
kube-controllers 36m
kube-state-metrics 34m
kubelet 36m
node-exporter 34m
prometheus 36m
prometheus-operator 37m

  1. 访问prometheus的target能够看到etcd是down的状态,因为证书信任的问题。



  2. 拷贝master节点的/etc/etcd/ca/ca.crt 和 etc/etcd/ca/ca.key文件至一个临时创建的目录待用。

  3. 创建openssl.cnf

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, keyEncipherment, digitalSignature
extendedKeyUsage=serverAuth, clientAuth

  1. 签发相关证书的步骤

openssl genrsa -out etcd.key 2048
openssl req -new -key etcd.key -out etcd.csr -subj "/CN=etcd" -config openssl.cnf
openssl x509 -req -in etcd.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out etcd.crt -days 365 -extensions v3_req -extfile openssl.cnf

  1. 生成secret的yaml文件

cat <<-EOF > etcd-cert-secret.yaml
apiVersion: v1
data:
etcd-client-ca.crt: "$(cat ca.crt | base64 --wrap=0)"
etcd-client.crt: "$(cat etcd.crt | base64 --wrap=0)"
etcd-client.key: "$(cat etcd.key | base64 --wrap=0)"
kind: Secret
metadata:
name: kube-etcd-client-certs
namespace: openshift-monitoring
type: Opaque
EOF

  1. 创建secret

oc apply -f etcd-cert-secret.yaml

  1. 理论上这时候能看到etcd已经up了。

第一个bug

prometheus无法对etcd的证书进行信任,正常情况下prometheus应该是加载了我们创建的相关证书文件,我们去查看prometheus的pod,无法看到有相关的kube-etcd-client-certs secret volume被挂载,我猜测是prometheus operator没有管理到pod,进一步查看prometheus的statefulset配置,也没有相关secret信息,既prometheus operator没有管理到prometheus的statefulset,所以我手动的将kube-etcd-client-certs secret 挂载进prometheus的statefulset里面:

# oc get sts prometheus-k8s --export -oyaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
prometheus: k8s
name: prometheus-k8s
................
containers:
.................
name: prometheus
volumeMounts:
...................................................
- mountPath: /etc/prometheus/secrets/kube-etcd-client-certs
name: secret-kube-etcd-client-certs
readOnly: true
...................................................
volumes:
...................................................
- name: secret-kube-etcd-client-certs
secret:
defaultMode: 420
secretName: kube-etcd-client-certs
....................................................................

这时候prometheus的pod就会自动更新,等一会去prometheus的target就能看到etcd已经up了


2

第二个bug

  1. etcd监控项中一直出现 EtcdHighNumberOfFailedGRPCRequests 报错





  2. 将监控表达式中的拿到prometheus查询,结果是100,拿该表达式去另一个正常的集群中查询也是100。



  3. 查询了相关资料,可以确认是个bug:
    https://github.com/openshift/cluster-monitoring-operator/issues/248
    https://access.redhat.com/solutions/3358691

  4. 这个bug要升级openshift才行,这个操作就很大了,所以只能找个workaround的方法,直接将该告警进行silence忽略。

  1. 将silence时间修改为10年,因为我有三个etcd节点,所以要删除instance和告警级别,使用其他匹配项就能匹配到三个etcd节点了。



  2. 查看配置好的silence信息,匹配到了6个etcd告警信息,这下三个节点的etcd就不会告警了。



  3. prometheus关于etcd的rules会在自动创建好etcd servicemonitor后生成,并且EtcdHighNumberOfFailedGRPCRequests有两个级别的告警,区别在于监控持续的时间不一样。

注意项

openshift的使用operator来管理prometheus,一些默认已存在的规则是无法被修改的,比如修改名为prometheus-k8s-rules的prometheusrules,一会儿后就会被还原,只能自己新增rules

altermanager告警通知配置

  1. 创建并编辑alertmanager.yaml

global:
smtp_auth_password: 111111
smtp_auth_username: 22222
smtp_from: 333333
smtp_smarthost: 44444
resolve_timeout: 5m
route:
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receiver: ragpo
routes:
- match:
alertname: DeadMansSwitch
repeat_interval: 12h
receiver: deadmansswitch
receivers:
- name: '5555'
email_configs:
- to: 55555555
- name: deadmansswitch
- name: '66666'
email_configs:
- to: 66666666

  1. 生成base64加密

cat alertmanager.yaml | base64 --wrap=0

  1. 替换


      4.删除altermanager的pod

 oc delete pods --selector=app=alertmanager -n openshift-monitoring

参考链接

https://docs.openshift.com/container-platform/3.11/install_config/prometheus_cluster_monitoring.html#configuring-etcd-monitoring_prometheus-cluster-monitoring

文章转载自野架构师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论