一、Prometheus监控云原生应用流程¶

上面流程图说明:
针对云原生应用一般本身都存在一个/metrics接口,我们需要配置一个Service指向云原生应用(集群外部的应用需要应用Service指定具体IP)。同时ServiceMonitor通过标签选择器自动发现符合条件的 Service,并开始监控它们。最后告诉Prometheus 如何监控服务(Service)。
二、Prometheus监控云原生应用Etcd¶
2.1 查找Etcd证书¶
在Prometheus监控云原生应用中的etcd时,为了进行安全的通信需要提供证书
1.根据自己环境查找Etcd证书存放位置,而Etcd证书存放位置一般都存放在Etcd配置文件。我这里配置文件路径为/etc/etcd/etcd.config.yml
$ systemctl status etcd

2.查找Etcd证书存放位置
[root@k8s-master01 ~]# grep -E "key-file|cert-file" /etc/etcd/etcd.config.yml
cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
3.测试访问 Etcd Metrics 接口,这里只取最后一行
[root@k8s-master01 ~]# curl -s --cert /etc/kubernetes/pki/etcd/etcd.pem --key /etc/kubernetes/pki/etcd/etcd-key.pem https://192.168.1.31:2379/metrics -k | tail -1
promhttp_metric_handler_requests_total{code="503"} 0
上面curl参数说明:
-s:该选项用于静默模式,禁止curl输出任何进度或错误信息,仅返回实际数据--cert /etc/kubernetes/pki/etcd/etcd.pem:这是用于指定客户端证书的选项,/etc/kubernetes/pki/etcd/etcd.pem是客户端证书的路径。客户端证书用于进行安全的HTTPS通信,确保通信是加密的--key /etc/kubernetes/pki/etcd/etcd-key.pem:这是用于指定客户端证书的私钥的选项,/etc/kubernetes/pki/etcd/etcd-key.pem是私钥文件的路径https://192.168.1.31:2379/metrics:这是目标URL,其中192.168.1.31是etcd的地址,2379是etcd的默认端口。/metrics是etcd暴露指标数据的端点-k:该选项用于忽略SSL证书验证,允许使用自签名证书或无效证书进行HTTPS通信。这在测试环境或临时环境中可能很有用,但在生产环境中慎用,因为忽略SSL证书验证会降低安全性
2.2 创建Etcd Service¶
1.配置 Etcd 的 Service 和 Endpoint
[root@k8s-master01 ~]# vim etcd-svc.yaml
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: etcd-prom
name: etcd-prom
namespace: kube-system
subsets:
- addresses:
- ip: 192.168.1.31
- ip: 192.168.1.32
- ip: 192.168.1.33
ports:
- name: https-metrics
port: 2379 # etcd 端口
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: etcd-prom
name: etcd-prom
namespace: kube-system
spec:
ports:
- name: https-metrics
port: 2379
protocol: TCP
targetPort: 2379
type: ClusterIP
注意:port的名称为https-metrics,要和后面的ServiceMonitor保持一致
2.创建该资源并查看 Service 的 ClusterIP
[root@k8s-master01 ~]# kubectl create -f etcd-svc.yaml
[root@k8s-master01 ~]# kubectl get svc -n kube-system etcd-prom
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
etcd-prom ClusterIP 10.0.113.194 <none> 2379/TCP 13s
3.通过 ClusterIP 进行服务访问测试
[root@k8s-master01 ~]# curl -s --cert /etc/kubernetes/pki/etcd/etcd.pem --key /etc/kubernetes/pki/etcd/etcd-key.pem https://10.0.113.194:2379/metrics -k | tail -1
promhttp_metric_handler_requests_total{code="503"} 0
4.创建 Etcd 证书的 Secret
[root@k8s-master01 ~]# kubectl create secret generic etcd-ssl --from-file=/etc/kubernetes/pki/etcd/etcd-ca.pem --from-file=/etc/kubernetes/pki/etcd/etcd.pem --from-file=/etc/kubernetes/pki/etcd/etcd-key.pem -n monitoring
上面参数说明:
kubectl create secret generic etcd-ssl:这是要创建通用Secret的命令,通用Secret是一种用于存储一组敏感数据的Secret类型--from-file=/etc/kubernetes/pki/etcd/etcd-ca.pem:这是用于指定从文件导入数据的选项,/etc/kubernetes/pki/etcd/etcd-ca.pem是etcd的CA证书文件的路径。CA证书是用于验证其他证书有效性的根证书--from-file=/etc/kubernetes/pki/etcd/etcd.pem:这是用于指定从文件导入数据的选项,/etc/kubernetes/pki/etcd/etcd.pem是etcd的TLS证书文件的路径。TLS证书用于进行安全的HTTPS通信--from-file=/etc/kubernetes/pki/etcd/etcd-key.pem:这是用于指定从文件导入数据的选项,/etc/kubernetes/pki/etcd/etcd-key.pem是etcd的TLS证书私钥文件的路径
5.将证书挂载至 Prometheus 容器(由于 Prometheus 是 Operator 部署的,所以只需要修改 Prometheus 资源即可)
[root@k8s-master01 ~]# kubectl edit prometheus k8s -n monitoring
...
...
secrets:
- etcd-ssl
...
...

保存后,Prometheus 的 Pod 会自动重启
[root@k8s-master01 etcd]# kubectl get po -n monitoring | grep prometheus-k8s
prometheus-k8s-0 2/2 Running 0 101s
prometheus-k8s-1 2/2 Running 0 118s
重启完成后,查看证书是否挂载,观察到证书挂载完成
[root@k8s-master01 etcd]# kubectl exec -n monitoring prometheus-k8s-0 -- ls /etc/prometheus/secrets/etcd-ssl/
etcd-ca.pem
etcd-key.pem
etcd.pem
2.3 创建Etcd ServiceMonitor¶
1.创建 Etcd 的 ServiceMonitor
[root@k8s-master01 ~]# vim servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: etcd
namespace: monitoring
labels:
app: etcd
spec:
jobLabel: k8s-app
endpoints:
- interval: 30s
port: https-metrics # 这个 port 对应 Service.spec.ports.name
scheme: https
tlsConfig:
caFile: /etc/prometheus/secrets/etcd-ssl/etcd-ca.pem #证书路径
certFile: /etc/prometheus/secrets/etcd-ssl/etcd.pem
keyFile: /etc/prometheus/secrets/etcd-ssl/etcd-key.pem
insecureSkipVerify: true # 关闭证书校验
selector:
matchLabels:
app: etcd-prom # 跟 svc 的 lables 保持一致
namespaceSelector:
matchNames:
- kube-system
上面参数说明:
(1)apiVersion和kind:指定了这个资源的API版本和类型,monitoring.coreos.com/v1表示Prometheus Operator的API版本,ServiceMonitor是自定义资源的类型
(2)metadata:用于指定ServiceMonitor资源的元数据,包括名称、命名空间和标签等
(3)spec:用于指定ServiceMonitor资源的规格,即监控目标服务的配置
(4)jobLabel: k8s-app:这表示要为目标服务的Pod选择器添加一个标签k8s-app。该标签的值通常与目标服务的app标签相同,用于标识目标服务的实例
(5)endpoints:指定要监控的目标服务的端点配置
interval: 30s:指定Prometheus抓取数据的时间间隔,这里是30秒。port: https-metrics:指定目标服务暴露的端口名称。在目标Service的定义中,该端口名称应与Service.spec.ports.name相匹配scheme: https:指定目标服务的协议,这里是HTTPStlsConfig:用于指定TLS配置,即目标服务的证书配置。其中caFile: /etc/prometheus/secrets/etcd-ssl/etcd-ca.pem:指定目标服务的CA证书路径;certFile: /etc/prometheus/secrets/etcd-ssl/etcd.pem:指定目标服务的TLS证书路径;keyFile: /etc/prometheus/secrets/etcd-ssl/etcd-key.pem:指定目标服务的TLS证书私钥路径;insecureSkipVerify: true:关闭证书校验,用于忽略对目标服务证书的校验
(6)selector:用于指定要监控的目标服务的Pod选择器。在这个示例中,它通过matchLabels匹配标签app: etcd-prom的Pod作为监控目标
(7)namespaceSelector:用于指定目标服务所在的命名空间。在这个示例中,它通过matchNames选择了kube-system命名空间,即etcd所在的命名空间
2.创建该 ServiceMonitor
[root@k8s-master01 ~]# kubectl create -f servicemonitor.yaml
servicemonitor.monitoring.coreos.com/etcd created
[root@k8s-master01 ~]# kubectl get servicemonitor -n monitoring | grep etcd
etcd 6s
2.4 Prometheus页面验证¶
1.获取Prometheus服务NodePort端口
[root@k8s-master01 ~]# kubectl get svc -n monitoring | grep prometheus-k8s
prometheus-k8s NodePort 10.0.110.215 <none> 9090:30186/TCP,8080:31400/TCP 2d2h
2.打开浏览器输入节点IP:30186后,依次点击【Status】-【Targets】后,观察到Etcd已被监控,且三个Endpoint状态都为UP


说明:Prometheus页面默认无账号密码
3.我们可以输入指标来查看Etcd相关内容,比如我们可以输入etcd_cluster_version后,点击【Excute】查看Etcd版本号

2.5 Grafana页面验证¶
1.获取Grafana服务NodePort端口
[root@k8s-master01 ~]# kubectl get svc -n monitoring | grep grafana
grafana NodePort 10.0.14.56 <none> 3000:30428/TCP 2d3h
2.打开浏览器输入节点IP:30428后,依次点击【+】-【import dashboard】

你可以登录grafana官网下载自己心仪的模板,选择好后复制【Dashboard ID】

回到grafana界面,填写刚刚复制的【Dashboard ID】后,点击【Load】

填写【Name】并选择监控来源(prometheus)后,点击【Import】

这样就可以观察到Etcd监控情况了
