Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes helm 如何在头盔模板中包含嵌套值_Kubernetes Helm - Fatal编程技术网

Kubernetes helm 如何在头盔模板中包含嵌套值

Kubernetes helm 如何在头盔模板中包含嵌套值,kubernetes-helm,Kubernetes Helm,我在helm中有这样的模板文件: apiVersion:networking.istio.io/v13 kind: VirtualService metadata: name: {{.Values.app.name}}-global-route namespace: {{.Release.Namespace}} spec: hosts: - "{{.Values.app.name}}-global.{{.Release.Namespace}}.svc.cluster.local"

我在helm中有这样的模板文件:

apiVersion:networking.istio.io/v13

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,如下所示: 所以,基本上我想要实现的是让最终用户(使用我的舵图的人)定制金丝雀状态。条件本身取决于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}}
它工作正常


有什么建议吗?

已解决。我在#helm users slack channel(kubernetes.slack.com)与一些人聊天,因此提供给模板的值是字符串值。因此需要将其转换为yaml对象并适当地缩进。我把它稍微改成这个,解决了这个问题

  # 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: 
{{ toYaml .Values.infra.trafficRoute.canaryCondition | indent 4 }}

我们之前在k8s Slack中讨论了此解决方案。我注意到你发布了你自己的答案,但我想我还是把它扩展一下,以防其他人遇到同样的问题

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

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

{{ toYaml .Values.infra.trafficRoute.canaryCondition | indent 4 }}
有关如何在模板中插入YAML子树的另一个示例,请参见


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

如果缩进有共同的混淆:

  # 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:
      {{- toYaml .Values.infra.trafficRoute.canaryCondition | nindent 4 }}
您还可以使用
{-toYaml…}
nindent
()获得正确的缩进:

  # 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:
      {{- toYaml .Values.infra.trafficRoute.canaryCondition | nindent 4 }}