背景

随着云原生概念盛行,对于容器、服务、节点以及集群的监控变得越来越重要。Prometheus作为Kubernetes监控的事实标准,有着强大的功能和良好的生态。但是它不支持分布式,不支持数据导入、导出,不支持通过API修改监控目标和报警规则,所以在使用它时,通常需要写脚本和代码来简化操作。

operator 介绍

Operator是由CoreOS公司开发的用来扩展Kubernetes API的特定应用程序控制器,用来创建、配置和管理复杂的有状态应用,例如数据库、缓存和监控系统。Operator基于kubernetes的资源和控制器概念上构建,但同时又包含了应用程序特定的领域知识。创建Operator的关键是CRD(自定义资源)的设计。
Operator是将运维人员对软件操作的知识代码化,同时利用Kubernetes强大的抽象来管理大规模的软件应用。目前CoreOS官方提供了几种Operator的实现,其中就包括了Prometheus Operator。
Operator的核心实现是基于Kubernetes的以下两个概念:
● 资源:对象的状态定义
● 控制器:观测、分析和行动,以调节资源的分布

当前CoreOS提供了四种Operator:

● etcd:创建etcd集群
● Rook:云原生环境下的文件、块、对象存储服务
● Prometheus:创建Prometheus监控实例
● Tectonic:部署Kubernetes集群

Prometheus Operator介绍

Prometheus Operator为监控Kubernetes Service、Deployment和Prometheus实例的管理提供了简单的定义,简化在Kubernetes上部署、管理和运行Prometheus和Alertmanager集群。

Prometheus Operator作为一个控制器,他会去创建Prometheus、PodMonitor、ServiceMonitor、AlertManager以及PrometheusRule这5个CRD资源对象,然后会一直监控并维持这5个资源对象的状态。
● Prometheus资源对象是作为Prometheus Service存在的
● ServiceMonitor和PodMonitor资源对象是专门的提供metrics数据接口的exporter的抽象,Prometheus就是通过PodMonitor和ServiceMonitor提供的metrics数据接口去pull数据的
● AlertManager资源对象对应的是alertmanager组件
● PrometheusRule资源对象是被Prometheus实例使用的告警规则文件

Prometheus Operator架构图

架构图

上面各组件以不同的方式运行在Kubernetes集群中
● Operator:根据自定义资源(Custom Resource Definition,CRD)来部署和管理Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。
● Prometheus:Prometheus资源是声明性地描述Prometheus部署的期望状态。
● Prometheus Server:Operator根据自定义资源Prometheus类型中定义的内容而部署的Prometheus Server集群,这些自定义资源可以看作用来管理Prometheus Server 集群的StatefulSets资源。
● ServiceMonitor:声明指定监控的服务,描述了一组被Prometheus监控的目标列表。该资源通过标签来选取对应的Service Endpoint,让Prometheus Server通过选取的Service来获取Metrics信息。
● Service:简单的说就是Prometheus监控的对象。提供给ServiceMonitor选取,让Prometheus Server来获取信息。
● Alertmanager:Alertmanager也是一个自定义资源类型,由Operator根据资源描述内容来部署Alertmanager集群。

Prometheus-官网

通过operator 部署Prometheus

● k8s版本1.23 部署对应的0.11版本
版本

克隆项目到本地
[root@k8s-master ~]# git clone -b release-0.11 https://github.com/prometheus-operator/kube-prometheus.git
 
过滤需要的镜像
[root@k8s-master ~]# cd kube-prometheus/manifests
[root@master manifests]# grep image: ./* -R
./alertmanager-alertmanager.yaml:  image: quay.io/prometheus/alertmanager:v0.24.0
./blackboxExporter-deployment.yaml:        image: quay.io/prometheus/blackbox-exporter:v0.21.0
./blackboxExporter-deployment.yaml:        image: jimmidyson/configmap-reload:v0.5.0
./blackboxExporter-deployment.yaml:        image: quay.io/brancz/kube-rbac-proxy:v0.12.0
....

有一个镜像地址下载不到需要修改对应的yaml文件
[root@master manifests]# cat kubeStateMetrics-deployment.yaml |grep -A2 image
        image: bitnami/kube-state-metrics:2.5.0
        name: kube-state-metrics
        resources:
[root@master manifests]# cat prometheusAdapter-deployment.yaml |grep image
        image: k8s.dockerproxy.com/prometheus-adapter/prometheus-adapter:v0.9.1

移动networkPolicy
[root@master manifests]# mkdir networkPolicy.bak
[root@master manifests]# mv *networkPolicy*.yaml networkPolicy.bak/

修改service文件 暴露grafana nodeport alertmanager
[root@master manifests]# cat grafana-service.yaml |grep -A5 type
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 30300

暴露Prometheus nodeport
[root@master manifests]# cat prometheus-service.yaml |grep -A10 type
  type: NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
    nodePort: 30900
  - name: reloader-web
    port: 8080
    targetPort: reloader-web
    nodePort: 30800

暴露alertmanager nodeport #随机端口
[root@master manifests]# cat alertmanager-service.yaml  |grep -A10 type
  type: NodePort	
  ports:
  - name: web
    port: 9093
    targetPort: web
  - name: reloader-web
    port: 8080
    targetPort: reloader-web

开始部署 先创建资源
[root@master manifests]# kubectl apply --server-side -f setup/

创建服务
[root@master kube-prometheus]# kubectl apply -f manifests/

# 卸载
# kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

查看Pod状态
[root@master ~]# kubectl get po,svc -n monitoring  
NAME                                      READY   STATUS    RESTARTS   AGE
pod/alertmanager-main-0                   2/2     Running   0          13m
pod/alertmanager-main-1                   2/2     Running   0          13m
pod/alertmanager-main-2                   2/2     Running   0          13m
pod/blackbox-exporter-746c64fd88-jlsd8    3/3     Running   0          13m
pod/grafana-5fc7f9f55d-v6c9r              1/1     Running   0          13m
pod/kube-state-metrics-6d7746678c-r5bmr   3/3     Running   0          13m
pod/node-exporter-5dvn2                   2/2     Running   0          13m
pod/node-exporter-d2dmt                   2/2     Running   0          13m
pod/node-exporter-lb5hh                   2/2     Running   0          13m
pod/node-exporter-skk8w                   2/2     Running   0          13m
pod/prometheus-adapter-56b89c8746-2lnq6   1/1     Running   0          6m46s
pod/prometheus-adapter-56b89c8746-s26lf   1/1     Running   0          6m45s
pod/prometheus-k8s-0                      2/2     Running   0          13m
pod/prometheus-k8s-1                      2/2     Running   0          13m
pod/prometheus-operator-f59c8b954-565tg   2/2     Running   0          13m

NAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                         AGE
service/alertmanager-main       NodePort    10.1.102.4     <none>        9093:30568/TCP,8080:30076/TCP   3h16mservice/alertmanager-operated   ClusterIP   None           <none>        9093/TCP,9094/TCP,9094/UDP      13m
service/blackbox-exporter       ClusterIP   10.1.61.138    <none>        9115/TCP,19115/TCP              14m
service/grafana                 NodePort    10.1.232.154   <none>        3000:30300/TCP                  14m
service/kube-state-metrics      ClusterIP   None           <none>        8443/TCP,9443/TCP               13m
service/node-exporter           ClusterIP   None           <none>        9100/TCP                        13m
service/prometheus-adapter      ClusterIP   10.1.177.70    <none>        443/TCP                         13m
service/prometheus-k8s          NodePort    10.1.102.134   <none>        9090:30900/TCP,8080:30800/TCP   13m
service/prometheus-operated     ClusterIP   None           <none>        9090/TCP                        13m
service/prometheus-operator     ClusterIP   None           <none>        8443/TCP												 13m

访问Prometheus、grafana dashboard
[root@master ~]# hostname -i
192.168.170.10

grafana
http://192.168.170.10:30300/
账号:admin
密码:admin

Prometheus
http://192.168.170.10:30900/

修改 grafana自带dashboard的默认时区
[root@master manifests]# grep -i timezone grafana-dashboardDefinitions.yaml
          "timezone": "utc",
          "timezone": "UTC",
          "timezone": "UTC",
。。。。

调整时区
[root@master manifests]# sed -i 's/UTC/UTC+8/g'  grafana-dashboardDefinitions.yaml
[root@master manifests]# sed -i 's/utc/utc+8/g'  grafana-dashboardDefinitions.yaml
[root@master manifests]# kubectl apply -f grafana-dashboardDefinitions.yaml	

后续如果从官方的面板导入 时间都是 UTC 需要修改对应时区 timezone:UTC+8
"timezone": "UTC+8"
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐