安装部署kube-prometheus
参考:https://blog.csdn.net/qq850482461/article/details/118759875
prometheus-operator用于监控kubernetes集群
1、准备工作
1.1、下载prometheus-operator文件包
https://github.com/prometheus-operator/kube-prometheus/archive/main.zip
下载完成后解压kube-prometheus-main.zip
# 解压
unzip kube-prometheus-main.zip
# 进入到manifests
cd kube-prometheus-main && cd manifests
1.2、准备工作–替换国内镜像源
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' setup/prometheus-operator-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-prometheus.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' alertmanager-alertmanager.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' kube-state-metrics-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' node-exporter-daemonset.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-adapter-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' blackbox-exporter-deployment.yaml
sed -i 's#k8s.gcr.io/kube-state-metrics/kube-state-metrics#bitnami/kube-state-metrics#g' kube-state-metrics-deployment.yaml
new change
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheusOperator-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-prometheus.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' alertmanager-alertmanager.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' kubeStateMetrics-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' nodeExporter-daemonset.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheusAdapter-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' blackboxExporter-deployment.yaml
其中两个镜像需要手动下载下
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2
registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.11.2
[root@master manifests]# grep -ir "image:"
blackboxExporter-deployment.yaml: image: quay.io/prometheus/blackbox-exporter:v0.24.0
blackboxExporter-deployment.yaml: image: jimmidyson/configmap-reload:v0.5.0
blackboxExporter-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.15.0
kubeStateMetrics-deployment.yaml: image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2
kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.15.0
kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.15.0
prometheusOperator-deployment.yaml: image: quay.io/prometheus-operator/prometheus-operator:v0.69.1
prometheusOperator-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.15.0
alertmanager-alertmanager.yaml: image: quay.mirrors.ustc.edu.cn/prometheus/alertmanager:v0.26.0
grafana-deployment.yaml: image: grafana/grafana:10.2.0
setup/0alertmanagerCustomResourceDefinition.yaml: baseImage:
setup/0alertmanagerCustomResourceDefinition.yaml: image:
setup/0alertmanagerCustomResourceDefinition.yaml: image:
setup/0alertmanagerCustomResourceDefinition.yaml: image:
setup/0alertmanagerCustomResourceDefinition.yaml: image:
setup/0prometheusagentCustomResourceDefinition.yaml: image:
setup/0prometheusagentCustomResourceDefinition.yaml: image:
setup/0prometheusagentCustomResourceDefinition.yaml: image:
setup/0prometheusagentCustomResourceDefinition.yaml: image:
setup/0thanosrulerCustomResourceDefinition.yaml: image:
setup/0thanosrulerCustomResourceDefinition.yaml: image:
setup/0thanosrulerCustomResourceDefinition.yaml: image:
setup/0thanosrulerCustomResourceDefinition.yaml: image:
setup/0prometheusCustomResourceDefinition.yaml: baseImage:
setup/0prometheusCustomResourceDefinition.yaml: image:
setup/0prometheusCustomResourceDefinition.yaml: image:
setup/0prometheusCustomResourceDefinition.yaml: image:
setup/0prometheusCustomResourceDefinition.yaml: baseImage:
setup/0prometheusCustomResourceDefinition.yaml: image:
setup/0prometheusCustomResourceDefinition.yaml: image:
prometheus-prometheus.yaml: image: quay.mirrors.ustc.edu.cn/prometheus/prometheus:v2.47.2
nodeExporter-daemonset.yaml: image: quay.io/prometheus/node-exporter:v1.7.0
nodeExporter-daemonset.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.15.0
prometheusAdapter-deployment.yaml: image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.11.2
1.4、修改yaml配置文件
修改prometheus,alertmanager,grafana的Service类型为NodePort类型prometheus和grafana的持久化,默认持久化方式为emptyDir,最好修改为pvc
本文不做持久化
- 修改prometheus-service.yaml
新增type: NodePort
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.47.2
name: prometheus-k8s
namespace: monitoring
spec:
type: NodePort # 新增type: NodePort
ports:
- name: web
port: 9090
targetPort: web
- name: reloader-web
port: 8080
targetPort: reloader-web
selector:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
sessionAffinity: ClientIP
- 修改alertmanager-service.yaml
新增type: NodePort
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: alert-router
app.kubernetes.io/instance: main
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 0.26.0
name: alertmanager-main
namespace: monitoring
spec:
type: NodePort # 新增type: NodePort
ports:
- name: web
port: 9093
targetPort: web
- name: reloader-web
port: 8080
targetPort: reloader-web
selector:
app.kubernetes.io/component: alert-router
app.kubernetes.io/instance: main
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
sessionAffinity: ClientIP
- 修改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: 10.2.0
name: grafana
namespace: monitoring
spec:
type: NodePort # 新增type: NodePort
ports:
- name: http
port: 3000
targetPort: http
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
2、安装
2.1、安装
安装prometheus-operator
kubectl apply -f setup/
安装prometheus, alertmanager, grafana, kube-state-metrics, node-exporter等资源
kubectl apply -f .
各个节点导入如下两个镜像tar包,导入后名称如下
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2
registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.11.2
2.2、查状态
kubectl get pods -n monitoring
2.3、访问grafana web页面
grafana默认账密 admin/admin
[root@master ~]# kubectl get svc -n monitoring |grep -i Nodeport
alertmanager-main NodePort 10.101.182.196 <none> 9093:31456/TCP,8080:30896/TCP 22h
grafana NodePort 10.108.244.152 <none> 3000:32761/TCP 22h
prometheus-k8s NodePort 10.100.26.16 <none> 9090:32649/TCP,8080:30669/TCP 22h
2.4、卸载kube-prometheus
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
3、添加自定义报警规则
3.1、查看系统当前已有规则
可以通过prometheusd的Alerts查看当前的报警规则
告警规则查看 Status-configuration
node节点上的告警规则配置文件如下
在容器中prometheus的告警规则文件在
/etc/prometheus/rules/prometheus-k8s-rulefiles-0/
3.2、添加自定义规则
参考第三方告警规则
https://awesome-prometheus-alerts.grep.to/
添加自定义规则
路径:kube-prometheus-main/manifests/rules # rules 为新建目录
新增:my-alertmanger.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: k8s
role: alert-rules
name: my-rules
namespace: monitoring
spec:
groups:
- name: my-rules
rules:
- alert: KubernetesPodNotHealthy
expr: min_over_time(sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[5m:1m]) > 0
for: 0m
labels:
severity: critical
annotations:
summary: Kubernetes Pod not healthy (instance {{ $labels.instance }})
description: "Pod已处于非就绪状态超过 5 minutes.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
EOF
# 创建我们自定义的规则
kubectl apply -f my-alertmanger.yaml
执行自定义规则
[root@master rules]# kubectl apply -f my-alertmanger.yaml
prometheus控制台查看
4、简单介绍
理论参考链接:https://www.cnblogs.com/zqj-blog/p/10871033.html
prometheus根据配置 定时 去拉取各个节点的数据,默认使用的拉取方式是pull,也可以使用pushgateway提供的push方式获取各个监控节点的数据。将获取到的数据存入到TSDB,TSDB是一款时序数据库。
prometheus的监控数据可以使用内置的PromQL进行查询,告警管理和发送报警内容由Alertmanager组机负责。
4.1、监控的目的
google指出,监控分为白盒监控和黑盒监控
- 白盒监控:通过监控内部的运行状态及指标判断可能会发生的问题,从而做出预判或对其进行优化。
- 黑盒监控:监控系统或者服务,在发生异常时做出相应测试。
监控的目的如下:
- 根据历史监控数据,对未来做出预判
- 发生异常时,及时报警,或做出相应措施
- 根据监控报警及时定位问题根源
- 通过可视化图表展示,便于直观获取信息
4.2、常用概念
prometheus采集到的监控数据均以 metric(指标) 形式保存在时序数据库中(TSDB)
每一条时间序列由 metric 和 labels 组成,每条时间序列按照时间的先后顺序存储它的样本值。
默认情况下各监控client向外暴露一个HTTP服务,prometheus会通过pull方式获取client的数据,数据格式如下:
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125
- node_cpu表示监控指标的名称
- {} 内的内容是标签,以键值对的方式记录
- 362812.7890625 数字是这个指标监控的value值数据
下图中
- 横坐标代表时间,时间戳的方式记录在TSDB中
- 纵坐标代表不同的指标名称,如cpu, memory,disk,每个黑点代表一个指标。
- 每个黑点就是采集到的样本(prometheus将样本以时间序列的方式保存在内存中,然后定时保存到硬盘上)
4.3、指标(metric)概念
指标格式分为两个部分,一个是指标名称,一个是指标标签。
格式如下
<metric name>{<label name>=<label value>, ...}
指标名称反映的是监控了什么,标签反映的是样本的维度,可以理解成指标的细化,比如:
api_http_requests_total{method="POST", handler="/messages"}
# 或者如下格式
{__name__="api_http_requests_total",method="POST", handler="/messages"}
指标是“api_http_requests_total”,含义是通过api请求的http总数
标签“method=“POST”” “handler=”/messages""代表了这些http请求中 POST 请求 并且 handler是/messages的数量
4.4、指标有四种类型
- Counter 只增不减,计数统计。例如机器启动时间、http访问总量
- Gauge 可增可减、仪表盘。用于主机的 cpu、内存、磁盘使用率,数据是一个瞬间值
- Histogram 直方图。主要统计和分析样本的分布情况,服务端分位,不同区间内样本的个数
- Summary 摘要图。主要统计和分析样本的分布情况,客户端分位。
5、PromQL基本操作命令语法
类似于MySql自己的sql语句一样,Prometheus也有自己的查询语法
进入prometheus页面,查询出来的结果有两种
- 瞬时向量:包含该时间序列中最新的一个样本值
- 区间向量:查询一段时间范围内的数据
5.1、瞬时向量展示
比如查询 指标名称为:prometheus_http_requests_total
5.2、区间向量展示
点击 Excute 之后、选择Element 中的一条 全部复制下来、输入到 enable query history(搜索框) 里面、 内容后面加上**[5m]**,表示查询 5 分钟时间内的数据
如上图、value 部分转换成了时间戳的样式了。这就是区间向量
5.3、offset查询语法
offset:查询多少时间之前的数据
例如:下面查询一个30分钟之前5分钟内的 区间向量
prometheus_http_requests_total{code="200", container="prometheus", endpoint="web", handler="/-/healthy", instance="10.244.1.183:9090", job="prometheus-k8s", namespace="monitoring", pod="prometheus-k8s-1", service="prometheus-k8s"}[5m]offset 30m
查询 1 天前的区间向量:[1m] offset 1d
rometheus_http_requests_total{code="200", *** }[1m]offset 1d
查询 1 天前的瞬间向量:offset 1d
rometheus_http_requests_total{code="200", *** } offset 1d
查询1小时之前的瞬时向量:offset 1h
rometheus_http_requests_total{code="200", *** } offset 1h
5.4、Labelsets查询用法
对标签进行匹配
:::success
- = 绝对匹配
- =~ 正则模糊匹配,包含某个字段
- !~ 正则模糊匹配,不包含某个字段
- != 绝对匹配,不包含某个字段
:::
例如:匹配不包含字段** {endpoint!~“https-metrics”}**
kubelet_http_requests_total{endpoint!~"https-metrics"}
5.5、数学运算
对查询结果进行运算
:::success
- +(加法)
- -(减法)
- *(乘法)
- /(除法)
- %(求余)
- ^(幂运算,平方)
:::
举例:查看服务器物理可用内存、默认是以字节 Byte 的方式显示、咱们将其转换成 M 的方式显示。
node_memory_MemAvailable_bytes/1024/1024
Byte/1024=KB
KB/1024=M
查询可用内存小于等于2000M的服务器
node_memory_MemTotal_bytes/1024/1024<=3000
5.6、集合运算
对结果进行运算
集合运算符【按照它们的执行优先级顺序排列写出来】:
:::success
- ^ (平方)
-
- / %
-
-
- == , != , <= , < , >= , >
- and(并且) unless(排除) or (或者)
:::
举例,找出节点内存可用大于等于2000M,小于2140M的节点
node_memory_MemAvailable_bytes/1024/1024>=2000 and
node_memory_MemAvailable_bytes/1024/1024 <=2140
unles : 排除
举例:查找出内存小于等于 3000M 并排除内存小于 2000M 的数据。
各节点可用内存如下:
操作符顺序如下
node_memory_MemAvailable_bytes/1024/1024<=3000 unless
node_memory_MemAvailable_bytes/1024/1024 <= 2000
5.7、聚合运算
:::success
-
sum(求和)
-
min(最小值)
-
max(最大值)
-
avg(平均值)
-
stddev(标准差)
-
stdvar(标准差异)
-
count(计数,符合条件的数量值)
-
count_values(对value进行计数)
-
bottomk(后n条)
-
topk(前n条)
-
quantile(分布统计)
::: -
sum
统计所有节点服务器可用内存之后,以M为单位统计
标签名称:node_memory_MemAvailable_bytes
sum(node_memory_MemAvailable_bytes/1024/1024)
- sum根据某个字段进行统计,使用** by()**
sum(kubelet_http_requests_total)by(path)
sum对指标的所有标签值 计算和
对某个字段进行统计
sum(kubelet_http_requests_total)by(path)
- min: 最小值
- max: 最大值
- avg: 平均值
例如:
min(kubelet_http_requests_total)
max(kubelet_http_requests_total)
avg(kubelet_http_requests_total)
- count: 计数,统计符合条件的数量值/个数
- count_values: 对values值进行计数
# 统计符合条件的个数
count(kubelet_http_requests_total)
# 对values值进行计数,会有多条count,因为标签有不同的值
count_values("count",kubelet_http_requests_total)
count (node_memory_MemTotal_bytes)
count_values ("count", node_memory_MemTotal_bytes /1024^2)
- topk和sum连用 取前N条时序
先统计出path标签的sum值
sum(kubelet_http_requests_total)by(path)
sum(kubelet_http_requests_total)by(path)
统计前2条时序数据
topk(2,sum(kubelet_http_requests_total)by(path))
- **bottonk **和 **sum **连用 取后 **3 **条时序
bottomk(3,sum(kubelet_http_requests_total)by(path))
- quantile 取当前数据的中位数,取值为 0 到 1 之间
quantile比较难理解,不做过多笔录
用法如下:
quantile(0.5,kubelet_http_requests_total)
5.8、 PromQL 常用函数
参考:https://cloud.tencent.com/developer/article/2212981?areaSource=102001.2&traceId=ftU6KXifeVRuR2s7gE8Ce
:::success
- increase 函数
- rate 函数
- irate 函数
- predict_linear 函数
- absent 函数
- ceil和floor函数去除查询结果中value值小数点操作
- delta差值
- 排序函数
- label_join 和label_replce 函数
:::
1)increase函数
内置函数,用于计算时间序列在一段时间内的增量,即增加的增量
实例:通过increase内置函数查询每秒内的数据增长率如下:
increase(kubelet_http_requests_total[5m])
# 语法如下
increase(指标{标签}[时间])/3600
increase(kubelet_http_requests_total{....}[1h])/3600
increase(
kubelet_http_requests_total{endpoint="https-metrics", instance="192.168.10.16:10250", job="kubelet", long_running="false", method="GET", metrics_path="/metrics", namespace="kube-system", node="master", path="metrics", server_type="readwrite", service="kubelet"}
[1h])/3600
2)rate函数
rate函数用于计算时间序列在一定时间范围内的平均速率
rate返回一个瞬时速率,表示在指定的时间窗口内的平均速率
实例:查询计算**http_requests_total **时间序列在过去5分钟内的平均速率。
rate(kubelet_http_requests_total[5m])
3)irate函数
irate 是 PromQL 中用于计算时间序列的瞬时速率的函数。与 rate 函数不同,irate 不需要指定一个时间范围,而是基于最近两个数据点之间的时间间隔来计算速率。
简单讲,是瞬时增长率,取最后两个值进行计算。不适合做长期数据分析
实例如下:
irate(prometheus_http_requests_total[5m])
4) predict_linear 函数
predict_linear 预测统计函数:顾名思义预测未来某个时间段内的结果。
实例:根据最近5个小时的数据分析结果来预测未来6个小时的数据情况
node_memory_AnonPages_bytes
predict_linear(node_memory_AnonPages_bytes[5h],6*3600)
5)absent 函数
absent:用来判断数据是否正常采集。
如果样本数据不为空,则返回 no data。如果为空则返回1。
node_memory_MemFree_bytes{instance="master"}
absent(node_memory_MemFree_bytes{instance="master"})
6)ceil 与 floor 函数
四舍五入取整数,去除查询结果中的小数点
- **ceil():**向上取最接近的整数。如: 3.86–>4
- **floor():**向下取。如:3.86–>3
7)delta差值
举例:比较一下现在的数据和 8 小时之前的数据差异
delta (node_memory_MemFree_bytes [8h])
8)排序函数
- sort():正向排序,由小到大
- sort_desc():倒向排序
sort(node_memory_MemFree_bytes)
sort_desc(node_memory_MemFree_bytes)
9) 动态标签:label_join 和 label_replace 函数
- label_join:将数据中的一个或多个 label 的值赋予一个新的 label。
- **label_replace: **表示通过正则表达式为时间序列添加额外的标签
label_join用法如下
将多个标签通过指定分隔符连接起来,写入指定的新标签中
语法: label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, …)
示例: 将up指标的 job 和 instance 标签通过 “-” 分隔符连接
label_join(up, "combined", "-", "job", "instance")
label_replace用法如下:
语法:label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
不会删除指定指标,依次对v中的每一条时间序列进行处理,通过regex匹配src_label的值,如果匹配,则将匹配部分的replacement写入dst_label标签,匹配到的值可以用1,2 引用,1用第一个匹配的子组替换,2 用第二个匹配到的子组替换。如果正则表达式不匹配,则时间序列不变。
示例: 从up 的 instance 中匹配到IP 地址,并赋值给新的host标签,$1 为第一个(.*)
up
label_replace(up, "host", "$1", "instance", "(.*):(.*)")
6、kube-prometheus监控ControllerManage&Scheduler
参考:https://blog.csdn.net/qq_40460909/article/details/113848721
6.1、问题描述
版本1.18+现在使用更安全的https端口10257,并默认禁用http。不幸的是,kube-controller-manager和kube-scheduler都使用了–secure-port绑定到127.0.0.1而不是0.0.0.0
解决方法:
更新/etc/kubernetes/manifests/中的清单以将–bind-address 0.0.0.0用于调度程序和控制器管理器,将使用正确的绑定地址重新启动Pod,但是这些设置将无法生存kubeadm升级
6.2、kubeControllerManager配置
1)新增service.yaml
kube-prometheus-main/manifests/prometheus-serviceMonitorKubeControllerManager-service.yaml
Manager-service.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-controller-manager
labels:
k8s-app: kube-controller-manager
spec:
ports:
- name: https-metrics
port: 10257
selector:
component: kube-controller-manager
kubectl apply -f prometheus-serviceMonitorKubeControllerManager-service.yaml
2)修改 /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
将–bind-address=127.0.0.1 改为 --bind-address=0.0.0.0
由于kube-controller-manager是以静态Pod运行在集群中的,所以只要修改静态Pod目录下对应的yaml文件即可。等待一会后,对应服务会自动重启
6.3、KubeScheduler配置
1)新增service.yaml
kube-prometheus-main/manifests/prometheus-serviceMonitorKubeScheduler-service.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-scheduler
labels:
k8s-app: kube-scheduler
spec:
ports:
- name: https-metrics
port: 10259
selector:
component: kube-scheduler
kubectl apply -f prometheus-serviceMonitorKubeScheduler-service.yaml
2)修改 /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml
将–bind-address=127.0.0.1 改为 --bind-address=0.0.0.0
由于kube-scheduler是以静态Pod运行在集群中的,所以只要修改静态Pod目录下对应的yaml文件即可。等待一会后,对应服务会自动重启
7、监控etcd集群
7.1、prometheus监控原理:
1、有的组件自带metrics接口、比如control-manager、schduler自带metrics接口,如果有了endpoint和service就不用创建,没有则创建。
2、有的应用比如redis、mysql、rabbitmq没有自带metrics接口,就需要创建一个export的东西采集数据、在export暴露一个接口metrics,然后创建一个名字相同的endpoint和service,他们两个就会字段建立连接了。ServiceMonitor通过metric path和service建立起来,就实现了监控。
3、ServiceMonitor向上注册到prometheus的operator、operator再起创建target监控。
etcd自带metrics接口,可容如下命令请求metrics接口查看请求内容
curl \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
https://192.168.10.16:2379/metrics -k
service.crt:etcd证书
service.key:etcd密钥
7.2、创建secret对象:保存etcd证书
创建secrets
# 长江secrets
kubectl -n monitoring create secret generic etcd-certs \
--from-file=/etc/kubernetes/pki/etcd/ca.crt \
--from-file=/etc/kubernetes/pki/etcd/server.crt \
--from-file=/etc/kubernetes/pki/etcd/server.key
查看secrets
kubectl -n monitoring get secrets |grep etcd
7.3、将secrets证书添加到prometheus中
cd kube-prometheus-main/manifests
vim prometheus-prometheus.yaml
probeSelector: {}
replicas: 2
secrets: # 新增secrets证书,名字和上边创建的一致
- etcd-certs
resources:
requests:
memory: 400Mi
ruleNamespaceSelector: {}
# 更新pod
kubectl replace -f prometheus-prometheus.yaml
# 查看pod
kubectl get pod -n monitoring
prometheus-k8s-0
prometheus-k8s-1
进入到容器查看证书
# 进入到容器查看证书
kubectl -n monitoring exec -it prometheus-k8s-0 sh
# 证书所在目录
/prometheus $ ls /etc/prometheus/secrets/etcd-certs/
ca.crt server.crt server.key
7.4、创建ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: etcd-k8s #和下文中 service 的名字保持一致、会自动关联起来
namespace: monitoring
labels:
k8s-app: etcd-k8s
spec:
jobLabel: k8s-app
endpoints:
- port: port
interval: 30s
scheme: https
tlsConfig: #填写证书在 pod 中的路径
caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
certFile: /etc/prometheus/secrets/etcd-certs/server.crt
keyFile: /etc/prometheus/secrets/etcd-certs/server.key
insecureSkipVerify: true
selector:
matchLabels:
k8s-app: etcd
namespaceSelector:
matchNames:
- kube-system
# 创建
kubectl create -f prometheus-serviceMonitorEtcd.yaml --dry-run
kubectl create -f prometheus-serviceMonitorEtcd.yaml
# 查看
kubectl -n monitoring get ServiceMonitor
NAME AGE
alertmanager-main 93m
blackbox-exporter 93m
coredns 93m
etcd-k8s 52m
grafana 93m
kube-apiserver 93m
kube-controller-manager 93m
kube-scheduler 93m
kube-state-metrics 93m
kubelet 93m
node-exporter 93m
prometheus-adapter 93m
prometheus-k8s 93m
prometheus-operator 93m
7.5、创建service和endpoint
apiVersion: v1
kind: Service
metadata:
name: etcd-k8s # 和Endpoints的名字一致、这样会自动关联起来
namespace: kube-system
labels:
k8s-app: etcd
spec:
type: ClusterIP
clusterIP: None
ports:
- name: port
port: 2379
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-k8s # 和Endpoint的名字保持一致
namespace: kube-system
labels:
k8s-app: etcd
subsets:
- addresses:
- ip: 192.168.10.16 # 此处填写部署etcd的节点ip地址
ports:
- name: port
port: 2379
protocol: TCP
# 创建
kubectl create -f prometheus-etcdService.yaml --dry-run
kubectl create -f prometheus-etcdService.yaml
# 查看
kubectl -n kube-system get svc
kubectl -n kube-system get endpoints
7.6、dashboard验证
prometheus上查看
添加到grafana
ID:3070 15308 10323