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/ 。
访问grafana,http://113.31.153.157:30011/ ,默认用户名密码都为admin。
访问prometheus-k8s,http://113.31.153.157:30012/ 。
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 。
访问grafana,http://prometheus.linuxsb.com 。
访问grafana,http://grafana.linuxsb.com 。
配置grafana
配置源数据
浏览器访问:http://grafana.linuxsb.com ,Configuration ----> Data Sources。
本项目grafana默认已经添加了Prometheus数据源,可以直接使用。
配置Grafana
配置dashboard,本实验使用315号模板,此Dashboard 模板来展示 Kubernetes 集群的监控信息。
查看Kubernetes监控信息。
Grafana其他配置
建议配置对应的时区。
查看Kubernetes监控
提示:本文参考: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 核心监控数据。