使用kube-prometheus在K8s集群快速部署Prometheus+Grafana

转载说明:

  • 原创内容,请注明出处

官方提供了 Prometheus的端到端 Kubernetes 集群监控部署工具 kube-prometheus

包含如下组件:

1. 检查kubelet配置

默认情况下,kubelet 使用 token 身份验证和授权,否则 Prometheus 需要客户端证书,该证书赋予它对 kubelet 的完全访问权限,而不仅仅是 metrics。token 身份验证和授权可以实现更细粒度、更轻松的访问控制。

在控制平面查看 所有节点kubelet 两项配置

  • authentication.webhook.enabled 是否为 true
  • authorization.mode 是否为 Webhook
bash 复制代码
# k8s-control是我控制平面的node name
$ kubectl get --raw /api/v1/nodes/k8s-control/proxy/configz | jq .kubeletconfig.authentication.webhook.enabled

true

$ kubectl get --raw /api/v1/nodes/k8s-control/proxy/configz | jq .kubeletconfig.authorization.mode

"Webhook"

# k8s-worker-1是我工作节点的node name
$ kubectl get --raw /api/v1/nodes/k8s-worker-1/proxy/configz | jq .kubeletconfig.authentication.webhook.enabled

true

$ kubectl get --raw /api/v1/nodes/k8s-worker-1/proxy/configz | jq .kubeletconfig.authorization.mode

"Webhook"

2. 拉取 kube-prometheus 到控制平面

bash 复制代码
git clone git@github.com:prometheus-operator/kube-prometheus.git

3. 修改副本数

默认考虑到高可用,部分组件会多副本部署,但作为学习环境可以将副本数改为1节省云资源

bash 复制代码
# 一般只有这三个组件使用多副本(node-exporter特殊)
vim ./manifests/prometheus-prometheus.yaml 
vim ./manifests/prometheusAdapter-deployment.yaml
vim ./manifests/alertmanager-alertmanager.yaml

特殊node-exporter 组件使用来收集节点级指标的,因此必须在每个节点部署,不要去修改副本数

4. 部署

bash 复制代码
cd kube-prometheus
kubectl apply --server-side -f manifests/setup
kubectl wait \
    --for condition=Established \
    --all CustomResourceDefinition \
    --namespace=monitoring
kubectl apply -f manifests/

5. 通过 Ingress 暴露 Web

5.1. 修改 Web 端 URL

bash 复制代码
# 修改 Prometheus web url
$ vim ./manifests/prometheus-prometheus.yaml

## spec下添加如下项
spec:
  externalUrl: 'http://your-domain.com/prometheus'

---

# 修改 alertmanager web url
$ vim ./manifests/alertmanager-alertmanager.yaml

## spec下添加如下项
spec:
  externalUrl: 'http://your-domain.com/alertmanager'

---

# 修改 grafana web url
$ vim ./manifests/grafana-deployment.yaml

## spec.template.spec.containers.env下添加环境变量
- name: GF_SERVER_ROOT_URL
  value: "http://your-domain.com/grafana"
- name: GF_SERVER_SERVE_FROM_SUB_PATH
  value: "true"

5.2. 更新网络策略

bash 复制代码
# 允许ingress-nginx的pod访问 grafana svc
$ vim ./manifests/grafana-networkPolicy.yaml

## 在spec.podSelector.matchLabels中添加一行
spec:
	...
  podSelector:
	matchLabels:
	  app.kubernetes.io/component: grafana
	  app.kubernetes.io/name: grafana
	  app.kubernetes.io/part-of: kube-prometheus
	  app.kubernetes.io/name: ingress-nginx # 添加这行

## 应用资源修改
$ kubectl apply -f  ./manifests/grafana-networkPolicy.yaml

---

# 允许ingress-nginx的pod访问 alertmanager svc
$ vim ./manifests/alertmanager-networkPolicy.yaml

## 在spec.podSelector.matchLabels中添加一行
spec:
	...
  podSelector:
	matchLabels:
	  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/name: ingress-nginx # 添加这行

## 应用资源修改
$ kubectl apply -f  ./manifests/alertmanager-networkPolicy.yaml

5.3. 创建ingress资源

如下为 prometheusingress manifest ,grafanaalertmanager 类似

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-ingress
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - your-domain.com
      secretName: your-tls-secret
  rules:
    - host: "your-domain.com"
      http:
        paths:
          - path: /prometheus/?(.*)
            pathType: Prefix
            backend:
              service:
                name: prometheus-k8s
                port:
                  number: 9090

创作不易,希望大家多多支持,文章持续更新,我们下期见.

程序员白话 | [原创]

点关注不迷路

可以抖音搜索「程序员白话」,大家有任何问题都可以私聊我,知无不言~

相关推荐
想用offer打牌2 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX3 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment4 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
Cobyte5 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
程序员侠客行6 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Honmaple6 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端
PP东6 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
invicinble7 小时前
springboot的核心实现机制原理
java·spring boot·后端