【问题标题】:helm variables in .Values.Values 中的 helm 变量
【发布时间】:2018-09-14 13:46:54
【问题描述】:

我想动态生成我的模板文件,这是我的情况:

{{- $v := (.Files.Get "values-deployment-nginx.yaml") | fromYaml }}
spec:
  {{- range $key, $value := $v.containers }}
  containers:
  - name: {{ $value.name }}
    image: {{ .Values.{{ $value.name }}-image }}:{{ .Values.{{ $value.name }}--tag }}

我想先获取 {{ $value.name }},它可能是一个类似“nginx”的字符串,然后我想使用 {{ .Values.nginx-image }} 来获取正确的图像值在值文件中。
有没有办法做到这一点?非常感谢!


我有很多动态生成的部署模板,但是只想把图片和标签暴露给values文件,这样我们在安装chart的时候可以传递不同的图片信息。其他变量在 (.Files.Get "values-deployment-nginx.yaml") 中,就像这样(也是动态生成的)。所以在生成模板时,我想在值文件中匹配图像和标签。

像这样的值文件:

deployment-nginx-imagerepo: nginx
deployment-nginx-imagetag: latest

values-deployment-nginx.yaml 像这样(由其他项目生成):

autoscale: []
containers:
- envs: []
  imagerepository: nginx
  imagetag: latest
  itemid: n79fecd51_6716_fa65_5e64_aeed8ed6ab7e
  name: nginx
  resource:
    maxcpu: ""
    maxmemory: ""
    mincpu: "0.5"
    minmemory: 512m
  volumemounts: []
name: details
replicas: 1
schedulpolicy: []
storages: []
type: deployment

【问题讨论】:

    标签: kubernetes-helm go-templates


    【解决方案1】:

    Go text/template language 中我相信index 函数会做到这一点。 (.Values 通常是一个映射,YAML 映射和列表转换为 Go 映射和切片。)(还要记住 sprig 库中的几乎所有内容都可用。)

    image: {{ index .Values (printf "%s-image" $value.name) }}:{{ index .Values (printf "%s-tag" $value.name) }}
    

    【讨论】:

      【解决方案2】:

      另一种方法是定义一个助手。

      假设我们在运行时在值文件中传递图像信息,该文件根据目标环境(命名空间)和服务(图表名称)定义版本的字典映射。

      例如,

      DEV:
        appA: a.b.c/path/to/appA:1.2.3
        appB: a.b.c/path/to/appB:2.2.1
      QA:
        appA: a.b.c/path/to/appA:1.2.1
        appB: a.b.c/path/to/appB:1.8.1
      

      这定义了命名空间DEVQA,每个都有服务appAappB

      在我的templates/_helpers.tpl 文件中:

      {{/* Look up image spec from the runtime values file. */}}
      {{- define "appB.refSpec"                              -}}{{*/ or appA /*}}
      {{-   $targetEnv := index .Values .Release.Namespace    }}
      {{-   get $targetEnv .Chart.Name                        }}
      {{- end                                                 }}
      

      然后在templates/deployment.yaml:

      image: "{{ include "appB.refSpec" . }}"
      

      现在部署时:

      helm upgrade -i -n DEV appB myRepo/appB -f v.yml
      

      refSpec 助手将从.Values 分配$targetEnv 映射DEV,然后将其中的appB 值传递回image: 字段以进行部署。

      如果我们在 git 存储库中维护该文件,那么每个更改都可以通过拉取请求审查和批准,并且很容易在运行时以自动化方式克隆。

      您可能不需要那么复杂,但它可以让您在需要时封装它。 :)

      【讨论】:

        猜你喜欢
        • 2020-01-22
        • 2022-12-02
        • 2021-04-06
        • 2019-03-06
        • 2020-04-26
        • 2022-12-01
        • 1970-01-01
        • 2019-09-21
        • 2020-10-20
        相关资源
        最近更新 更多