You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prometheus Helm Chart中如何用K8s Secret传递Azure认证密钥?

解决Prometheus Community Helm Chart中Azure SD Configs的Client Secret传递问题

你的方法为什么不可行

Prometheus默认不会自动解析配置文件中的环境变量占位符(${VAR}格式),所以即使容器里存在对应的环境变量,配置中的占位符也不会被替换。必须显式启用Prometheus的环境变量扩展功能。

推荐解决方案:启用Prometheus环境变量替换

这是最符合K8s最佳实践的方式,既安全又灵活,步骤如下:

1. 修改Helm Values配置

在你的values.yaml中添加以下配置:

server:
  # 从K8s Secret读取环境变量
  env:
    - name: AZURE_SD_CONFIGS_CLIENT_SECRET
      valueFrom:
        secretKeyRef:
          name: service-credentials
          key: azure_sd_configs_client_secret
  # 启用Prometheus的环境变量扩展功能
  extraArgs:
    - --config.expand-env=true
    # 可选:启用生命周期API,方便热重载配置
    - --web.enable-lifecycle

# 配置Node Exporter的Azure服务发现抓取作业
additionalScrapeConfigs:
  - job_name: 'node_exporter'
    azure_sd_configs:
      - environment: AzurePublicCloud
        port: 9100  # Node Exporter默认监听端口是9100,注意修正你之前的80端口
        subscription_id: xxx
        tenant_id: xxx
        client_id: xxx
        client_secret: ${AZURE_SD_CONFIGS_CLIENT_SECRET}
    # 可选:添加Relabel规则过滤目标(比如只抓取Linux节点)
    relabel_configs:
      - source_labels: [__meta_azure_machine_os]
        regex: Linux
        action: keep

2. 应用配置并验证

  • 升级Helm release:
helm upgrade prometheus prometheus-community/prometheus -f values.yaml
  • 进入Prometheus容器验证环境变量存在:
kubectl exec -it <prometheus-pod-name> -- printenv AZURE_SD_CONFIGS_CLIENT_SECRET
  • 访问Prometheus UI的/config端点,查看配置中的client_secret是否已被正确替换,或者检查服务发现目标是否正常加载。

其他可选方案

方案二:Helm模板直接注入Secret值

如果不想依赖Prometheus的环境变量扩展,可以通过Helm模板直接读取Secret内容并注入到配置中。但注意这种方式会将明文Secret渲染到Prometheus的ConfigMap中,安全性稍差:

additionalScrapeConfigs:
  - job_name: 'node_exporter'
    azure_sd_configs:
      - environment: AzurePublicCloud
        port: 9100
        subscription_id: xxx
        tenant_id: xxx
        client_id: xxx
        # 通过Helm lookup函数读取Secret并解码
        client_secret: {{ (lookup "v1" "Secret" "default" "service-credentials").data.azure_sd_configs_client_secret | b64dec }}

注意:此方法要求Helm运行时具备读取目标Secret的权限,若Secret不存在,Helm安装/升级会失败。

方案三:使用Secret存储抓取配置(适用于Prometheus Operator)

如果使用的是Prometheus Operator的Helm Chart,可以将包含Client Secret的抓取配置直接存入Secret,再让Prometheus加载该Secret:

  1. 创建包含抓取配置的Secret:
kubectl create secret generic azure-node-exporter-scrape --from-file=config.yaml=./scrape-config.yaml

scrape-config.yaml内容:

- job_name: 'node_exporter'
  azure_sd_configs:
    - environment: AzurePublicCloud
      port: 9100
      subscription_id: xxx
      tenant_id: xxx
      client_id: xxx
      client_secret: <你的Client Secret>
  1. 在Helm Values中配置:
prometheus:
  spec:
    additionalScrapeConfigs:
      name: azure-node-exporter-scrape
      key: config.yaml

总结

优先选择启用Prometheus环境变量替换的方案,它既保证了Secret的安全性(仅在容器内存中存在明文),又符合K8s的配置管理最佳实践。

内容的提问来源于stack exchange,提问作者oholic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:52:42