当前位置: 代码迷 >> 综合 >> Prometheus Operator 介绍 安装
  详细解决方案

Prometheus Operator 介绍 安装

热度:58   发布时间:2023-09-30 10:44:51.0

什么是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 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实例:

Prometheus Operator 介绍 安装

自己测试


[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>
  相关解决方案