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

Prometheus-operator监控外部etcd集群

NFT艺术之家 2019-10-10
351


标签: prometheus-operator 、 etcd 、监控 、 monitor


先决条件

  • 一个稳定的Kubernetes集群

  • 成功部署prometheus-operator

  • etcd在kubernets集群之外


原因

我们业务上面刚从自建的Kubernetes集群迁移到阿里云的专业版Kubernetes,很多地方有不一样的地方,之前自建的Kubernetes使用的是kubeadm的etcd集群,阿里云的专业版本使用的是外部的etcd集群,所以就有了这次记录。


技术点

  • 外部etcd没有endpoint

  • 外部etcd没有svc


操作

1. 获取etcd的客户端证书,并创建为secret

[root@dev-rc-master-01 cert]# ps -aux |egrep '/usr/bin/etcd'
root 1379 0.0 0.0 112724 992 pts/0 S+ 10:30 0:00 grep -E --color=auto /usr/bin/etcd
etcd 3222 4.8 6.7 11137048 537176 ? Ssl 725 1458:58 /usr/bin/etcd --election-timeout=3000 --heartbeat-interval=500 --snapshot-count=50000 --data-dir=data.etcd --name 10.1.65.203-name-3 --client-cert-auth --trusted-ca-file=/var/lib/etcd/cert/ca.pem --cert-file=/var/lib/etcd/cert/etcd-server.pem --key-file=/var/lib/etcd/cert/etcd-server-key.pem --peer-client-cert-auth --peer-trusted-ca-file=/var/lib/etcd/cert/peer-ca.pem --peer-cert-file=/var/lib/etcd/cert/10.1.65.203-name-3.pem --peer-key-file=/var/lib/etcd/cert/10.1.65.203-name-3-key.pem --initial-advertise-peer-urls https://10.1.65.203:2380 --listen-peer-urls https://10.1.65.203:2380 --advertise-client-urls https://10.1.65.203:2379 --listen-client-urls https://10.1.65.203:2379 --initial-cluster 10.1.65.201-name-1=https://10.1.65.201:2380,10.1.65.202-name-2=https://10.1.65.202:2380,10.1.65.203-name-3=https://10.1.65.203:2380 --initial-cluster-state new --initial-cluster-token 7801f61a-7b1e-49fa-9657-e692e05e20b7
复制


从上面的结果来看,阿里云的部署集群etcd证书存储和kubeadm默认初始化的路径是不一样的,这里etcd证书存储在/var/lib/etcd/cert/下面,查看客户端的证书文件:

[root@dev-rc-master-01 cert]# ls |egrep client
etcd-client.csr
etcd-client-key.pem
etcd-client.pem
复制

创建monitoring命名空间下的secret

[root@dev-rc-master-01 cert]#kubectl -n monitoring create secret generic etcd-certs --from-file=ca.pem --from-file=etcd-client-key.pem --from-file=etcd-client.pem
复制

如果是kubeadm初始化的etcd集群,默认是这三个文件:

--cacert=/etc/kubernetes/pki/etcd/ca.crt
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key
复制

对应关系为:


ca.crt  ->  ca.pem

healthcheck-client.crt ->  etcd-client.pem

healthcheck-client.key ->  etcd-client-key.pem



查看创建好的secret

[root@dev-rc-master-01 cert]# kubectl get -n monitoring secret|egrep etcd-certs
etcd-certs Opaque 3 75m
复制

2.创建ServiceMonitor

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: etcd-k8s
namespace: monitoring
labels:
k8s-app: etcd-k8s
spec:
jobLabel: k8s-app
endpoints:
- port: port
interval: 30s
scheme: https
tlsConfig:
caFile: /etc/prometheus/secrets/etcd-certs/ca.pem
certFile: /etc/prometheus/secrets/etcd-certs/etcd-client.pem
keyFile: /etc/prometheus/secrets/etcd-certs/etcd-client-key.pem
insecureSkipVerify: true
selector:
matchLabels:
k8s-app: etcd
namespaceSelector:
matchNames:
- kube-system
复制

创建一个serviceMonitor的对象,配置了基本数据元,拉取周期为30s,拉取方式为https,并且配置了证书,跳过http可信检查,匹配kube-system命名空间下的labels的key值为k8s-app,value值为etcd的svc。

kubectl apply -f etcd-servicemonitor.yaml
复制

3.创建service

apiVersion: v1
kind: Service
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
spec:
type: ClusterIP
clusterIP: None
ports:
- name: port
port: 2379
protocol: TCP


---
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
subsets:
- addresses:
- ip: 10.1.65.201
nodeName: cn-hangzhou.10.1.65.201
- ip: 10.1.65.202
nodeName: cn-hangzhou.10.1.65.202
- ip: 10.1.65.203
nodeName: cn-hangzhou.10.1.65.203
ports:
- name: port
port: 2379
protocol: TCP
复制

这里的service和以往的service不同,这里没用labels匹配pods,因为这里的etcd根本没有pods。这里有一个细节值得注意的就是endpoints,部分metadata的内容必须和service一致。下面的nodeName不能重复。这里别忘了应用:

kubectl apply -f etcd-service.yaml
复制

Prometheus挂载etcd的secret

prometheus-operator的的部署文件中有一个文件名为:prometheus-prometheus.yaml的文件.细节可以查看官方文档。

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
prometheus: k8s
name: k8s
namespace: monitoring
spec:
alerting:
alertmanagers:
- name: alertmanager-main
namespace: monitoring
port: web
baseImage: quay.io/prometheus/prometheus
nodeSelector:
beta.kubernetes.io/os: linux
secrets:
- etcd-certs
podMonitorSelector: {}
replicas: 2
resources:
requests:
memory: 400Mi
ruleSelector:
matchLabels:
prometheus: k8s
role: alert-rules
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 1000
serviceAccountName: prometheus-k8s
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector: {}
version: v2.11.0
复制


这里17行的secrets是我们后来加的,默认的文件中是没有这个内容的.


应用部署prometheus


[root@dev-rc-master-01 manifests]# kubectl apply -f prometheus-prometheus.yaml
复制


登录prometheus的web页面查看配置



这个时候prometheus开始正常抓取etcd的数据了,我们接下来可以去下载一个现有的Grafana的dashboard,然后对他做一些自定义配置,就可以正常使用了.



导入以上这个dashbaord到grafana可以是直接在web界面导入,也可以通过生成ConfigMap来挂载到grafana,各有好处吧,不过configmap的方法,后期如果要修改比较麻烦毕竟要去看懂那么大的一个JSON文件。


总结:

  • 在Prometheus-operator有很多和手动配置的Prometheus的地方有很多不同的,但是数量以后确实是简单了不少,一定要多看https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md这里的文档。

  • 由于阿里云的etcd外部集群证书使用的是cfssl工具生成的和kubeadm的生成的在文件命名上面有差别,如果在prometheus的web界面上在Configuration中可以找到etcd的配置但是在Targets中没有,很有可能就是证书配置错误了,可以通过查看prometheus-k8s-01的容器查看日志,是否为etcd证书不可用的错误,如果是就可以定位到问题了

  • 目前还没找到在Prmetheus对象中直接挂载本地时区文件,如果应用后想用东八区目前我是直接手动修改statefulsets.apps,缺点就是在应用了Prometheus对象后就又要重新修改一下<对应的文件名:prometheus-prometheus.yaml>


欢迎订阅分享

公众号:ITBUF

企鹅号:TSG技术分享

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

评论