多线舵图模板的继承

Inheritance of multiline helm chart template

我想将资源设置为 pods 带有子图中资源部分模板的掌舵图。因为它应该是子图中的几个不同的资源模板。 我有 values.yamlmain-values.yamltemplates/deployment.yaml 更新 helm chart 的命令是

helm upgrade -i mynamespace ./kubernetes/mynamespace --namespace mynamespace --create-namespace -f kubernetes/mynamespace/main-values.yaml --reset-values

文件被剪切以仅显示示例: 主要-values.yaml :

namespace: mynamespace
baseUrl: myurl.com
customBranch: dev

components:

  postgresql:
    nodeport: 5432

  elasticsearch:
    nodeport: 9200

resources_minimum:
  requests:
    memory: "100M"
    cpu: "100m"
  limits:
     memory: "300M"
     cpu: "200m"

values.yaml

namespace: 
baseUrl: 
customBranch: 

components:
  service:
    name: service
    image: docker-registry.service.{{ .Values.customBranch }}
    imagePullPolicy: Always
    resources: "{{ .Values.resources_minimum }}"
    tag: latest
    port: 8080
    accessType: ClusterIP
cut

而deployment.yaml是

cut
      containers:
        - name: {{ $val.name }}
          securityContext:
            {{- toYaml $.Values.securityContext | nindent 12 }}
          image: "{{ tpl $val.image $ }}:{{ $val.tag | default "latest" }}"
          imagePullPolicy: {{ $val.imagePullPolicy }}
          resources: "{{ tpl $val.resources $ }}"
cut

并且资源的部署部分根本不起作用。然而,带有中间模板 {{ .Values.customBranch }} 的图像部分工作正常,nodeport 模板在 services.yaml

spec:
  type: {{ $val.accessType }}
  ports:
    - port: {{ $val.port }}
      name: mainport
      targetPort: {{ $val.port }}
      protocol: TCP
      {{ if and $val.nodeport  }}
      nodePort:  {{ $val.nodeport }}

我试过 $valtoYamltpl 和纯 $.Values options in resources section of deployment.yaml and got several errors like:

error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.resources_minimum":interface {}(nil)}

error converting YAML to JSON: yaml: line 29: could not find expected ':'

和其他类似的错误。

是否无法将多行的yaml值resources_minimum通过values.yaml推送到deployment.yaml? 我应该使用哪种语法? 您可以建议我阅读哪些文档?

无法在 values.yaml 文件中使用模板代码。 但是您可以 merge 几个 values.yaml 文件来重用配置值。

主要-values.yaml

components:
  service:
    image: docker-registry.service.dev
    resources:
      requests:
        memory: "100M"
        cpu: "100m"
        limits:
          memory: "300M"
          cpu: "200m"

values.yaml

components:
  service:
    name: service
    imagePullPolicy: Always
    tag: latest
    port: 8080
    accessType: ClusterIP

如果将其添加到模板中,它将包含来自两个值文件的值:

components: {{ deepCopy .Values.components | merge | toYaml | nindent 6 }}
  • merge + deepCopymerge the values 您所有的值文件。
  • toYaml 将以 yaml 语法输出结果。
  • 您还必须检查正确的缩进。 6 只是一个猜测。

致电helm template --debug ... 这甚至会生成无效的 yaml 输出,您可以在其中轻松检查正确的缩进并查看其他错误。

好的。研究员帮助我提供了优雅的解决方案。 values.yaml :

resource_pool:
  minimum:
    limits:
      memory: "200M"
      cpu: "200m"
    requests:
      memory: "100M"
      cpu: "100m"
...
components:
  service:
    name: service
    image: docker.image
    imagePullPolicy: Always
    tag: latest
    resources_local: minimum

和deployment.yaml:

          {{- range $keyResources, $valResources := $.Values.resource_pool }}
            {{- if eq $val.resources_local $keyResources }}
              {{ $valResources | toYaml | nindent 12}}
            {{- end }}
          {{- end }}

有什么建议可以阅读以熟悉所有 Helm 技巧吗?