转摘Prometheus Operator

允若彤阅读量 17

文章目录

  • 01 引言
  • 02 初识Prometheus Operator
  • 2.1 什么是Prometheus Operator?
  • 2.2 Prometheus Operator能做什么?
  • 03 在Kubernetes集群中部署Prometheus Operator
  • 3.1 下载
  • 3.2 配置
  • 04 Prometheus Operator的使用
  • 4.1 Operator管理Prometheus
  • 4.1.1 创建Prometheus实例
  • 4.1.2 使用ServiceMonitor管理监控配置
  • 4.1.3 关联Promethues与ServiceMonitor
  • 4.1.4 自定义ServiceAccount
  • 4.2 Operator管理监控配置
  • 4.2.1 使用Prometheus Rule定义告警规则
  • 4.2.2 使用Operator管理Alertmanager实例
  • 4.3 在Operator中使用自定义配置
  • 05 文末

01 引言

为了在​​Kubernetes​​​能够方便的管理和部署​​Prometheus​​​,我们使用​​ConfigMap​​​管理​​Prometheus​​配置文件。

如果每次对Prometheus配置文件进行升级时,我们需要手动移除已经运行的 ​Pod​ 实例,从而让 ​Kubernetes​ 可以使用最新的配置文件创建 ​Prometheus​ ,当应用实例的数量更多时,通过手动的方式部署和升级 ​Prometheus​ 过程繁琐并且效率低下。


问题 :从本质上来讲​​Prometheus​​​属于是典型的有状态应用,而其有包含了一些自身特有的运维管理和配置管理方式,而这些都无法通过​​Kubernetes​​原生提供的应用管理概念实现自动化。

解决方案 :++为了简化这类应用程序的管理复杂度,++ ​++CoreOS++​++率先引入了++ ++​​Operator​​++ ++的概念,并且首先推出了针对在++ ++​​Kubernetes​​++ ++下运行和管理++ ++​​Etcd​​++ ++的++ ++​​Etcd Operator​​++ ++,并随后推出了++ ++​​Prometheus Operator​​++。

02 初识Prometheus Operator

2.1 什么是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_自定义](https://s2.51cto.com/images/blog/202205/07003841_62754f11ea5914118.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184 "在这里插入图片描述")

上图有两个概念:

  • Prometheus :本质就是一组用户自定义的​CRD​资源以及​Controller​的实现。
  • Prometheus Operator 负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如​Prometheus Server​自身以及配置的自动化管理工作。

2.2 Prometheus Operator能做什么?

要了解​​Prometheus Operator​​​能做什么,其实就是要了解​​Prometheus Operator​​​为我们提供了哪些自定义的​​Kubernetes​​​资源,列出了​​Prometheus Operator​​目前提供的️4类资源:

  • Prometheus :声明式创建和管理​Prometheus Server​实例;
  • ServiceMonitor:负责声明式的管理监控配置;
  • PrometheusRule:负责声明式的管理告警配置;
  • Alertmanager :声明式的创建和管理​Alertmanager​实例。

简言之,​​Prometheus Operator​​​能够帮助用户自动化的创建以及管理​​Prometheus Server​​以及其相应的配置。

03 在Kubernetes集群中部署Prometheus Operator

3.1 下载

在​​Kubernetes​​​中安装​​Prometheus Operator​​​非常简单,用户可以从以下地址中过去​​Prometheus Operator​​的源码:

复制代码
git clone https://github.com/coreos/prometheus-operator.git

3.2 配置

这里,我们为​​Promethues Operator​​​创建一个单独的命名空间​​monitoring​​:

复制代码
kubectl create namespace monitoring

由于需要对​​Prometheus Operator​​​进行​​RBAC​​​授权,而默认的​​bundle.yaml​​​中使用了​​default​​​命名空间,因此,在安装​​Prometheus Operator​​​之前需要先替换一下​​bundle.yaml​​​文件中所有​​namespace​​​定义,由​​default​​​修改为​​monitoring​​​,通过运行以下命令安装​​Prometheus Operator​​​的​​Deployment​​实例:

复制代码
$ kubectl -n monitoring apply -f bundle.yaml
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
clusterrole.rbac.authorization.k8s.io/prometheus-operator created
deployment.apps/prometheus-operator created
serviceaccount/prometheus-operator created
service/prometheus-operator created

​Prometheus Operator​​​通过​​Deployment​​​的形式进行部署,目的是让​​Prometheus Operator​​​能够监听和管理​​Kubernetes​​​资源同时也创建了单独的​​ServiceAccount​​以及相关的授权动作。

查看​​Prometheus Operator​​部署状态,以确保已正常运行:

复制代码
$ kubectl -n monitoring get pods
NAME                                   READY     STATUS    RESTARTS   AGE
prometheus-operator-6db8dbb7dd-2hz55   1/1       Running   0          19s

04 Prometheus Operator的使用

4.1 Operator管理Prometheus

4.1.1 创建Prometheus实例

当集群中已经安装​​Prometheus Operator​​​之后,对于部署​​Prometheus Server​​​实例就变成了声明一个​​Prometheus​​​资源,如下所示,我们在​​Monitoring​​​命名空间下创建一个​​Prometheus​​实例:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: inst
  namespace: monitoring
spec:
  resources:
    requests:
      memory: 400Mi

将以上内容保存到​​prometheus-inst.yaml​​​文件,并通过​​kubectl​​进行创建:

复制代码
$ kubectl create -f prometheus-inst.yaml
prometheus.monitoring.coreos.com/inst-1 created

此时,查看​​monitoring​​​命名空间下的​​statefulsets​​​资源,可以看到​​Prometheus Operator​​​自动通过​​Statefulset​​​创建的​​Prometheus​​实例:

复制代码
$ kubectl -n monitoring get statefulsets
NAME              DESIRED   CURRENT   AGE
prometheus-inst   1         1         1m

查看Pod实例:

复制代码
$ kubectl -n monitoring get pods
NAME                                   READY     STATUS    RESTARTS   AGE
prometheus-inst-0                      3/3       Running   1          1m
prometheus-operator-6db8dbb7dd-2hz55   1/1       Running   0          45m

通过​​port-forward​​​访问​​Prometheus​​实例:

复制代码
$ kubectl -n monitoring port-forward statefulsets/prometheus-inst 9090:9090

通过http://localhost:9090可以在本地直接打开​​Prometheus Operator​​创建的​​Prometheus​​实例,查看配置信息,可以看到目前​​Operator​​创建了只包含基本配置的​​Prometheus​​实例:

![Prometheus Operator_自定义_02](https://s2.51cto.com/images/blog/202205/07003842_62754f12434dd52135.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184 "在这里插入图片描述")

4.1.2 使用ServiceMonitor管理监控配置

修改监控配置项也是​​Prometheus​​​下常用的运维操作之一,为了能够自动化的管理​​Prometheus​​​的配置,​​Prometheus Operator​​使用了 ++自定义资源类型++++ServiceMonitor++​ 来描述监控对象的信息。

这里我们首先在集群中部署一个示例应用,将以下内容保存到​​example-app.yaml​​​,并使用​​kubectl​​命令行工具创建:

复制代码
kind: Service
apiVersion: v1
metadata:
  name: example-app
  labels:
    app: example-app
spec:
  selector:
    app: example-app
  ports:
  - name: web
    port: 8080
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: example-app
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: example-app
        image: fabxc/instrumented_app
        ports:
        - name: web
          containerPort: 8080

示例应用会通过​​Deployment​​​创建3个​​Pod​​​实例,并且通过​​Service​​暴露应用访问信息:

复制代码
$ kubectl get pods
NAME                        READY     STATUS    RESTARTS   AGE
example-app-94c8bc8-l27vx   2/2       Running   0          1m
example-app-94c8bc8-lcsrm   2/2       Running   0          1m
example-app-94c8bc8-n6wp5   2/2       Running   0          1m

在本地同样通过​​port-forward​​​访问任意​​Pod​​实例:

复制代码
$ kubectl port-forward deployments/example-app 8080:8080

访问本地的​​http://localhost:8080/metrics​​实例应用程序会返回以下样本数据:

复制代码
# TYPE codelab_api_http_requests_in_progress gauge
codelab_api_http_requests_in_progress 3
# HELP codelab_api_request_duration_seconds A histogram of the API HTTP request durations in seconds.
# TYPE codelab_api_request_duration_seconds histogram
codelab_api_request_duration_seconds_bucket{method="GET",path="/api/bar",status="200",le="0.0001"} 0

为了能够让​​Prometheus​​​能够采集部署在​​Kubernetes​​​下应用的监控数据,在原生的​​Prometheus​​​配置方式中,我们在​​Prometheus​​​配置文件中定义单独的​​Job​​​,同时使用​​kubernetes_sd​​定义整个服务发现过程。


而在​​Prometheus Operator​​​中,则可以直接声明一个​​ServiceMonitor​​对象,如下所示:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
  namespace: monitoring
  labels:
    team: frontend
spec:
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: example-app
  endpoints:
  - port: web

通过定义​​selector​​​中的标签定义选择监控目标的​​Pod​​​对象,同时在​​endpoints​​​中指定​​port​​​名称为​​web​​​的端口。默认情况下​​ServiceMonitor​​​和监控对象必须是在相同​​Namespace​​下的。

在本示例中由于​​Prometheus​​​是部署在​​Monitoring​​​命名空间下,因此为了能够关联​​default​​​命名空间下的​​example​​​对象,需要使用​​namespaceSelector​​​定义让其可以跨命名空间关联​​ServiceMonitor​​资源。

保存以上内容到​​example-app-service-monitor.yaml​​​文件中,并通过​​kubectl​​创建:

复制代码
$ kubectl create -f example-app-service-monitor.yaml
servicemonitor.monitoring.coreos.com/example-app created

如果希望​​ServiceMonitor​​可以关联任意命名空间下的标签,则通过以下方式定义:

复制代码
spec:
  namespaceSelector:
    any: true

如果监控的​​Target​​​对象启用了​​BasicAuth​​​认证,那在定义​​ServiceMonitor​​​对象时,可以使用​​endpoints​​​配置中定义​​basicAuth​​如下所示:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
  namespace: monitoring
  labels:
    team: frontend
spec:
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: example-app
  endpoints:
  - basicAuth:
      password:
        name: basic-auth
        key: password
      username:
        name: basic-auth
        key: user
    port: web

其中​​basicAuth​​​中关联了名为​​basic-auth​​​的​​Secret​​​对象,用户需要手动将认证信息保存到​​Secret​​中:

复制代码
apiVersion: v1
kind: Secret
metadata:
  name: basic-auth
data:
  password: dG9vcg== # base64编码后的密码
  user: YWRtaW4= # base64编码后的用户名
type: Opaque

4.1.3 关联Promethues与ServiceMonitor

为了能够让​​Prometheus​​​关联到​​ServiceMonitor​​​,需要在​​Pormtheus​​​定义中使用​​serviceMonitorSelector​​​,我们可以通过标签选择当前​​Prometheus​​​需要监控的​​ServiceMonitor​​​对象,修改​​prometheus-inst.yaml​​​中​​Prometheus​​的定义如下所示:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: inst
  namespace: monitoring
spec:
  serviceMonitorSelector:
    matchLabels:
      team: frontend
  resources:
    requests:
      memory: 400Mi

将对​​Prometheus​​的变更应用到集群中:

复制代码
$ kubectl -n monitoring apply -f prometheus-inst.yaml

此时,如果查看​​Prometheus​​​配置信息,我们会惊喜的发现​​Prometheus​​​中配置文件自动包含了一条名为​​monitoring/example-app/0​​​的​​Job​​配置:

复制代码
global:
  scrape_interval: 30s
  scrape_timeout: 10s
  evaluation_interval: 30s
  external_labels:
    prometheus: monitoring/inst
    prometheus_replica: prometheus-inst-0
alerting:
  alert_relabel_configs:
  - separator: ;
    regex: prometheus_replica
    replacement: $1
    action: labeldrop
rule_files:
- /etc/prometheus/rules/prometheus-inst-rulefiles-0/*.yaml
scrape_configs:
- job_name: monitoring/example-app/0
  scrape_interval: 30s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - default
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_label_app]
    separator: ;
    regex: example-app
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_endpoint_port_name]
    separator: ;
    regex: web
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
    separator: ;
    regex: Node;(.*)
    target_label: node
    replacement: ${1}
    action: replace
  - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
    separator: ;
    regex: Pod;(.*)
    target_label: pod
    replacement: ${1}
    action: replace
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: service
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_name]
    separator: ;
    regex: (.*)
    target_label: pod
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: job
    replacement: ${1}
    action: replace
  - separator: ;
    regex: (.*)
    target_label: endpoint
    replacement: web
    action: replace

不过,如果细心的读者可能会发现,虽然​​Job​​​配置有了,但是​​Prometheus​​​的​​Target​​​中并没包含任何的监控对象。查看​​Prometheus​​​的​​Pod​​实例日志,可以看到如下信息:

复制代码
level=error ts=2018-12-15T12:52:48.452108433Z caller=main.go:240 component=k8s_client_runtime err="github.com/prometheus/prometheus/discovery/kubernetes/kubernetes.go:300: Failed to list *v1.Endpoints: endpoints is forbidden: User \"system:serviceaccount:monitoring:default\" cannot list endpoints in the namespace \"default\""

4.1.4 自定义ServiceAccount

由于默认创建的​​Prometheus​​​实例使用的是​​monitoring​​​命名空间下的​​default​​​账号,该账号并没有权限能够获取​​default​​命名空间下的任何资源信息。

为了修复这个问题,我们需要在​​Monitoring​​​命名空间下为创建一个名为​​Prometheus​​​的​​ServiceAccount​​,并且为该账号赋予相应的集群访问权限。

复制代码
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

将以上内容保存到​​prometheus-rbac.yaml​​​文件中,并且通过​​kubectl​​创建相应资源:

复制代码
$ kubectl -n monitoring create -f prometheus-rbac.yaml
serviceaccount/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created

在完成​​ServiceAccount​​​创建后,修改​​prometheus-inst.yaml​​​,并添加​​ServiceAccount​​如下所示:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: inst
  namespace: monitoring
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      team: frontend
  resources:
    requests:
      memory: 400Mi

保存​​Prometheus​​变更到集群中:

复制代码
$ kubectl -n monitoring apply -f prometheus-inst.yaml
prometheus.monitoring.coreos.com/inst configured

等待​​Prometheus Operator​​​完成相关配置变更后,此时查看​​Prometheus​​​,我们就能看到当前​​Prometheus​​已经能够正常的采集实例应用的相关监控数据了。

4.2 Operator管理监控配置

4.2.1 使用Prometheus Rule定义告警规则


对于​​Prometheus​​​而言,在原生的管理方式上,我们需要手动创建​​Prometheus​​​的告警文件,并且通过在​​Prometheus​​配置中声明式的加载。


而在​​Prometheus Operator​​​模式中,告警规则也编程一个通过​​Kubernetes API ​​声明式创建的一个资源,如下所示:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: example
    role: alert-rules
  name: prometheus-example-rules
spec:
  groups:
  - name: ./example.rules
    rules:
    - alert: ExampleAlert
      expr: vector(1)

将以上内容保存为​​example-rule.yaml​​​文件,并且通过​​kubectl​​命令创建相应的资源:

复制代码
$ kubectl -n monitoring create -f example-rule.yaml
prometheusrule "prometheus-example-rules" created

告警规则创建成功后,通过在​​Prometheus​​​中使用​​ruleSelector​​​通过选择需要关联的​​PrometheusRule​​即可:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: inst
  namespace: monitoring
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      team: frontend
  ruleSelector:
    matchLabels:
      role: alert-rules
      prometheus: example
  resources:
    requests:
      memory: 400Mi

​Prometheus​​重新加载配置后,从​​UI​​中我们可以查看到通过​​PrometheusRule​​自动创建的告警规则配置:

![Prometheus Operator_k8s_03](https://s2.51cto.com/images/blog/202205/07003842_62754f1270c0550352.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184 "在这里插入图片描述")

如果查看​​Alerts​​页面,我们会看到告警已经处于触发状态。

4.2.2 使用Operator管理Alertmanager实例

到目前为止,我们已经通过​​Prometheus Operator​​​的自定义资源类型管理了​​Promtheus​​​的实例,监控配置以及告警规则等资源;通过​​Prometheus Operator​​​将原本手动管理的工作全部变成声明式的管理模式,大大简化了​​Kubernetes​​​下的​​Prometheus​​运维管理的复杂度。

接下来,我们将继续使用​​Promtheus Operator​​​定义和管理​​Alertmanager​​​相关的内容。为了通过​​Prometheus Operator​​​管理​​Alertmanager​​​实例,用户可以通过自定义资源​​Alertmanager​​​进行定义,如下所示,通过​​replicas​​​可以控制​​Alertmanager​​的实例数:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
  name: inst
  namespace: monitoring
spec:
  replicas: 3

当​​replicas​​​大于1时,​​Prometheus Operator​​​会自动通过集群的方式创建​​Alertmanager​​​。将以上内容保存为文件​​alertmanager-inst.yaml​​,并通过以下命令创建:

复制代码
$ kubectl -n monitoring create -f alertmanager-inst.yaml
alertmanager.monitoring.coreos.com/inst created

查看Pod的情况如下所示,我们会发现​​Alertmanager​​​的​​Pod​​​实例一直处于​​ContainerCreating​​的状态中:

复制代码
$ kubectl -n monitoring get pods
NAME                                   READY     STATUS              RESTARTS   AGE
alertmanager-inst-0                    0/2       ContainerCreating   0          32s

通过​​kubectl describe​​​命令查看该​​Alertmanager​​​的​​Pod​​实例状态,可以看到类似于以下内容的告警信息:

复制代码
MountVolume.SetUp failed for volume "config-volume" : secrets "alertmanager-inst" not found

这是由于​​Prometheus Operator​​​通过​​Statefulset​​​的方式创建的​​Alertmanager​​​实例,在默认情况下,会通过​​alertmanager-{ALERTMANAGER_NAME}​​​的命名规则去查找​​Secret​​​配置并以文件挂载的方式,将​​Secret​​​的内容作为配置文件挂载到​​Alertmanager​​实例当中。

因此,这里还需要为​​Alertmanager​​​创建相应的配置内容,如下所示,是​​Alertmanager​​的配置文件:

复制代码
global:
  resolve_timeout: 5m
route:
  group_by: ['job']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
  receiver: 'webhook'
receivers:
- name: 'webhook'
  webhook_configs:
  - url: 'http://alertmanagerwh:30500/'

将以上内容保存为文件​​alertmanager.yaml​​​,并且通过以下命令创建名为alrtmanager-​​inst​​​的​​Secret​​资源:

复制代码
$ kubectl -n monitoring create secret generic alertmanager-inst --from-file=alertmanager.yaml
secret/alertmanager-inst created

在​​Secret​​​创建成功后,查看当前​​Alertmanager Pod​​实例状态。如下所示:

复制代码
$ kubectl -n monitoring get pods
NAME                                   READY     STATUS    RESTARTS   AGE
alertmanager-inst-0                    2/2       Running   0          5m
alertmanager-inst-1                    2/2       Running   0          52s
alertmanager-inst-2                    2/2       Running   0          37s

使用​​port-forward​​​将​​Alertmanager​​映射到本地:

复制代码
$ kubectl -n monitoring port-forward statefulsets/alertmanager-inst 9093:9093

访问http://localhost:9093/#/status,并查看当前集群状态:

![Prometheus Operator_Prometheus_04](https://s2.51cto.com/images/blog/202205/07003842_62754f12a81ba62116.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184 "在这里插入图片描述")

接下来,我们只需要修改我们的​​Prometheus​​资源定义,通过​​alerting​​指定使用的​​Alertmanager​​资源即可:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: inst
  namespace: monitoring
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      team: frontend
  ruleSelector:
    matchLabels:
      role: alert-rules
      prometheus: example
  alerting:
    alertmanagers:
    - name: alertmanager-example
      namespace: monitoring
      port: web
  resources:
    requests:
      memory: 400Mi

等待​​Prometheus​​​重新加载后,我们可以看到​​Prometheus Operator​​在配置文件中添加了以下配置:

复制代码
alertmanagers:
  - kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
        - monitoring
    scheme: http
    path_prefix: /
    timeout: 10s
    relabel_configs:
    - source_labels: [__meta_kubernetes_service_name]
      separator: ;
      regex: alertmanager-example
      replacement: $1
      action: keep
    - source_labels: [__meta_kubernetes_endpoint_port_name]
      separator: ;
      regex: web
      replacement: $1
      action: keep

通过服务发现规则将​​Prometheus​​​与​​Alertmanager​​进行了自动关联。

4.3 在Operator中使用自定义配置

在​​Prometheus Operator​​​我们通过声明式的创建如​​Prometheus, ServiceMonitor​​​这些自定义的资源类型来自动化部署和管理​​Prometheus​​的相关组件以及配置。

而在一些特殊的情况下,对于用户而言,可能还是希望能够手动管理​​Prometheus​​​配置文件,而非通过​​Prometheus Operator​​自动完成。 为什么?

  • 实际上​Prometheus Operator​对于​Job​的配置只适用于在​Kubernetes​中部署和管理的应用程序。如果你希望使用​Prometheus​监控一些其他的资源,例如​AWS​或者其他平台中的基础设施或者应用,这些并不在​Prometheus Operator​的能力范围之内。

为了能够在通过​​Prometheus Operator​​​创建的​​Prometheus​​​实例中使用自定义配置文件,我们只能创建一个不包含任何与配置文件内容相关的​​Prometheus​​实例:

复制代码
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: inst-cc
  namespace: monitoring
spec:
  serviceAccountName: prometheus
  resources:
    requests:
      memory: 400Mi

将以上内容保存到​​prometheus-inst-cc.yaml​​​文件中,并且通过​​kubectl​​创建:

复制代码
$ kubectl -n monitoring create -f prometheus-inst-cc.yaml
prometheus.monitoring.coreos.com/inst-cc created

如果查看新建​​Prometheus​​​的​​Pod​​​实例​​YAML​​​定义,我们可以看到​​Pod​​​中会包含一个​​volume​​配置:

复制代码
volumes:
  - name: config
    secret:
      defaultMode: 420
      secretName: prometheus-inst-cc

​Prometheus​​​的配置文件实际上是保存在名为​​prometheus-<name-of-prometheus-object>​​​的​​Secret​​​中,当用户创建的​​Prometheus​​​中关联​​ServiceMonitor​​​这类会影响配置文件内容的定义时,​​Promethues Operator​​会自动管理。

而如果​​Prometheus​​​定义中不包含任何与配置相关的定义,那么​​Secret​​​的管理权限就落到了用户自己手中。通过修改​​prometheus-inst-cc​​​的内容,从而可以让用户可以使用自定义的​​Prometheus​​​配置文件,作为示例,我们创建一个​​prometheus.yaml​​文件并添加以下内容:

复制代码
global:
  scrape_interval: 10s
  scrape_timeout: 10s
  evaluation_interval: 10s

生成文件内容的​​base64​​编码后的内容:

复制代码
$ cat prometheus.yaml | base64
Z2xvYmFsOgogIHNjcmFwZV9pbnRlcnZhbDogMTBzCiAgc2NyYXBlX3RpbWVvdXQ6IDEwcwogIGV2YWx1YXRpb25faW50ZXJ2YWw6IDEwcw==

修改名为​​prometheus-inst-cc​​​的​​Secret​​内容,如下所示:

复制代码
$ kubectl -n monitoring edit secret prometheus-inst-cc
# 省略其它内容
data:
  prometheus.yaml: "Z2xvYmFsOgogIHNjcmFwZV9pbnRlcnZhbDogMTBzCiAgc2NyYXBlX3RpbWVvdXQ6IDEwcwogIGV2YWx1YXRpb25faW50ZXJ2YWw6IDEwcw=="

通过​​port-forward​​​在本地访问新建的​​Prometheus​​实例,观察配置文件变化即可:

复制代码
kubectl -n monitoring port-forward statefulsets/prometheus-inst-cc 9091:9090

05 文末

本文主要讲解了在​​Kubernetes​​​下如何使用​​Operator​​​来有状态的运维和管理​​Prometheus​​​以及​​Alertmanager​​等组件,希望能对大家有所启发,谢谢大家的阅读。

参考文献:https://yunlzheng.gitbook.io/prometheus-book/part-iii-prometheus-shi-zhan/operator/what-is-prometheus-operator



复制代码
    ```
    

    ===========================
    【来源: 51CTO】
    【作者: 阿甘兄_】
    【原文链接】 https://blog.51cto.com/u_15294985/5291755
    声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。
    ```
标签: Prometheus
0/300
全部评论0
0/300