目录
[1.2.1Prometheus Server](#1.2.1Prometheus Server)
[1.2.2Time-Series Database(TSDB)](#1.2.2Time-Series Database(TSDB))
[1.2.3Client Library](#1.2.3Client Library)
[1.2.5Push Gateway](#1.2.5Push Gateway)
[1.2.7Prometheus Service Discovery](#1.2.7Prometheus Service Discovery)
[1.3Prometheus 数据模型](#1.3Prometheus 数据模型)
[1.3.2Metric name(指标名称)](#1.3.2Metric name(指标名称))
[1.3.6 Metric的四种类型](#1.3.6 Metric的四种类型)
一.认识Prometheus
1.1什么是Prometheus
概述 :它是一款开源的系统监控和警报工具包,Prometheus能抓取或拉取应用程序导出的时间序列数据。应用程序本身经常通过客户端函数库或导出器(导出程序,作为HTTP端点) 呈现出时间序列数据。
导出器和客户端函数库可用于多种语言、框架和开源应用程序,例如用于Apache、Nginx等Web服务器以及MySQL等数据库。Prometheus关注的是近期发生的事情,而不是跟踪数周或数月的数据。因为大多数监视查询和警报都是从最近的(通常不到一天的) 数据生成的。
Prometheus假设用户试图修复的问题是最近的,因此最有用的数据是最近的数据。Prometheus监控数据默认保留15天。
监控内容如下:
容器编排系统:集群资源,调度。kubernetes组件监控;
应用:时延、错误、查询量、内部状态等。开发时自己代码埋点;
容器:资源使用、性能特性能。cAdvisor;主机(硬件):主机资源,硬件资源使用情况,例如:CPU、mem、network、磁盘。需要在主机上安装node exporter;
网络监控:路由、交换机监控。需要安装 SNMP exporter。
1.2基础架构

1.2.1Prometheus Server
概述 :`Prometheus`服务器(server)是Prometheus架构中的核心组件,基于Go语言编写而成,无第三方依赖关系,可以独立部署在物理服务器、云主机、Docker容器内。主要用于收集每个目标的数据,并存储为时间序列数据,对外可提供数据查询支持和告警规则配置管理。Prometheus服务器可以对监控目标进行静态配置和动态配置管理,将采集到的数据按时间序列存储到本地磁盘的时序数据库中,自身对外提供PromQL语言,可以对数据进行查询和分析。
1.2.2Time-Series Database(TSDB)
概述 :Prometheus采集到的数据(如:CPU使用率,内存占用,网络I/O等)随时间不断变化,这些数据被称为时间序列数据。因此,Prometheus采用时间序列数据库TSDB来存储这些数据。默认情况下,TSDB以其高效的存储方式(块)将其所有数据存储到本地磁盘当中。随着时间的推移,TSDB会压缩旧数据以节省资源空间,并具备删除旧数据的保留策略。
TSDB 内置了一套机制来高效管理长期保存的数据。可以根据需要选择以下任意一种数据保留策略:
1.基于时间的保留:数据将被保留指定的天数;默认保留期为 15天。
2.基于大小的保留:可以设定TSDB可以容纳的最大数据量。一旦达到这个限制,Prometheus将释放空间来容纳新数据。
此外,Prometheus收集到的数据首先存储在内存中,以便于快速访问和处理。为防止数据丢失,内存中的数据会定期刷新到磁盘上。Prometheus按2小时一个block来组织数据的。最新数据首先保存在内存中(称为Head Block),当达到2小时时间窗口后,这个内存block就会被写入磁盘成为持久化的block。
1.2.3Client Library
概述:Prometheus客户端库是一组软件库,用于在应用程序代码中进行Instrumentation(埋点插桩),以便以Prometheus理解的方式公开指标。适合自行埋点或自定义Exporter。
1.2.4Exporter
概述 :Exporter是 Prometheus 监控生态中的核心组件(采集器/导出器),扮演"**数据的翻译与桥梁",负责将各类系统、服务或应用的监控数据转换为 Prometheus 可识别的格式,并通过 HTTP 接口暴露供Prometheus 抓取。
主要功能如下:
1.Exporter 会定期从其监控的目标系统中采集数据,比如 CPU 使用率、内存使用情况、网络流量等。
2.Exporter 会通过一个 HTTP 接口暴露这些数据,Prometheus 会定期抓取这些数据接口。3.Exporter 可以针对不同的应用和系统定制,Prometheus 官方提供了一些通用的 Exporter(例如:node_exporter 用于监控 Linux/Unix 系统,mysql_exporter 用于监控 MySQL 数据库)。
1.2.5Push Gateway
产生原因 :Prometheus默认采用Pull模式拉取数据 。但有时候一些数据需要将指标主动推送给Prometheus。如:在Kubernetes中运行的 cronjob 执行批处理作业,这类作业可能每天只运行几分钟以处理特定事件。在这种情况下,Prometheus 的常规 pull模式可能无法及时捕捉到服务级别的指标数据。因此需要采用push(推送)模式,而不是被动等待 Prometheus 拉取指标。为了实现指标的推送,Prometheus提供了一个名为 Pushgateway的解决方案。
概念 :Pushgateway本质上是一个中介组件,它接受来自批处理作业或其他短寿命任务的指标数据,并将这些数据保持一段时间,直到 Prometheus 主动拉取它们。具体来说,Push gateway需要作为一个独立的服务运行。批处理作业可以使用HTTP API 将指标推送到 Push gateway。随后,Pushgateway 会在 /metrics 端点上公开这些指标。Prometheus 会定期从Pushgateway中抓取这些指标,确保即使对于短暂运行的任务也能实现有效的监控。通过这种方式,Prometheus能够与临时运行的作业或服务无缝集成,确保即便是在非连续运行的服务中也能实现指标数据的收集和监控。
1.2.6Alertmanager
概念 :Alertmanager 是 Prometheus 监控系统中的一个关键组件。主要职责是根据 Prometheus 警报规则中定义的指标阈值来处理和发送警报。警报最初由 Prometheus 进程触发,并随后发送到 Alertmanager。Alertmanager 对接收到的警报执行以下操作:
Alert Deduplication(警报去重):消除重复警报,确保相同的警报不会多次发送给接收者。
Grouping(警报分组):将相关的警报归类到一组中,以便更高效地管理和通知。Silencing(静默处理):在预定的时间段内静默特定警报,例如在维护窗口期间。
Routing(路由):根据警报的严重程度和其他规则,将警报路由到适当的接收者或通知渠道。
Inhibition(抑制):当存在更高严重性的警报时,抑制较低严重性的警报,避免过多的通知干扰重要警报的传达。
Alertmanager不仅简化警报管理,还确保了关键警报能够及时、准确地送达相关人员手中,从而提高了系统的可维护性和响应效率。
1.2.7Prometheus Service Discovery
Prometheus 采用两种主要方式从监控目标中收集指标数据:
1.静态配置 :**当监控目标拥有固定的 IP 地址或 DNS 端点时,可以通过直接指定这些端点的方式来进行配置。**这种方式适用于那些不经常变化的监控目标。
2.服务发现 :在自动伸缩系统或像 Kubernetes 这样的分布式环境中,监控目标通常不具备静态的 IP 地址或 DNS 端点。在这种场景下,Prometheus 支持服务发现机制来动态识别和更新监控目标列表。通过服务发现,新的目标会被自动添加到 Prometheus 的配置中,而不再可用的目标则会被自动移除,确保监控配置始终保持最新状态。
1.3Prometheus 数据模型
Prometheus将所有数据存储为时间序列(time series)数据,每个时间序列数据都具有带时间戳的数据流,数据流都由其指标 (metric)名称和一组键值对(也称为标签(label))唯一标识,即不同的标签代表不同的时间序列。可以基于这些标签很容易地对监控数据进行聚合、过滤和整理。
1.3.1Metric
概念 :Metric即指标,指定监控目标系统测量特征,可以理解为定义了 某个监控指标类型名称 。指标是随时间将数据点链接在一起的标识符,是Prometheus的核心概念之一。
Prometheus会将指标存储在其时间序列数据库中,可以对它们进行查询操作,以了解被监控目标随时间的变化情况。指标名称可以由ASCII字母、数字、下划线和冒号组成,但应该以字母开头,后面可以跟任意数量的字母、数字和下划线。而a-zA-Z_:a-zA-Z0-9_:是有效指标的正则表达式。注意: 冒号":"是为用户定义的记录规则保留的。当有多个服务公开相同的指标时,为了对其进行区别,需要添加Label内容。一个指标由以下几个字段组成:
• 指标名称。
• 任意数量的标签,当然也可以是零个,表示为键值(key-value)数组。
• 当前指标值。
• 可选的指标标准时间戳。
1.3.2Metric name(指标名称)
概述 :该名字应该具有语义,一般用于表示metric的功能,例如:http_requests_total, 表示http请求的总数。其中,metric名字由ASCII字符,数字,下划线,以及冒号组成,且必须满足正则表达式 a-zA-Z_:*。
1.3.3label(标签)
概念 :使同一个时间序列有了不同维度的识别。例如 http_requests_total{method="Get"} 表示所有http请求中的Get请求。当method="post"时,则为新的一个metric。标签中的键由ASCII字符,数字,以及下划线组成,且必须满足正则表达式 a-zA-Z_:*。
1.3.4sample(样本)
概念 :按照某个时序以时间维度采集的数据,有序的样本形成了实际的时间序列数据列表,每个样本包括两方面内容:一个float64类型值(value)。 毫秒级精度的时间戳(timestamp)。对于没有按照顺序收集的样本,Prometheus会将其丢弃。
1.3.5notation(符号)
概述 :Prometheus时序格式和OpenTSDB类似,是用符号表示时间序列的。在指定一个指标和一个或一组标签时,时间序列通常使用格式标识:<metric name>{<label name>=<label value>, ...}
1.3.6 Metric的四种类型
1.Counter------计数器
概述 :Counter是最常用的指标类型,是一个严格的另加指标,其值从0开始只能增加,不会减少,可以理解为一个计数器,一 种累加型的指标;重启进程后,会被重置 ,例如在微服务架构中,服务实例是短暂的,在滚动更新、自动缩放等操作时,计数器就会被重置为0。该指标类型通常用于跟踪事件的数量或大小,可以用它来记录服务请求次数、任务完成数、错误发生次数。常用的场景有接口请求次数、操作重试次数和消息队列数量等。对于命名Counter类指标的最佳做法是使用_total后缀。
2.Gauge------仪表
概述 :有些数据的值可能会随着时间的推移而上下浮动 ,这时可以使用Gauge类型的指标来跟踪此类数据,Gauge类型的指标是一种常规指标,反映系统当前状态的快照,是对一个值的瞬时测量,测量值是一个瞬时的数据,其值可以任意增加或减少;重启进程后,会被重置。Gauge类指标通常可以用来记录CPU使用情况、内存使用量、磁盘 当前和已经使用的空间容量、网络使用变化、温度变化等等。
3. Histogram------直方图
概述 :Histogram即直方图,形状与柱状图相似,用于表示在一段时间范围内对数据进行采样,对指定区间以及总数进行分组统计。典型的应用有请求持续时间、响应大小等等。在Prometheus系统中的查询语言中,它有三种作用:
1.对每个采样点进行统计,对应到各个分类值中及bucket(可称 为"桶")。
2.对每个采样点值累计和(sum)。3.对采样点的次数累计和(count)。
4.Summary------摘要
概述 :本质上Summary也是用来做统计分析的,和Histogram区别在于,Summary直接存储的就是百分位数。Summary的百分位数是客户端计算好直接让Prometheus抓取的。Histogram的百分位数是通过内置函数histogram_quantile在Prometheus服务端计算出来的。
二.prometheus部署
Github项目:
GitHub - prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes · GitHubUse Prometheus to monitor Kubernetes and applications running on Kubernetes - prometheus-operator/kube-prometheus
https://github.com/prometheus-operator/kube-prometheus
概述 :kube-Prometheus 是一个全面集成的 Kubernetes 集群监控解决方案,它将核心的 Prometheus 组件、Grafana 可视化面板以及 Prometheus 规则等资源精心编排并集成为一个易于部署和管理的整体。该项目通过GitHub 仓库提供了详尽的 Kubernetes 清单文件、Grafana 仪表板配置和 Prometheus 规则,辅以详细的文档和脚本,使得在 Kubernetes 集群中利用 Prometheus 进行端到端的监控变得异常便捷高效。更进一步,kube-Prometheus 不仅引入了 Prometheus Operator 模式,还在此基础上进行了增强与拓展,因此可以将其理解为一个经过优化且充分利用 operator 机制的高级 Prometheus 部署方案。

Prometheus 联邦集群
概述 :对于大部分监控规模而言,我们只需要在每一个数据中心(例如:EC2可用区,Kubernetes集群)安装一个Prometheus Server实例,就可以在各个数据中心处理上千规模的集群。同时将 Prometheus Server 部署到不同的数据中心可以避免网络配置的复杂性。在每个数据中心部署单独的 Prometheus Server,用于采集当前数据中心监控数据。并由一个中心的 Prometheus Server 负责聚合多个数据中心的监控数据。这一特性在 Prometheus 中称为联邦集群。

版本兼容如下图:

2.1部署Prometheus
1.下载安装包
bash
git clone -b release-0.18 https://github.com/prometheus-operator/kube-prometheus.git

2.上传镜像文件,主要包含以下文件:
bash
cat image.txt

修改镜像文件名称,并上传到harbar仓库中
bash
cat 'image.txt' | awk -F/ '{system(docker tag $0 reg.westos.org/prometheus/"$NF"')}'
docker iamges | grep reg.westos.org/prometheus/ | awk '{system(docker push "$1":"$2")}'


3.修改部署文件的镜像文件地址
3.1 告警文件
bash
cd kube-prometheus/manifests
vim ./alertmanager-alertmanager.yaml

修改镜像文件地址:
bash
reg.westos.org/prometheus/alertmanager:v0.33.0

3.2黑盒暴露文件
bash
vim ./blackboxExporter-deployment.yaml

修改镜像文件地址:
bash
reg.westos.org/prometheus/blackbox-exporter:v0.28.0

bash
reg.westos.org/prometheus/configmap-reload:v0.15.0

bash
reg.westos.org/prometheus/kube-rbac-proxy:v0.22.0

3.3可视化文件
bash
vim ./grafana-deployment.yaml

修改镜像:
bash
reg.westos.org/prometheus/grafana:13.0.2

3.4修改指标文件
bash
reg.westos.org/prometheus/kube-state-metrics:v2.19.0

修改镜像地址:
bash
reg.westos.org/prometheus/kube-state-metrics:v2.19.0

bash
reg.westos.org/prometheus/kube-rbac-proxy:v0.22.0

bash
reg.westos.org/prometheus/kube-rbac-proxy:v0.22.0

3.5修改节点暴露文件
bash
vim ./nodeExporter-daemonset.yaml

修改镜像文件:
bash
reg.westos.org/prometheus/node-exporter:v1.11.1

bash
reg.westos.org/prometheus/kube-rbac-proxy:v0.22.0

3.6修改prometheus文件
bash
vim ./prometheus-prometheus.yaml

修改镜像文件地址:
bash
reg.westos.org/prometheus/prometheus:v3.12.0

3.7修改适配器文件
bash
vim ./prometheusAdapter-deployment.yaml

修改镜像文件:
bash
reg.westos.org/prometheus/prometheus-adapter:v0.12.0

3.8修改控制器文件
bash
vim ./prometheusOperator-deployment.yaml

修改镜像文件:
bash
reg.westos.org/prometheus/prometheus-operator:v0.92.0

bash
reg.westos.org/prometheus/kube-rbac-proxy:v0.22.0

4.部署Prometheus
4.1部署metrics
bash
vim yml/metrics/components.yaml
添加以下内容:
bash
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- appProtocol: https
name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: reg.westos.org/metrics-server/metrics-server:v0.9.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
- containerPort: 10250
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
volumeMounts:
- mountPath: /tmp
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
volumes:
- emptyDir: {}
name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server
namespace: kube-system
version: v1beta1
versionPriority: 100
运行 yaml文件
bash
kubectl apply -f yml/metrics/components.yaml
kubectl get apiservices.apiregistration.k8s.io | grep metrics

4.2 配置secret
bash
kubectl create secret generic etcd-ssl \
-n monitoring \
--from-file=ca.crt=/etc/kubernetes/pki/etcd/ca.crt \
--from-file=server.crt=/etc/kubernetes/pki/etcd/server.crt \
--from-file=server.key=/etc/kubernetes/pki/etcd/server.key

4.3部署Prometheus
bash
cd setup/
kubectl create -f .

2.2部署Granfan持久化
1.创建rbac
bash
kubectl create namespce nfs-client-provisioner #创建命名空间
vim rbac.yml

添加以下内容:
bash
apiVersion: v1
kind: Namespace
metadata:
name: nfs-client-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: nfs-client-provisioner
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
namespace: nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
namespace: nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: nfs-client-provisioner
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
运行rbac
bash
kubectl apply -f rbac.yml

2.创建StorageClass
bash
vim class.yml

添加以下内容:
bash
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner #使用插件动态创建Pv
parameters:
archiveOnDelete: "false"

运行yaml:
bash
kubectl apply -f class.yml
kubectl get storageclasses.storage.k8s.io nfs-client

2.创建共享目录
2.1集群所有机子都安装nfs服务
主机安装nfs
说明:将共享的目录放在这里
bash
yum install -y nfs
systemctl enable --now nfs
systemctl status nfs
k8s集群安装nfs-utils
bash
yum install -y nfs-utils
systemctl enable --now nfs-utils
systemctl status nfs-utils
2.2创建共享目录
bash
mkdir -r /mnt/nfs/k8s #创建挂载目录
chmod 777 /mnt/nfs/k8s
vim /etc/exports
添加以下内容:
bash
/mnt/nfs *(rw,sync,no_root_squash)

2.3部署pv
bash
vim deployment.yml
添加以下内容:
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
namespace: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: reg.westos.org/sig-storage/nfs-subdir-external-provisioner:v4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.7.161 #挂载点
- name: NFS_PATH
value: /mnt/nfs/k8s
volumes:
- name: nfs-client-root
nfs:
server: 192.168.7.161
path: /mnt/nfs/k8s

运行yaml文件
bash
kubectl apply -f deployment.yml
kubectl get -n nfs-client-provisioner all

3.创建pvc
bash
vim grafana-pvc.yaml

添加以下内容:
bash
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc-nfs
namespace: monitoring
spec:
accessModes:
- ReadWriteMany #供多节点读写
resources:
requests:
storage: "10Gi"
storageClassName: nfs-client #存储的StorageClass

4.修改可视化配置文件
bash
cd kube-prometheus/manifests/
vim ./grafana-deployment.yaml
修改以下内容:
bash
volumes:
#- emptyDir: {} #注释临时目录,改用pvc持久化存储
# name: grafana-storage
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana-pvc-nfs
readOnly: false

运行yaml文件
bash
kubectl apply -f grafana-deployment.yaml

2.3部署prometheus数据持久化
bash
vim prometheus-prometheus.yaml

添加以下内容:
bash
storage:
volumeClaimTemplate:
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client"
resources:
requests:
storage: 30Gi

运行yaml文件
bash
kubectl apply -f prometheus-prometheus.yaml

2.4配置数据保留策略
配置数据保留策略,数据保留七天,默认是24小时。
1.编辑yaml文件
bash
vim prometheus-prometheus.yaml
添加以下内容:
bash
retention: 7d

2.运行yaml文件
bash
kubectl apply -f prometheus-prometheus.yaml
kubectl exec -n monitoring prometheus-k8s-0 -c prometheus -- \
> wget -qO- 'http://localhost:9090/api/v1/status/runtimeinfo' 2>/dev/null

2.5暴露Grafana服务
说明:暴露外部接口,访问web页面
bash
kubectl edit svc -n monitoring grafana
修改以下内容:
bash
type: LoadBalancer

bash
kubectl get svc -n monitoring grafana

删除网络策略:
说明:他会阻止我们用外部接口访问服务
bash
kubectl -n monitoring delete networkpolicies --all -n monitoring

访问web页面
bash
192.168.7.102:3000
首次登录:

修改密码,或者跳过

修改中文设置:

查看k8s集群面板:默认会给我们一些指标监控。


2.6暴露Prometheus查询页面
bash
kubectl edit svc -n monitoring prometheus-k8s
kubectl get svc -n monitoring prometheus-k8s

访问web页面
bash
192.168.7.103:9090

2.6统一使用Ingress暴露Service
使用外部域名访问各个web页面
1.编写yaml文件
bash
vim prometheus-Ingress.yml #部署Ingress,统一暴露服务
添加以下内容:
bash
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-ingress
spec:
ingressClassName: nginx
rules:
- host: prometheus.example.com
http:
paths:
- backend:
service:
name: prometheus-k8s
port:
number: 9090
path: /
pathType: ImplementationSpecific
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: nginx
rules:
- host: grafana.example.com
http:
paths:
- backend:
service:
name: grafana
port:
number: 3000
path: /
pathType: ImplementationSpecific
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alertmanager-ingress
spec:
ingressClassName: nginx
rules:
- host: alertmanager.example.com
http:
paths:
- backend:
service:
name: alertmanager-main
port:
number: 9093
path: /
pathType: ImplementationSpecific
2.运行yaml文件
bash
kubectl apply -f prometheus-Ingress.yml -n monitoring
kubectl get ingress -n monitoring

3.配置hosts文件
windows中进入
bash
C:\Windows\System32\drivers\etc
编辑hosts文件

添加域名解析
bash
192.168.7.101 grafana.example.com prometheus.example.com alertmanager.example.com

访问Grafana
bash
grafana.example.com

访问Prometheus查询页面
bash
prometheus.example.com

访问告警页面
bash
alertmanager.example.com
