目前K8S安装prometheus,官网已经提供了一整套的安装解决方案
地址:
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进行访问(如遇问题,请看问题解决)
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
。
对于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。
bash
kubectl create secret generic mysql-credentials --from-literal=password=your-mysql-password
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也支持其他数据库
SQLite 是 Grafana 的默认数据库,通常无需额外配置环境变量,但如果需要指定数据存储路径,可以使用以下环境变量:
环境变量 | 说明 | 示例 |
---|---|---|
GF_PATHS_DATA |
指定 Grafana 数据存储目录,SQLite 数据库文件会存储在该目录下 | GF_PATHS_DATA=/var/lib/grafana |
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 连接模式,如disable 、require 等 |
GF_DATABASE_SSL_MODE=require |
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 连接模式,如disable 、require 等 |
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 |
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
字段中设置这些环境变量。
这里我是通过ingress进行访问的,但是grafana和prometheus的UI怎么也访问不了,如果你也是这样,恭喜你和我遇到同样的问题了
这个问题困扰了好久
怀疑过几个方面。
1)webhook,prometheus可以使用webhook进行通知,但是webhook对于prometheus是非必须得。
2)权限问题,kube-prometheus做了最精细化的权限控制,包含用户权限,网络策略等等。
问题就出现在了网络策略
我通过网络策略增加ingress等多种方法还是访问不了UI,目前只能把网络策略先删除
如图
删除对外的UI访问的访问策略,后面再研究策略怎么配
其中grafana已经被我删除了,删除后就可以正常访问了。
我的docker是配置了国外代理加速的,可以直接拉取镜像,请检查你的是否配置。需要在每个节点都需要配置并且重启docker。