VictoriaMetrics 维多利亚实现 Prometheus 多租户标识
前言:
在我们环境中有多个不同的 K8S 集群并且每套集群都有自己的 Prometheus 那么我们在汇总监控数据的时候就会出现数据来源问题,究竟是 A 还是 B 集群,所以为了解决这个问题这里我就需要基于 Prometheus 多租户来实现
1 Prometheus 实现多租户标识
要实现多租户 Prometheus 的区别标签,可以借助 PromQL 的标签操作和 VictoriaMetrics 的配置。下面是一个示例配置过程:
- 配置 VictoriaMetrics:
- 在 VictoriaMetrics 的配置文件中,确保开启了多租户支持。可以通过设置
vm-select -inputLabel
来指定标签名称用于区别租户。 - 可以使用
vm-insert -searchExpr -outputLabel
命令来为每个租户添加一个标签,其中是用于匹配每个租户数据的 PromQL 表达式,
是要添加的标签名称。
- 配置 Prometheus:
- 在 Prometheus 的配置文件中,配置 VictoriaMetrics 作为远程存储。例如,使用
remote_write
配置指向 VictoriaMetrics 的写入接口。 - 确保 Prometheus 配置文件中的
remote_write
部分的remoteTimeout
值与 VictoriaMetrics 的写入超时时间保持一致。
注意事项:
- 确保 VictoriaMetrics 和 Prometheus 的版本兼容性。
- 配置必要的安全措施,例如身份验证和授权,以保护租户数据的访问。
要通过 PromQL 查询 VictoriaMetrics 数据并实现多租户 Prometheus 的区别标签,您需要进行以下配置和步骤:
- 配置 VictoriaMetrics:首先,确保您已正确安装和配置 VictoriaMetrics。请参考 VictoriaMetrics 的官方文档获取详细说明。
- 配置多租户 Prometheus:修改 Prometheus 的配置文件,添加以下内容:
# Prometheus 二进制部署配置
external_labels:
tenant_id: ""
# Prometheus operator 部署
# spec.externalLabels
spec:
replicas: 1
externalLabels:
tenant: my-tenant
将 替换为您的租户标识符。这将为每个采集到的指标添加一个名为 tenant_id
的标签。
- 启动 VictoriaMetrics:使用适当的选项(例如,
-storage.local.dataPath=/path/to/data
)启动 VictoriaMetrics。 - 在 Prometheus 中配置 VictoriaMetrics 作为远程存储:修改 Prometheus 的配置文件,添加以下内容:
# vm 单机版 api
remote_write:
- url: "http://localhost:8428/api/v1/write" # 这里的 URL 是您 VictoriaMetrics 单机版的地址
# vm 集群版 api
remote_write:
- url: "http://vminsert:8480/insert/0/prometheus/" # 这里的 URL 是您 VictoriaMetrics 集群版的地址
确保将 URL 替换为正确的 VictoriaMetrics 地址。
- 重新启动 Prometheus:重新启动 Prometheus 以使配置更改生效。
- 使用 PromQL 查询多租户数据:现在,您可以使用 PromQL 查询来区分不同租户的数据。例如,使用以下查询:
2 vmselect 基于 promxy 实现可视化数据查询
我们都知道 vmselect 是用来查询数据,所以我们可以通过 promxy 将其实现可视化从而实现 web 页面查询数据
# vm-promxy.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: promxy-config
namespace: kube-vm
data:
config.yaml: |
promxy:
server_groups:
- static_configs:
- targets: [vmselect:8481] # 指定 vminser svc地址,有多个则往后追加即可
path_prefix: /select/0/promtheus # 配置前缀
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: promxy
namespace: kube-vm
spec:
selector:
matchLabels:
app: promxy
template:
metadata:
labels:
app: promxy
spec:
containers:
- args:
- "--config=/etc/promxy/config.yaml"
- "--web.enable-lifecycle"
- "--log-level=trace"
env:
- name: ROLE
value: "1"
command:
- "/bin/promxy"
image: quay.io/jacksontj/promxy
imagePullPolicy: Always
name: promxy
ports:
- containerPort: 8082
name: web
volumeMounts:
- mountPath: "/etc/promxy/"
name: promxy-config
readOnly: true
- args: # container to reload configs on configmap change
- "--volume-dir=/etc/promxy"
- "--webhook-url=http://localhost:8082/-/reload"
image: jimmidyson/configmap-reload:v0.1
name: promxy-server-configmap-reload
volumeMounts:
- mountPath: "/etc/promxy/"
name: promxy-config
readOnly: true
volumes:
- configMap:
name: promxy-config
name: promxy-config
---
apiVersion: v1
kind: Service
metadata:
name: promxy
namespace: kube-vm
spec:
type: NodePort
ports:
- port: 8082
selector:
app: promxy
直接创建上面的 yaml 文件即可
$ kubectl apply -f vm-promxy.yaml
浏览器访问: