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

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

Prometheus监控云原生应用Etcd-1

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监控云原生应用Etcd-2

保存后,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)apiVersionkind:指定了这个资源的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:指定目标服务的协议,这里是HTTPS
  • tlsConfig:用于指定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监控云原生应用Etcd-3

Prometheus监控云原生应用Etcd-4

说明:Prometheus页面默认无账号密码

3.我们可以输入指标来查看Etcd相关内容,比如我们可以输入etcd_cluster_version后,点击【Excute】查看Etcd版本号

Prometheus监控云原生应用Etcd-5

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】

Prometheus监控云原生应用Etcd-6

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

Prometheus监控云原生应用Etcd-7

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

Prometheus监控云原生应用Etcd-8

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

Prometheus监控云原生应用Etcd-9

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

Prometheus监控云原生应用Etcd-10