gpt4 book ai didi

kubernetes-helm - 如何在 Helm 模板中包含嵌套值

转载 作者:行者123 更新时间:2023-12-03 16:08:32 29 4
gpt4 key购买 nike

我掌 Helm 中有这种模板文件:

apiVersion:networking.istio.io/v1alpha3

kind: VirtualService
metadata:
name: {{.Values.app.name}}-global-route
namespace: {{.Release.Namespace}}
spec:
hosts:
- "{{.Values.app.name}}-global.{{.Release.Namespace}}.svc.cluster.local"
gateways:
- {{.Values.app.name}}-gateway
- mesh
http:
# 1st priority, to route specific end-user to canary service
- route:
- destination:
host: "{{.Values.app.name}}-global.{{.Release.Namespace}}.svc.cluster.local"
subset: canary
match: {{.Values.infra.trafficRoute.canaryCondition}}

我想公开values.yaml,如下所示:
# default values supplied for templates/* files
app:
name: java-maven-app

infra:
trafficRoute:
canaryCondition:
- headers:
end-user:
exact: apratama
key:
exact: agung

因此,基本上我想要实现的是让最终用户(使用我的掌 Helm chart 表的人)自定义加纳利条件。条件本身取决于istio的 match数据结构(可以嵌套和复杂的值)。
我在上面用 helm upgrade --install命令尝试过,但是以某种方式我得到了这个错误:
Error: UPGRADE FAILED: YAML parse error on java-maven-app-infra/templates/global-service.yaml: error converting YAML to JSON: yaml: line 17: found unexpected ':'
make: *** [deploy-infra] Error 1

但是,当我注释掉这一行时:
match: {{.Values.infra.trafficRoute.canaryCondition}}

它可以正常工作。

有什么建议吗?

最佳答案

我们之前在k8s Slack中讨论了该解决方案。我注意到您发布了自己的答案,但我想我也可以对此加以扩展,以防其他人遇到相同的问题。

问题在于,Helm图表模板执行文本模板而不是YAML模板。因此,插入的YAML子树(canaryCondition)不会自动转换为YAML并优雅地放置在match键下,而是将其转换为字符串并直接插入template指令所在的位置。对于简单的值(例如字符串和整数),这在大多数情况下都可以正常工作,但是更复杂的值(例如数组和映射)则需要以不同的方式进行处理。

为了在模板中插入YAML子树,您需要首先使用toYaml函数将子树转换为YAML,然后确保indent函数使用正确的缩进级别。

{{ toYaml .Values.infra.trafficRoute.canaryCondition | indent 4 }}

有关如何在模板中插入YAML子树的另一个示例,请参见 NGINX template example

要开始调试Helm图表模板,可以使用 helm template命令查看Helm图表生成的YAML。

关于kubernetes-helm - 如何在 Helm 模板中包含嵌套值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51815600/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com