如何在多个独立发布的Helm Chart间共享自定义环境values.yaml文件?
我有两个Helm Chart:frontend和backend,二者均依赖名为mylib的library chart,该库包含供frontend和backend使用的通用模板。frontend和backend各自拥有专属的values.yaml文件。我需要为每个部署环境(dev、staging、production)配置独立的values文件,这些文件会与默认values.yaml合并。我希望在frontend和backend间共享这些环境values文件,无需在两处重复维护,但这两个Chart会被构建并发布到独立的Helm仓库。
尝试将这些values文件放在mylib库中,安装时引用:
helm install test-service myservice --values values.yaml --values mylib/stack-values/values-dev.yaml
但所有路径变体均失败,推测--values参数无法引用库中的文件。请问是否有办法无需将values-*.yaml文件内置到每个Chart中,实现多Chart间共享?
当前目录结构(backend和frontend已发布到独立Helm仓库):
├── backend │ ├── Chart.yaml │ ├── charts │ │ └── mylib-0.4.11.tgz │ ├── templates │ └── values.yaml ├── frontend │ ├── Chart.yaml │ ├── charts │ │ └── mylib-0.4.11.tgz │ ├── templates │ └── values.yaml ├── mylib │ ├── Chart.yaml │ ├── stack-values │ │ ├── values-dev.yaml │ │ └── values-loadtest.yaml │ └── templates
1. 单独维护共享values仓库
将stack-values目录单独放到独立的Git仓库或HTTP可访问存储中,部署时直接引用:
- 远程引用:Helm支持通过HTTP/HTTPS URL加载values文件,直接指定远程路径:
helm install frontend ./frontend --values ./frontend/values.yaml --values https://your-shared-values-repo/values-dev.yaml - 本地引用:克隆共享values仓库到本地,部署时指定本地文件路径:
helm install backend ./backend --values ./backend/values.yaml --values ./shared-values/values-dev.yaml
2. 使用Helmfile统一管理部署
用Helmfile集中管理所有Chart的部署配置,将共享values放在Helmfile目录下,为每个Chart关联共享values:
创建helmfile.yaml:
releases: - name: frontend chart: your-repo/frontend # 或本地路径./frontend values: - ./frontend/values.yaml - ./shared-values/values-dev.yaml - name: backend chart: your-repo/backend # 或本地路径./backend values: - ./backend/values.yaml - ./shared-values/values-dev.yaml
执行部署:
helmfile sync
这种方式只需维护一份共享values,由Helmfile统一分发给各个Chart。
3. 基于全局values传递共享配置
将共享环境配置放在global前缀下,比如values-dev.yaml:
global: env: dev replicaCount: 1 resources: requests: cpu: 100m
在frontend和backend的模板中,通过.Values.global引用这些共享配置。部署时引入该共享values文件即可:
helm install frontend ./frontend --values ./frontend/values.yaml --values ./shared-values/values-dev.yaml
此方法无需修改Chart依赖结构,只需统一模板中的配置引用路径。
原方法失败原因
Helm的--values参数仅能读取本地未压缩文件或远程URL,而mylib是以压缩包形式存在于frontend/backend的charts目录中,Helm无法直接读取压缩包内部文件,因此原路径引用方式无效。
内容的提问来源于stack exchange,提问作者TreverW

