我有两个 Helm chart ,第二个嵌套在第一个图表中 树输出:
.
└── outerChart
├── charts
│ └── innerChart
│ ├── charts
│ ├── Chart.yaml
│ ├── templates
│ │ ├── deployment.yaml
│ │ ├── _helpers.tpl
│ │ ├── ingress.yaml
│ │ ├── NOTES.txt
│ │ ├── serviceaccount.yaml
│ │ └── service.yaml
│ └── values.yaml
├── Chart.yaml
├── templates
└── values.yaml
我在外部 values.yaml
中有一个全局变量:
global:
myreplicacount: 4
在嵌套图表中有一个值文件
replicaCount: 1
以及使用它的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "foo.fullname" . }}
labels:
{{ include "foo.labels" . | indent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
使用全局变量的直接方法是替换:
replicas: {{ .Values.replicaCount }}
与:
replicas: {{ .Values.global.myreplicacount }}
在deployment.yaml
中。
但是可以在嵌套的 values.yaml
中使用它吗?我想保持内部图表完整。我陷入了这样一种情况:一个软件团队为我提供内部图表,而另一个软件团队通过全局变量提供所需的配置。 replicaCount
只是一个示例,它们有许多需要更改的变量,如果我编辑内部图表,将使内部图表更新变得困难。
只需添加:
replicaCount: {{ .Values.global.myreplicacount }}
在outerChart/charts/innerChart/values.yaml中 返回
): error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.global.myreplicacount":interface {}(nil)}
最佳答案
在嵌套图表内,.Values
被视为 .Values.nested
的内容(使用 requirements.yaml
或 Chart.yaml
中的依赖项的任何名称),与顶级 global:
合并关键。
# requirements.yaml
- name: nested # <-- this name will be used in values.yaml
version: "^1"
repository: ...
您可以使用该依赖项的名称作为 values.yaml
中的键来提供该依赖项的特定设置。 。这不需要global:
或依赖关系图的任何更改。
# outer chart values.yaml, or `helm install -f` YAML file
nested: # <-- matches name: in requirements.yaml above
replicaCount: 1
特别是对于部署副本计数,我更喜欢此选项而不是可能的替代方案。每个 Deployment 和 StatefulSet 可能都需要不同的副本数量,尤其是在多个图表中,并且全局地说“绝对所有东西都有 4 个副本”是没有意义的。
如果您可以编辑嵌套图表,并且希望它选择性地接受 global:
值,如果未设置本地值,您可以遵守该值
# charts/nested/deployment.yaml
replicas: {{ .Values.replicaCount | default .Values.global.replicaCount | default 1 }}
关于kubernetes - 是否可以在内部 Helm chart 的values.yaml中使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69074971/