kubernetes部署prometheus监控
# Prometheus监控安装
添加helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
2
之后来到重点,在我们install 之后,会遇到很多拉不下的镜像,可以通过一下方式解决: 首先 install 命令,看有哪些镜像拉不下来
helm install dfsf prometheus-community/kube-prometheus-stack --namespace monitoring
之后通过 kubectl describe
命令查看具体的问题pod(注意:stack会首先启动一个job,如果读者在上一步指令遇到等待条件超时的报错请kubectl get all -n monitoring
查看具体问题pod)
知道了具体的镜像名之后,我们进入docker.aityp.com找到对应的镜像
导出默认的values.yaml文件
helm show values prometheus-community/kube-prometheus-stack > default-values.yaml
下面是我整理的镜像文件images-values.yaml
grafana:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/docker.io/grafana/grafana
tag: latest
sidecar:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/docker.io/kiwigrid/k8s-sidecar
tag: 1.28.0
alertmanager:
alertmanagerSpec:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/docker.io/rancher/mirrored-prometheus-alertmanager
tag: v0.27.0
prometheus:
prometheusSpec:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/quay.io/prometheus/prometheus
tag: v3.1.0
prometheusOperator:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/quay.io/prometheus-operator/prometheus-operator
tag: v0.79.2
admissionWebhooks:
deployment:
image:
registry: docker.io
repository: imroc/prometheus-operator-admission-webhook
tag: "v0.77.2"
patch:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen
tag: v1.5.1
prometheusConfigReloader:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/docker.io/imroc/prometheus-config-reloader
tag: "v0.80.0"
thanosImage:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/docker.io/imroc/thanos
tag: v0.37.2
thanosRuler:
thanosRulerSpec:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/docker.io/imroc/thanos
tag: v0.37.2
kube-state-metrics:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/registry.k8s.io/kube-state-metrics/kube-state-metrics
tag: v2.9.2
prometheus-node-exporter:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/quay.io/prometheus/node-exporter
tag: v1.8.2
kubeRBACProxy:
image:
registry: swr.cn-north-4.myhuaweicloud.com
repository: ddn-k8s/quay.io/brancz/kube-rbac-proxy
tag: v0.18.2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
以同时针对 grafana 的配置编辑文件grafana-values.yaml
grafana:
adminUser: "admin"
adminPassword: "123456"
2
3
helm install zpj-monitor prometheus-community/kube-prometheus-stack -f images-values.yaml -f grafana-values.yaml --namespace monitoring
# 更新操作
helm upgrade zpj-monitor prometheus-community/kube-prometheus-stack -f images-values.yaml -f grafana-values.yaml --namespace monitoring
2
3
结果展示
# 总结
组件 | 默认镜像仓库 | 核心职责 |
---|---|---|
Prometheus Operator | quay.io/prometheus-operator | 管理监控组件(Prometheus、Alertmanager) |
Prometheus Server | quay.io/prometheus | 指标采集、存储、告警触发 |
Alertmanager | quay.io/prometheus | 告警路由与通知 |
Grafana | grafana/grafana | 可视化仪表盘 |
Node Exporter | quay.io/prometheus | 采集节点级指标(CPU、内存等) |
Kube State Metrics | quay.io/kube-state-metrics | 采集 Kubernetes 资源状态指标 |
组件 | 核心作用 |
---|---|
k8s-sidecar | 动态同步 ConfigMap/Secret 文件到主容器(热加载配置) |
admission-webhook | Kubernetes 资源操作准入控制(验证/变更请求) |
kube-webhook-certgen | 自生成 Webhook 所需的 TLS 证书 |
prometheus-config-reloader | 动态重载 Prometheus 配置(无需重启) |
thanos | 扩展 Prometheus 的高可用和全局查询能力 |
kubectl | 执行 Kubernetes 操作(初始化 Job 中的权限调整、资源管理) |
busybox | 轻量级调试命令工具(网络测试、文件检查等) |
# 时区问题
# 更改 Prometheus 的显示时区
Prometheus 为避免时区混乱,在所有组件中专门使用 Unix Time 和 Utc 进行显示。不支持在配置文件中设置时区,也不能读取本机 /etc/timezone 时区。
其实这个限制是不影响使用的:
如果做可视化,Grafana是可以做时区转换的。
如果是调接口,拿到了数据中的时间戳,你想怎么处理都可以。
如果因为 Prometheus 自带的 UI 不是本地时间,看着不舒服,2.16 版本的新版 Web UI已经引入了Local Timezone 的选项。
# 报错问题
1、kube-system命名空间的metrics-server报错
解决方法:修改镜像
kubectl edit deploy metrics-server -n kube-system
重启deploy
kubectl rollout restart deployment metrics-server -n kube-system
2、运行报错证书验证问题
kubectl logs -f metrics-server-8658cdb478-ff2vw -n kube-system
解决方法
kubectl edit deploy metrics-server -n kube-system
#添加以下参数到容器启动命令:
containers:
- args:
- --kubelet-insecure-tls # 跳过 TLS 验证
2
3
4
5
验证是否修复
kubectl logs -n kube-system -l k8s-app=metrics-server --tail=100
# 告警规则修改
#备份告警规则
kubectl get prometheusrules zpj-monitor-kube-prometheu-etcd -n monitoring -o yaml > zpj-monitor-kube-prometheu-etcd.yaml
#执行编辑规则
kubectl edit prometheusrules zpj-monitor-kube-prometheu-etcd -n monitoring
#如果对默认规则不满意也可以删除,新建一个规则应用
2
3
4
5
# 配置邮件告警
1、获取并解压当前配置
kubectl get secret alertmanager-zpj-monitor-kube-prometheu-alertmanager-generated -n monitoring -o json | jq -r '.data["alertmanager.yaml.gz"]' | base64 -d | gunzip > alertmanager.yaml
2、编辑配置文件
打开 alertmanager.yaml
文件,添加邮件告警配置。一个完整的邮件告警配置示例:
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '874878956@qq.com'
smtp_auth_username: '874878956@qq.com'
smtp_auth_password: 'xxxxxxxxxxxxxxx'
smtp_require_tls: false
route:
receiver: "email-notifications"
group_by:
- namespace
- job
- severity
routes:
- receiver: "email-notifications"
matchers:
- alertname = "Watchdog"
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
inhibit_rules:
- target_matchers:
- severity =~ warning|info
source_matchers:
- severity = critical
equal:
- namespace
- alertname
- target_matchers:
- severity = info
source_matchers:
- severity = warning
equal:
- namespace
- alertname
- target_matchers:
- severity = info
source_matchers:
- alertname = InfoInhibitor
equal:
- namespace
- target_matchers:
- alertname = InfoInhibitor
receivers:
- name: 'email-notifications'
email_configs:
- to: 'zpj199310@163.com'
send_resolved: true
templates:
- /etc/alertmanager/config/*.tmpl
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
3、压缩修改后的配置
gzip -c alertmanager.yaml > alertmanager.yaml.gz
4、创建新的 Secret
kubectl create secret generic alertmanager-new-config -n monitoring --from-file=alertmanager.yaml.gz
5、提取新 Secret 的 base64 编码数据
NEW_CONFIG=$(kubectl get secret alertmanager-new-config -n monitoring -o json | jq -r '.data["alertmanager.yaml.gz"]')
6、更新原始 Secret
kubectl get secret alertmanager-zpj-monitor-kube-prometheu-alertmanager-generated -n monitoring -o json | \
jq --arg new_config "$NEW_CONFIG" '.data["alertmanager.yaml.gz"]=$new_config' | \
kubectl apply -f -
2
3
7、重启 Alertmanager Pod 使配置生效
kubectl rollout restart statefulset alertmanager-zpj-monitor-kube-prometheu-alertmanager -n monitoring
# 验证配置
等待 Alertmanager Pod 重启后,可以通过以下命令验证配置是否已经应用:
kubectl get secret alertmanager-zpj-monitor-kube-prometheu-alertmanager-generated -n monitoring -o json | jq -r '.data["alertmanager.yaml.gz"]' | base64 -d | gunzip
如果你使用 Prometheus Operator 的方式管理 AlertManager,可能需要确保没有其他资源在覆盖你的配置。如果配置依然不生效,建议检查 AlertManager 的日志:
kubectl logs -l app.kubernetes.io/name=alertmanager -n monitoring
效果展示
# 更新操作
# 将配置保存为 alertmanager.yaml
# 压缩配置
gzip -c alertmanager.yaml > alertmanager.yaml.gz
# 创建新的 Secret
kubectl create secret generic alertmanager-new-config -n monitoring --from-file=alertmanager.yaml.gz --dry-run=client -o yaml | kubectl apply -f -
# 提取新 Secret 的编码数据
NEW_CONFIG=$(kubectl get secret alertmanager-new-config -n monitoring -o jsonpath='{.data.alertmanager\.yaml\.gz}')
# 更新原始 Secret
kubectl get secret alertmanager-zpj-monitor-kube-prometheu-alertmanager-generated -n monitoring -o json | \
jq --arg new_config "$NEW_CONFIG" '.data["alertmanager.yaml.gz"]=$new_config' | \
kubectl apply -f -
# 重启 Alertmanager
kubectl rollout restart statefulset alertmanager-zpj-monitor-kube-prometheu-alertmanager -n monitoring
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

