kube-prometheus

安装部署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

image.png

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

image.png

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查看当前的报警规则
image.png

告警规则查看 Status-configuration
image.png
node节点上的告警规则配置文件如下
image.png
在容器中prometheus的告警规则文件在
/etc/prometheus/rules/prometheus-k8s-rulefiles-0/
image.png
image.png

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控制台查看
image.png

4、简单介绍

理论参考链接:https://www.cnblogs.com/zqj-blog/p/10871033.html
prometheus根据配置 定时 去拉取各个节点的数据,默认使用的拉取方式是pull,也可以使用pushgateway提供的push方式获取各个监控节点的数据。将获取到的数据存入到TSDB,TSDB是一款时序数据库。
prometheus的监控数据可以使用内置的PromQL进行查询,告警管理和发送报警内容由Alertmanager组机负责。
image.png

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将样本以时间序列的方式保存在内存中,然后定时保存到硬盘上)


image.png

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
image.png

5.2、区间向量展示

点击 Excute 之后、选择Element 中的一条 全部复制下来、输入到 enable query history(搜索框) 里面、 内容后面加上**[5m]**,表示查询 5 分钟时间内的数据
image.png
如上图、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

image.png

查询 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"}

image.png

5.5、数学运算

对查询结果进行运算
:::success

  • +(加法)
  • -(减法)
  • *(乘法)
  • /(除法)
  • %(求余)
  • ^(幂运算,平方)
    :::
    举例:查看服务器物理可用内存、默认是以字节 Byte 的方式显示、咱们将其转换成 M 的方式显示。
node_memory_MemAvailable_bytes/1024/1024

Byte/1024=KB
KB/1024=M

image.png

查询可用内存小于等于2000M的服务器

node_memory_MemTotal_bytes/1024/1024<=3000

image.png

5.6、集合运算

对结果进行运算
集合运算符【按照它们的执行优先级顺序排列写出来】:
:::success

  • ^ (平方)
    • / %
  • == , != , <= , < , >= , >
  • and(并且) unless(排除) or (或者)
    :::
    举例,找出节点内存可用大于等于2000M,小于2140M的节点
node_memory_MemAvailable_bytes/1024/1024>=2000 and 
node_memory_MemAvailable_bytes/1024/1024 <=2140

image.png
unles : 排除
举例:查找出内存小于等于 3000M 并排除内存小于 2000M 的数据。
各节点可用内存如下:
image.png

操作符顺序如下
node_memory_MemAvailable_bytes/1024/1024<=3000 unless 
node_memory_MemAvailable_bytes/1024/1024 <= 2000

image.png

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)

image.png

  • sum根据某个字段进行统计,使用** by()**
sum(kubelet_http_requests_total)by(path)

image.png
sum对指标的所有标签值 计算和
image.png
对某个字段进行统计

sum(kubelet_http_requests_total)by(path)

image.png

  • 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)

image.png
统计前2条时序数据

topk(2,sum(kubelet_http_requests_total)by(path))

image.png

  • **bottonk **和 **sum **连用 取后 **3 **条时序

bottomk(3,sum(kubelet_http_requests_total)by(path))

image.png

  • quantile 取当前数据的中位数,取值为 0 到 1 之间

quantile比较难理解,不做过多笔录

用法如下:

quantile(0.5,kubelet_http_requests_total)

image.png
image.png

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

image.png
image.png

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")

image.png

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", "(.*):(.*)")

image.png
image.png

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
image.png
由于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
image.png

由于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

image.png

进入到容器查看证书

# 进入到容器查看证书
kubectl -n monitoring exec -it prometheus-k8s-0 sh

# 证书所在目录
/prometheus $ ls /etc/prometheus/secrets/etcd-certs/
ca.crt      server.crt  server.key

image.png

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

image.png

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

image.png

7.6、dashboard验证

prometheus上查看
image.png

添加到grafana
ID:3070 15308 10323
image.png

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值