054.Kubernetes Prometheus监控解决方案

Prometheus简介

参考《002.Prometheus简介概述》

kube-prometheus简介

kube-prometheus项目收集了 Kubernetes manifests、Grafana仪表板和Prometheus 规则等整套清单,以使用 Prometheus Operator通过Prometheus提供易于操作的端到端 Kubernetes 集群监控。

该项目主要清单模块有:
Operator:Operator 资源会根据自定义资源(Custom Resource Definition / CRDs)来部署和管理 Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。

Prometheus: Prometheus 资源是声明性地描述 Prometheus 部署的期望状态。

Prometheus Server: Operator 根据自定义资源 Prometheus 类型中定义的内容而部署的 Prometheus Server 集群,这些自定义资源可以看作是用来管理 Prometheus Server 集群的 StatefulSets 资源。

ServiceMonitor: ServiceMonitor 也是一个自定义资源,它描述了一组被 Prometheus 监控的 targets 列表。该资源通过 Labels 来选取对应的 Service Endpoint,让 Prometheus Server 通过选取的 Service 来获取 Metrics 信息。

Service: Service 资源主要用来对应 Kubernetes 集群中的 Metrics Server Pod,来提供给 ServiceMonitor 选取让 Prometheus Server 来获取信息。简单的说就是 Prometheus 监控的对象,例如 Node Exporter Service、Mysql Exporter Service 等等。

Alertmanager: Alertmanager 也是一个自定义资源类型,由 Operator 根据资源描述内容来部署 Alertmanager 集群。

前置准备

  • 完备的Kubernetes集群
  • kubelet开启authentication.webhook.enabled为true和–authorization-mode=Webhook标志。

kube-Prometheus部署

获取资源

[root@master01 ~]# git clone https://github.com/prometheus-operator/kube-prometheus.git

[root@master01 ~]# wget http://down.linuxsb.com/mydeploy/kube-prometheus/release-0.8/proloadimages.sh       #提前通过脚本下载镜像
[root@master01 ~]# bash proloadimages.sh

创建prometheus持久卷

prometheus 默认是通过 emptyDir 进行挂载的,emptyDir 挂载的数据的生命周期和 Pod 生命周期一致的,为了实现数据持久化,本方案建议提前生成持久卷。

prometheus是一种 StatefulSet 有状态集的部署模式,可直接将 StorageClass 配置到如下yaml 中。

本环境已创建动态存储longhorn,longhorn部署参考《附034.Kubernetes_v1.21.0高可用部署架构二》。

[root@master01 ~]# kubectl get sc
NAME       PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
longhorn   driver.longhorn.io   Delete          Immediate           true                   12d

[root@master01 ~]# cd kube-prometheus/manifests/
[root@master01 manifests]# vim prometheus-prometheus.yaml                   #追加如下持久化配置
……
  storage: 
    volumeClaimTemplate:
      spec:
        storageClassName: longhorn
        resources:
          requests:
            storage: 1Gi

创建grafana持久卷

Grafana 是部署模式为 Deployment,所以我们提前为其创建一个 grafana-pvc.yaml 文件,加入下面 PVC 配置。

[root@master01 manifests]# vim grafana-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-storage
  namespace: monitoring
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 1Gi

[root@master01 manifests]# vim grafana-deployment.yaml
……
        volumeMounts:
        - mountPath: /var/lib/grafana
          name: grafana-storage
          readOnly: false
……
      serviceAccountName: grafana
      volumes:
      - name: grafana-storage
        persistentVolumeClaim:
          claimName: grafana-storage
……

修改暴露服务端口

需要修改的是alertmanager-main,grafana,prometheus-k8s。

[root@master01 manifests]# vim alertmanager-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    alertmanager: main
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 0.21.0
  name: alertmanager-main
  namespace: monitoring
spec:
  type: NodePort                                        #SVC暴露模式设为NodePort
  ports:
  - name: web 
    port: 9093
    targetPort: web
    nodePort: 30010                                     #指定nodePort
  selector:
    alertmanager: main
    app: alertmanager
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: ClientIP
  
[root@master01 manifests]# vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 7.5.4
  name: grafana
  namespace: monitoring
spec:
  type: NodePort                                        #SVC暴露模式设为NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 30011                                     #指定nodePort
  selector:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    
[root@master01 manifests]# vim prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 2.26.0
    prometheus: k8s 
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort                                        #SVC暴露模式设为NodePort
  ports:
  - name: web 
    port: 9090
    targetPort: web 
    nodePort: 30012                                     #指定nodePort
  selector:
    app: prometheus
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    prometheus: k8s 
  sessionAffinity: ClientIP

部署operator

[root@master01 manifests]# kubectl apply -f setup/

[root@master01 manifests]# kubectl -n monitoring get pods
NAME                                   READY   STATUS    RESTARTS   AGE
prometheus-operator-7d7659656f-94xs4   2/2     Running   0          41s

提示:如上操作会创建monitoring 的命名空间,以及相关的 Prometheus Operator 控制器。

创建 Operator 后,可以创建自定义资源清单(CRD),若需要自定义资源对象生效就需要安装对应的 Operator 控制器,因此如上创建operator需要在创建CRD之前。

部署CRD资源

[root@master01 manifests]# kubectl apply -f .

确认验证

[root@master01 manifests]# kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
alertmanager-main       NodePort    10.20.37.168    <none>        9093:30010/TCP               45s
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP   45s
blackbox-exporter       ClusterIP   10.20.232.123   <none>        9115/TCP,19115/TCP           45s
grafana                 NodePort    10.20.163.236   <none>        3000:30011/TCP               44s
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP            44s
node-exporter           ClusterIP   None            <none>        9100/TCP                     44s
prometheus-adapter      ClusterIP   10.20.60.179    <none>        443/TCP                      43s
prometheus-k8s          NodePort    10.20.151.94    <none>        9090:30012/TCP               42s
prometheus-operated     ClusterIP   None            <none>        9090/TCP                     43s
prometheus-operator     ClusterIP   None            <none>        8443/TCP                     5d5h

访问alertmanager-main,http://113.31.153.157:30010/ 。
001

访问grafana,http://113.31.153.157:30011/ ,默认用户名密码都为admin。
003

访问prometheus-k8s,http://113.31.153.157:30012/ 。
002

ingress服务暴露

创建alertmanager-main ingress策略

[root@master01 manifests]# vim alertmanager-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alertmanager-ingress
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: "nginx"
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: alertmanager
spec:
  rules:
  - host: alertmanager.linuxsb.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: alertmanager-main
            port:
              number: 9093

[root@master01 manifests]# kubectl apply -f alertmanager-ingress.yaml

创建prometheus ingress策略

[root@master01 manifests]# vim prometheus-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-ingress
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: "nginx"
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: prometheus
spec:
  rules:
  - host: prometheus.linuxsb.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: prometheus-k8s
            port:
              number: 9090

[root@master01 manifests]# kubectl apply -f prometheus-ingress.yaml

创建grafana ingress策略

[root@master01 manifests]# vim grafana-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana-ingress
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: "nginx"
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: grafana
spec:
  rules:
  - host: grafana.linuxsb.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: grafana
            port:
              number: 3000

[root@master01 manifests]# kubectl apply -f grafana-ingress.yaml

确认验证

访问grafana,http://alertmanager.linuxsb.com 。
004

访问grafana,http://prometheus.linuxsb.com 。
005

访问grafana,http://grafana.linuxsb.com 。
006

配置grafana

配置源数据

浏览器访问:http://grafana.linuxsb.com ,Configuration ----> Data Sources。
007
本项目grafana默认已经添加了Prometheus数据源,可以直接使用。

配置Grafana

配置dashboard,本实验使用315号模板,此Dashboard 模板来展示 Kubernetes 集群的监控信息。
008

009
查看Kubernetes监控信息。

Grafana其他配置

建议配置对应的时区。
010

查看Kubernetes监控

011

提示:本文参考:https://blog.csdn.net/zuozewei/article/details/108358460

Prometheus相关指标

结合 Prometheus 可以通过 Metrics 数据源实现针对Kubernetes的各种监控,主要有:

  • 宿主机(worker):对于 worker 节点的监控数据,需要借助 Node Exporter 。一般来说,Node Exporter 会以 DaemonSet 的方式运行在宿主机上。
    Exporter,就是代替被监控对象来对 Prometheus 暴露出可以被“抓取”的 Metrics 信息的一个辅助进程。而 Node Exporter 可以暴露给 Prometheus 采集的 Metrics 数据,Metrics 指标非常丰富,包括但不限于节点的负载(Load)、CPU 、内存、磁盘以及网络这样的常规信息。

  • Kubernetes API:主要包括 kubernetes 的 API Server、kubelet 等组件的 /metrics API。
    除了常规的 CPU、内存的信息外,这部分信息还主要包括了各个组件的核心监控指标。比如,对于 API Server 来说,它就会在 /metrics API 里,暴露出各个 Controller 的工作队列(Work Queue)的长度、请求的 QPS 和延迟数据等等。此类指标,是检查 Kubernetes 本身工作情况的主要依据。

  • Kubernetes 业务:这部分数据,一般叫作 Kubernetes 核心监控数据(core metrics)。这其中包括了 Pod、Node、容器、Service 等主要 Kubernetes 核心概念的 Metrics。其中,容器相关的 Metrics 主要来自于 kubelet 内置的 cAdvisor 服务。在 kubelet 启动后,cAdvisor 服务也随之启动,而它能够提供的信息,可以细化到每一个容器的 CPU 、文件系统、内存、网络等资源的使用情况。需要注意的是,这里提到的是 Kubernetes 核心监控数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木二_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值