什么是Prometheus Operator?
为了在Kubernetes中能够方便管理和部署Prometheus,我们使用ConfigMap管理Prometheus配置文件。每次对Prometheus配置文件进行升级时,我们需要手动移除已经运行的Pod实例,从而让Kubernetes可以使用最新的配置文件创建Prometheus。而如果当应用实例的数量更多时,通过手动的方式部署和升级Prometheus过程繁琐并且效率低下。
从本质上来讲Prometheus属于是典型的有状态应用,而其有包含了一些自身特有的运维管理和配置管理方式。而这些都无法通过Kubernetes原生提供的应用管理概念实现自动化。为了简化这类应用程序的管理复杂度,CoreOS率先引入了Operator的概念,并且首先推出了针对在Kubernetes下运行和管理Etcd的Etcd Operator。并随后推出了Prometheus Operator。
Prometheus Operator工作原理
从概念上来讲Operator就是针对管理特定应用程序的,在Kubernetes基本的Resource和Controller的概念上,以扩展Kubernetes api的形式。帮助用户创建,配置和管理复杂的有状态应用程序。从而实现特定应用程序的常见操作以及运维自动化。
在Kubernetes中我们使用Deployment、DamenSet,StatefulSet来管理应用Workload,使用Service,Ingress来管理应用的访问方式,使用ConfigMap和Secret来管理应用配置。
我们在集群中对这些资源的创建,更新,删除的动作都会被转换为事件(Event),Kubernetes的Controller Manager负责监听这些事件并触发相应的任务来满足用户的期望。这种方式我们成为声明式,用户只需要关心应用程序的最终状态,其它的都通过Kubernetes来帮助我们完成,通过这种方式可以大大简化应用的配置管理复杂度。
而除了这些原生的Resource资源以外,Kubernetes还允许用户添加自己的自定义资源(Custom Resource)。并且通过实现自定义Controller来实现对Kubernetes的扩展。
如下所示,是Prometheus Operator的架构示意图:
Prometheus的本职就是一组用户自定义的CRD资源以及Controller的实现,Prometheus Operator负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server自身以及配置的自动化管理工作。
Prometheus Operator能做什么?
要了解Prometheus Operator能做什么,其实就是要了解Prometheus Operator为我们提供了哪些自定义的Kubernetes资源,列出了Prometheus Operator目前提供的?4类资源:
-
Prometheus:声明式创建和管理 Prometheus Server实例
-
ServiceMonitor:负责声明式的管理 监控配置
-
PrometheusRule:负责声明式的管理 告警配置
-
Alertmanager:声明式的创建和管理 Alertmanager实例
简言之,Prometheus Operator能够帮助用户自动化的创建以及管理Prometheus Server以及其相应的配置。
在k8s集群中部署Prometheus Operator
以下步骤均在k8s的master节点操作
在Kubernetes中安装Prometheus Operator非常简单,用户可以从以下地址中过去Prometheus Operator的源码:
git clone https://github.com/coreos/prometheus-operator.git
上面git下来的是一个文件夹prometheus-operator,这个我已经打包成了一个压缩包,压缩包含有之后实验的所有文件,大家可以在百度网盘下载,然后上传到自己的k8s master节点,解压,参考下即可,压缩包在百度网盘地址如下:
链接:https://pan.baidu.com/s/10klyCGya4bQxrmtpxqnyHQ
提取码:cd33
这里,我们为Promethues Operator创建一个单独的命名空间monitoring:
kubectl create namespace monitoring
由于需要对Prometheus Operator进行RBAC授权,而默认的bundle.yaml中使用了default命名空间,因此,在安装Prometheus Operator之前需要先替换一下bundle.yaml文件中所有namespace定义,由default修改为monitoring。通过运行一下命令安装Prometheus Operator的Deployment实例:
cd prometheus-operator/kubectl -n monitoring apply -f bundle.yaml
注:如果报错ImagePullBackOff,表示不能拉取prometheus-operator镜像,可以把prometheus-operator.tar.gz压缩包上传到k8s的node节点,手动解压即可
docker load -i prometheus-operator.tar.gz
镜像所在的百度网盘地址如下:链接:https://pan.baidu.com/s/1zCFuQXVGrF3sdy8XiDGQMQ
提取码:5hdu
然后再执行如下即可
kubectl -n monitoring delete -f bundle.yaml
kubectl -n monitoring apply -f bundle.yaml
[root@master prometheus-operator]# kubectl -n monitoring apply -f bundle.yaml
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com configured
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com configured
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com configured
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com configured
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator configured
clusterrole.rbac.authorization.k8s.io/prometheus-operator configured
deployment.apps/prometheus-operator created
serviceaccount/prometheus-operator created
service/prometheus-operator created[root@master prometheus-operator]# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-operator-7d6496d74b-vrjcj 1/1 Running 0 48s
可以看到prometheus-operator就部署成功了。
创建Prometheus实例
当集群中已经安装Prometheus Operator之后,对于部署Prometheus Server实例就变成了声明一个Prometheus资源,如下所示,我们在Monitoring命名空间下创建一个Prometheus实例:
cat prometheus-inst.yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:name: instnamespace: monitoring
spec:resources:requests:memory: 400Mi
将以上内容保存到prometheus-inst.yaml文件,并通过kubectl进行创建:
kubectl apply -f prometheus-inst.yaml
此时,查看monitoring命名空间下的statefulsets资源,可以看到Prometheus Operator自动通过Statefulset创建的Prometheus实例:
kubectl -n monitoring get statefulset
显示如下,说明部署成功了:
NAME READY AGE
prometheus-inst 1/1 56s 50m
查看pod实例:
kubectl -n monitoring get pods
显示如下,说明部署成功了:
NAME READY STATUS RESTARTS AGE
prometheus-inst-0 3/3 Running 1 2m
prometheus-operator-5974fc7c56-7zr88 1/1 Running 0 50m
注:如果报错ErrImagePull,表示不能拉取prometheus镜像,可以把镜像压缩包prometheus-v2_17_2.tar.gz、prometheus-config-reloader_v0_39_0.tar.gz、configmap-reload_v0_3_0.tar.gz上传到k8s的node节点,手动解压:
docker load -i prometheus-v2_17_2.tar.gz
docker load -i prometheus-config-reloader_v0_39_0.tar.gz
docker load -i configmap-reload_v0_3_0.tar.gz
镜像所在的百度网盘地址如下:
链接:https://pan.baidu.com/s/1zCFuQXVGrF3sdy8XiDGQMQ
提取码:5hdu
然后再执行如下即可
kubectl delete -f prometheus-inst.yamlkubectl apply -f prometheus-inst.yaml
为prometheus实例创建service,以便在浏览器访问:cat prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:labels:app: prometheus-operatorname: prometheus-operator-svcnamespace: monitoring
spec:ports:- name: operatorport: 9090protocol: TCPtargetPort: 9090selector:app: prometheusprometheus: instsessionAffinity: Nonetype: NodePort
更新yaml文件:
kubectl apply -f prometheus-service.yaml
查看service详细信息:
kubectl get svc -n monitoring
显示如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-operated ClusterIP None <none> 9090/TCP 77m
prometheus-operator ClusterIP None <none> 8080/TCP 126m
prometheus-operator-svc NodePort 10.108.151.60 <none> 9090:31535/TCP 35s
看到最后一行prometheus-operator-svc的type类型是NodePort,在宿主机暴露的端口是31535,我们通过浏览器访问k8s的master ip:31535即可访问到prometheus ui界面,我这里k8s的master节点ip是192.168.0.6,所以在浏览器访问http://192.168.0.6:31535/config,可以看到目前Operator创建了只包含基本配置的Prometheus实例:
自己测试
[root@master prometheus-operator]# kubectl get Prometheus -n monitoring
NAME VERSION REPLICAS AGE
k8s 13h[root@master prometheus-operator]# kubectl describe servicemonitor example-app -n monitoring
Name: example-app
Namespace: monitoring
Labels: team=frontend
Annotations: <none>
API Version: monitoring.coreos.com/v1
Kind: ServiceMonitor
Metadata:Creation Timestamp: 2022-01-05T02:32:51ZGeneration: 1Managed Fields:API Version: monitoring.coreos.com/v1Fields Type: FieldsV1fieldsV1:f:metadata:f:annotations:.:f:kubectl.kubernetes.io/last-applied-configuration:f:labels:.:f:team:f:spec:.:f:endpoints:f:namespaceSelector:.:f:matchNames:f:selector:.:f:matchLabels:.:f:app:Manager: kubectl-client-side-applyOperation: UpdateTime: 2022-01-05T02:32:51ZResource Version: 521996Self Link: /apis/monitoring.coreos.com/v1/namespaces/monitoring/servicemonitors/example-appUID: cc1460d4-e720-4c47-8258-8f5d4a72bcd1
Spec:Endpoints:Port: webNamespace Selector:Match Names:defaultSelector:Match Labels:App: example-app
Events: <none>