首页 > 解决方案 > 多线舵图模板的继承

问题描述

我想使用 helm 图表将资源设置为 pod,其中包含子图表中的资源部分模板。因为它应该是子图中的几个不同的资源模板。我有values.yamlmain-values.yamltemplates/deployment.yaml 更新舵图的命令是

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

文件被剪切以仅显示一个示例: main-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"

值.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 }}

我在deployment.yaml 的资源部分尝试了 $valtoYamltpl和普通$.Values选项,但遇到了几个错误,例如:

将 YAML 转换为 JSON 时出错:yaml:无效的映射键:map[interface {}]interface {}{".Values.resources_minimum":interface {}(nil)}

或者

将 YAML 转换为 JSON 时出错:yaml:第 29 行:找不到预期的“:”

和其他类似的错误。

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

标签: kubernetesyamlkubernetes-helm

解决方案


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

主值.yaml

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

值.yaml

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

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

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

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


推荐阅读