英文:
helm --set .Values.someProp=false isnt overriding the default true value given in values.yaml
问题
我有一个Helm Chart,它被用作一个微服务Chart的子Chart或基础Chart,我们称之为common。
当微服务Chart使用common时,它的样子是这样的(每个微服务可以使用x个由其Chart创建的x个部署来部署pod):
apiVersion: v2
name: charts-integration-test
description: testing the common chart integration
dependencies:
- alias: app-01
name: common
repository: file://../../
version: ~2
- alias: app-02
name: common
repository: file://../../
version: ~2
- alias: app-02-internal
name: common
repository: file://../../
version: ~2
- alias: app-02-internal-bluegreen
name: common
repository: file://../../
version: ~2
而这个微服务的values.yaml文件如下所示:
global:
application:
imageName: foo
imageTag: bar
envVariables: {}
rookout:
enabled: false
config:
logLevel: INFO
foodb:
fooDbName: fooDbName
fooDbHost: fooDbHost
applications:
- app-01
- app-02
app-01:
config:
foodb:
fooDbName: fooDbName2
fooDbHost: fooDbHost2
在这个common Chart的values.yaml文件中,我有以下值:
commonDefaults:
rookout:
enabled: true
在这个Chart的deployment.yaml中,我使用以下代码合并了2个values.yaml的值:
{{- $values := merge (.Values | deepCopy) (.Values.global.application | deepCopy) (.Values.commonDefaults | deepCopy) -}}
重点是,在这个例子中,.Values.commonDefaults被.Values.global.application覆盖,而两者都被.Values覆盖,而.Values在这种情况下是在app-01
下的MS values.yaml中设置的值。
问题是,global.application.rookout.enabled=false
没有覆盖commonDefaults.rookout.enabled=true
。尽管如果我将global.application.rookout.enabled=foobar
,它会按预期覆盖。
我使用的helm版本是3.8.2,尽管在3.12.2中也不起作用。
感谢使用Helm。
英文:
I have a helm chart that is used as a subchart\base chart for a microservice chart we call it common.
the microservice chart looks like this when it uses common(each MS can deploy x pods using x deployments created by it's chart):
apiVersion: v2
name: charts-integration-test
description: testing the common chart integration
dependencies:
- alias: app-01
name: common
repository: file://../../
version: ~2
- alias: app-02
name: common
repository: file://../../
version: ~2
- alias: app-02-internal
name: common
repository: file://../../
version: ~2
- alias: app-02-internal-bluegreen
name: common
repository: file://../../
version: ~2
and the values.yaml of this microservice looks like this:
global:
application:
imageName: foo
imageTag: bar
envVariables: {}
rookout:
enabled: false
config:
logLevel: INFO
foodb:
fooDbName: fooDbName
fooDbHost: fooDbHost
applications:
- app-01
- app-02
app-01:
config:
foodb:
fooDbName: fooDbName2
fooDbHost: fooDbHost2
in this common chart in my values.yaml file I have the following value:
commonDefaults:
rookout:
enabled: true
in my deployment.yaml for this chart I am merging the values of 2 values.yaml using the following code:
{{- $values := merge (.Values | deepCopy) (.Values.global.application | deepCopy) (.Values.commonDefaults | deepCopy) -}}
The point being that in this example, .Values.commonDefaults is being overriden by .Values.global.application and both are overriden by .Values which in this case is values set in the MS values.yaml under app-01
.
The thing is that global.application.rookout.enabled=false
is not overriding commonDefaults.rookout.enabled=true
. Even though it works if I put global.application.rookout.enabled=foobar
, in which case it does override as expected.
I am using helm version 3.8.2 although it doesn't work with 3.12.2 as well.
Helm is appreciated.
答案1
得分: 0
对于那些在helm使用案例中遇到困难的人,以下是相关的解答:
这是不可能的。GO Spring模板语言将值someKey: false
视为未定义。
因此,如果你有一个默认值someKey: true
,并且你试图用一个未定义的值--set someKey=false
来覆盖它,那么helm不会更改默认值,因为你不能用一个未定义的值来覆盖一个值。
我的解决方案是将helm图表中的所有逻辑都更改为"true"和"false",所以不再使用{{ if .Values.someKey }}
,而是使用{{ if eq .Values.someKey "true" }}
。
当我想在命令行界面中覆盖它时,我使用--set-string someKey=false
。
这不是很好,但这就是现实。
英文:
For whoever finds this question relevant for the helm use-case they are struggling with here goes:
It's not possible. The GO spring templating language treats the value someKey: false
as undefined.
So, if you have a default value someKey: true
and you are trying to override it with an undefined value i.e. --set someKey=false
then helm will not change the default value because you don't override a value with an undefined value.
My solution was to change all the logic in my helm chart to "true" and "false" so instead of: {{ if .Values.someKey }}
I use {{ if eq .Values.someKey "true" }}
And when I want to override it in the cli I do --set-string someKey=false
it's not nice but it's what it is.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论