Operator 简介
Operator 是由 CoreOS 公司开发的用来扩展 Kubernetes API 的特定应用程序控制器,用来创建,配置和管理复杂的有状态应用,例如数据库,缓存和监控系统。Prometheus Operator 就是基于 Operator 框架开发的管理 Prometheus 集群的控制器。
目前,CoreOS 官方提供了几种 Operator 的代码实现,其中就包括 Prometheus Operator。如下图所示,是 Prometheus Operator 官方提供的架构图
其中,Operator 是核心部分,作为一个控制器而存在。Operator 会创建 Prometheus,ServiceMonitor,Alertmanager 以及 PrometheusRule 这四个 CRD 资源对象,然后一直监控并维持这四个 CRD 资源对象的状态。
- Prometheus 资源对象时作为 Prometheus Server 存在;
- ServiceMonitor 资源对象是专门提供 metrics 数据接口的 exporter 的抽象;
- Alertmanager 资源对象是对应 AlertManager 组件的抽象;
- PrometheusRule 资源对象是被 Prometheus 实例使用的告警规则文件的抽象。
这样,在集群中监控数据,就变成直接去操作 Kubernetes 集群的资源对象了。上图中的 Service,ServiceMonitor 都是 Kubernetes 的资源,一个 ServiceMonitor 可以通过 labelSelector匹配一类 Service,Prometheus 也可以通过 labelSelector 匹配多个 ServiceMonitor,而且 Prometheus 和 AlertManager 都是自动感知监控告警配置的变化的,不需要人为进行 reload 操作。
云原生应用的监控
在 Prometheus Operator 中添加自定义的监控项是非常简单的,大致步骤如下:
- 首先,建立一个 ServiceMonitor 对象,用于为 Prometheus 添加监控项;
- 然后,将 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象;
- 最后,Service 对象可以正确获取 metrics 数据。
接下来以添加 etcd 集群的监控来演示云原生应用的监控配置方法。对于 etcd 集群,在一般情况下为了安全性,都会开启 HTTPS 证书认证的方式,所以想让 Prometheus 访问到 etcd 集群的监控数据,还需要提供相应的证书校验。
测试访问 Etcd Metrics 接口
在命令行使用以下命令测试 Etcd 的 metrics 接口是否正常
1
2
3
4# curl -s -k --cert /usr/local/etcd/ssl/etcd.pem --key /usr/local/etcd/ssl/etcd-key.pem https://192.168.55.111:2379/metrics |tail -3
promhttp_metric_handler_requests_total{code="200"} 1
promhttp_metric_handler_requests_total{code="500"} 1
promhttp_metric_handler_requests_total{code="503"} 0二进制安装的 Etcd 集群证书的位置可以在 Etcd 配置文件中获得,kubeadm 安装方式部署的 k8s 集群可以使用 kubectl 工具获取 etcd 启动时的证书路径:
1
kubectl get pods etcd-master -n kube-system -o yaml
配置监控 Etcd
由于这里是使用的二进制方式部署的集群外的 ETCD,所以需要先配置 Service 代理外部的 Etcd。
创建 Etcd Service
创建 etcd-svc.yaml 文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31apiVersion: v1
kind: Endpoints
metadata:
labels:
app: etcd-prom
name: etcd-prom
namespace: kube-system
subsets:
- addresses:
- ip: 192.168.55.111
- ip: 192.168.55.112
- ip: 192.168.55.113
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 保持一致。
创建该资源并查看 Service 的 ClusterIP
1
2
3
4
5
6
7# kubectl create -f etcd-svc.yaml
endpoints/etcd-prom created
service/etcd-prom created
# kubectl get svc -n kube-system etcd-prom
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
etcd-prom ClusterIP 10.97.117.50 <none> 2379/TCP 53s通过 ClusterIP 访问测试
1
2
3
4# curl -s -k --cert /usr/local/etcd/ssl/etcd.pem --key /usr/local/etcd/ssl/etcd-key.pem https://10.97.117.50:2379/metrics |tail -3
promhttp_metric_handler_requests_total{code="200"} 0
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
创建 Etcd ServiceMonitor
由于 Etcd 默认需要使用 HTTPS 协议,所以需要先创建 Etcd 证书的 Secret,使用以下命令创建 Secret
1
2
3
4kubectl create secret generic etcd-ssl \
--from-file=/usr/local/etcd/ssl/etcd-ca.pem \
--from-file=/usr/local/etcd/ssl/etcd.pem \
--from-file=/usr/local/etcd/ssl/etcd-key.pem -n monitoring将证书挂载到 Prometheus 容器,由于这里 Prometheus 是 Operator 部署的,所以只需要修改 Prometheus 资源既可
- 使用以下命令编辑 Prometheus 资源对象
1
# kubectl edit prometheus -n monitoring k8s
- 在以下位置添加 secrets 相关配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
...
spec:
...
podMonitorNamespaceSelector: {}
podMonitorSelector: {}
probeNamespaceSelector: {}
probeSelector: {}
replicas: 2
secrets:
- etcd-ssl
...更新完成之后,可以在 Prometheus 的 Pod 中获取上面创建的 etcd 证书文件了,使用以下命令进入 Pod 中查看具体的路径
1
2
3
4# kubectl exec -i -t prometheus-k8s-0 -n monitoring -- sh
/prometheus $ ls /etc/prometheus/secrets/etcd-ssl/
etcd-ca.pem etcd-key.pem etcd.pem现在,Prometheus 访问 Etcd 集群的证书已经准备好了,接下来创建 ServiceMonitor 对象既可。如下,创建一个名为 etcd-servicemonitor.yaml 文件,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24apiVersion: 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 # svc 所在的 namespace使用以下命令创建 ServiceMonitor 对象
1
2
3
4
5
6# kubectl create -f etcd-servicemonitor.yaml
servicemonitor.monitoring.coreos.com/etcd created
# kubectl get servicemonitors etcd -n monitoring
NAME AGE
etcd 5m47s可以看到在 monitoring 命名空间下已经创建了名为 etcd 的 ServiceMonitor 对象。
创建完成后,在 Prometheus 的Web UI即可看到相关配置
配置 Grafana
接下来配置 Grafana Dashboard,添加 Etcd 的监控面板。
访问 Grafana 页面,导入
https://grafana.com/grafana/dashboards/3070
地址的面板
点击 Load,然后数据源选择 Prometheus,点击 Import 既可
效果图如下