可昕之家

可昕之家

张先生

平淡如水,爱护家人,好好工作

34 文章数
0 评论数

k8s集群安装prometheus监控

张清磊
2025-03-15 / 0 评论 / 43 阅读 / 0 点赞

目前K8S安装prometheus,官网已经提供了一整套的安装解决方案

1.安装教程

地址:

https://github.com/prometheus-operator/kube-prometheus

本文主要安装最新版本v0.14.0:

首先下载

https://github.com/prometheus-operator/kube-prometheus/releases/tag/v0.14.0

安装命令(与官网一致)

备注:docker或者containerd能够拉取国外镜像

(1)

kubectl apply --server-side -f manifests/setup

(2)
kubectl wait \
	--for condition=Established \
	--all CustomResourceDefinition \
	--namespace=monitoring

(3)
kubectl apply -f manifests/

(1)

kubectl apply --server-side -f manifests/setup

(2)
kubectl wait 
--for condition=Established 
--all CustomResourceDefinition 
--namespace=monitoring

(3)
kubectl apply -f manifests/


安装完成后整个监控集群的命名空间为monitoring

其中会有俩个pod失败,是因为有俩个镜像拉不下来(虽然配置)

分别是

kube-state-metrics,其镜像版本为:
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0

prometheus-adapter,其镜像为:registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0

这里使用国内的k8s镜像源下载,前缀:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/

比如拉取registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0为

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0

//然后改名

docker tag [镜像ID] registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0

等待即可自己启动完成。

通过ingress或者nodeport进行访问(如遇问题,请看问题解决)

2.数据持久化

2.1grafana持久化

Grafana 默认使用 SQLite 了,默认的数据库文件存储在 data/grafana.db,这里的 data 目录是相对于 Grafana 的安装目录。可以在 grafana.ini 文件中通过 [paths] 部分的 data 参数来查看或修改数据存储路径,示例如下:

[paths]
data = /var/lib/grafana

上述配置指定了 Grafana 的数据目录为 /var/lib/grafana,那么 SQLite 数据库文件将存储在 /var/lib/grafana/grafana.db

优缺点

优点

  • 简单易用:无需额外的数据库服务器配置和管理,降低了部署和维护的复杂度。
  • 轻量级:占用资源少,适合小型环境和测试场景。

缺点

  • 并发性能有限:在高并发场景下,SQLite 的性能可能不如专业的数据库,如 MySQL 或 PostgreSQL。
  • 缺乏高级功能:相比于 MySQL、PostgreSQL 等数据库,SQLite 缺乏一些高级的数据库特性,如用户角色管理、复杂的事务处理等。

更换数据

对于K8S来说,可以进行环境变量配置其他数据库

比如对于mysql来说

Grafana 为 grafana.ini 中的各项配置提供了对应的环境变量,对于 MySQL 数据库配置,主要涉及以下几个环境变量:

grafana.ini 配置项 对应的环境变量 说明
[database].type GF_DATABASE_TYPE 数据库类型,设置为mysql
[database].host GF_DATABASE_HOST MySQL 数据库的主机地址和端口,格式为host:port
[database].name GF_DATABASE_NAME 要使用的数据库名称
[database].user GF_DATABASE_USER 连接数据库的用户名
[database].password GF_DATABASE_PASSWORD 连接数据库的密码

比如如下

        env:
        - name: GF_DATABASE_TYPE
          value: "mysql"
        - name: GF_DATABASE_HOST
          value: "your-mysql-host:3306"  # 替换为实际的 MySQL 主机地址和端口
        - name: GF_DATABASE_NAME
          value: "grafana"  # 替换为实际的数据库名称
        - name: GF_DATABASE_USER
          value: "grafana_user"  # 替换为实际的数据库用户名
        - name: GF_DATABASE_PASSWORD
          value: "your-mysql-password"  # 替换为实际的数据库密码

注意: 其中mysql密码为明文密码,如果你需要更安全的,参考如下

安全存储敏感信息

在实际生产环境中,不建议直接在 YAML 文件中明文存储数据库密码。可以使用 Kubernetes 的 Secret 来安全地存储敏感信息,然后在 Deployment 中引用这些 Secret。

创建 Secret

bash

kubectl create secret generic mysql-credentials --from-literal=password=your-mysql-password

修改 Deployment 配置文件以引用 Secret

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-deployment
  labels:
    app: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:latest
        ports:
        - containerPort: 3000
        env:
        - name: GF_DATABASE_TYPE
          value: "mysql"
        - name: GF_DATABASE_HOST
          value: "your-mysql-host:3306"
        - name: GF_DATABASE_NAME
          value: "grafana"
        - name: GF_DATABASE_USER
          value: "grafana_user"
        - name: GF_DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-credentials
              key: password

支持的其他数据库

当然grafana也支持其他数据库

1. SQLite(默认)

SQLite 是 Grafana 的默认数据库,通常无需额外配置环境变量,但如果需要指定数据存储路径,可以使用以下环境变量:

环境变量 说明 示例
GF_PATHS_DATA 指定 Grafana 数据存储目录,SQLite 数据库文件会存储在该目录下 GF_PATHS_DATA=/var/lib/grafana

2. MySQL

MySQL 是一种常用的关系型数据库,在 Grafana 中使用 MySQL 数据库时,可通过以下环境变量进行配置:

环境变量 说明 示例
GF_DATABASE_TYPE 数据库类型,设置为mysql GF_DATABASE_TYPE=mysql
GF_DATABASE_HOST MySQL 数据库的主机地址和端口,格式为host:port GF_DATABASE_HOST=127.0.0.1:3306
GF_DATABASE_NAME 要使用的数据库名称 GF_DATABASE_NAME=grafana
GF_DATABASE_USER 连接数据库的用户名 GF_DATABASE_USER=grafana_user
GF_DATABASE_PASSWORD 连接数据库的密码 GF_DATABASE_PASSWORD=your_password
GF_DATABASE_SSL_MODE 可选,指定 SSL 连接模式,如disablerequire GF_DATABASE_SSL_MODE=require

3. PostgreSQL

PostgreSQL 也是一种流行的关系型数据库,Grafana 支持使用 PostgreSQL 数据库,相关环境变量如下:

环境变量 说明 示例
GF_DATABASE_TYPE 数据库类型,设置为postgres GF_DATABASE_TYPE=postgres
GF_DATABASE_HOST PostgreSQL 数据库的主机地址和端口,格式为host:port GF_DATABASE_HOST=127.0.0.1:5432
GF_DATABASE_NAME 要使用的数据库名称 GF_DATABASE_NAME=grafana
GF_DATABASE_USER 连接数据库的用户名 GF_DATABASE_USER=grafana_user
GF_DATABASE_PASSWORD 连接数据库的密码 GF_DATABASE_PASSWORD=your_password
GF_DATABASE_SSL_MODE 可选,指定 SSL 连接模式,如disablerequire GF_DATABASE_SSL_MODE=require
GF_DATABASE_SSL_CERT 可选,指定 SSL 证书文件路径 GF_DATABASE_SSL_CERT=/path/to/client.crt
GF_DATABASE_SSL_KEY 可选,指定 SSL 私钥文件路径 GF_DATABASE_SSL_KEY=/path/to/client.key
GF_DATABASE_SSL_ROOT_CERT 可选,指定 SSL 根证书文件路径 GF_DATABASE_SSL_ROOT_CERT=/path/to/root.crt

4. MSSQL(Microsoft SQL Server)

Grafana 也支持使用 Microsoft SQL Server 数据库,对应的环境变量配置如下:

环境变量 说明 示例
GF_DATABASE_TYPE 数据库类型,设置为mssql GF_DATABASE_TYPE=mssql
GF_DATABASE_HOST MSSQL 数据库的主机地址和端口,格式为host:port GF_DATABASE_HOST=127.0.0.1:1433
GF_DATABASE_NAME 要使用的数据库名称 GF_DATABASE_NAME=grafana
GF_DATABASE_USER 连接数据库的用户名 GF_DATABASE_USER=grafana_user
GF_DATABASE_PASSWORD 连接数据库的密码 GF_DATABASE_PASSWORD=your_password
GF_DATABASE_PARAMS 可选,指定额外的连接参数,如encrypt=true GF_DATABASE_PARAMS=encrypt=true

示例

在 Docker 部署 Grafana 时,可以通过 -e 参数设置这些环境变量,以使用 MySQL 数据库为例:

bash

docker run -d \
  -p 3000:3000 \
  -e GF_DATABASE_TYPE=mysql \
  -e GF_DATABASE_HOST=127.0.0.1:3306 \
  -e GF_DATABASE_NAME=grafana \
  -e GF_DATABASE_USER=grafana_user \
  -e GF_DATABASE_PASSWORD=your_password \
  grafana/grafana

在 Kubernetes 部署中,可以在 Deployment 配置文件的 env 字段中设置这些环境变量。

问题解决

问题1:UI端口无法访问,提示 504 Gateway Time-out

这里我是通过ingress进行访问的,但是grafana和prometheus的UI怎么也访问不了,如果你也是这样,恭喜你和我遇到同样的问题了

这个问题困扰了好久

怀疑过几个方面。

1)webhook,prometheus可以使用webhook进行通知,但是webhook对于prometheus是非必须得。

2)权限问题,kube-prometheus做了最精细化的权限控制,包含用户权限,网络策略等等。

问题就出现在了网络策略

我通过网络策略增加ingress等多种方法还是访问不了UI,目前只能把网络策略先删除

如图

删除对外的UI访问的访问策略,后面再研究策略怎么配

202503158adbc8f12b0544a3808b8e8904afc7db.png

其中grafana已经被我删除了,删除后就可以正常访问了。

问题2:镜像拉不下来

我的docker是配置了国外代理加速的,可以直接拉取镜像,请检查你的是否配置。需要在每个节点都需要配置并且重启docker。

上一篇 下一篇
评论
最新回复
    暂无内容
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月
文章目录
今日天气