Helm:通过 --set 传递数组值

Helm: Passing array values through --set

我有一个 cronjob helm 聊天,我可以在 values.yaml 中定义许多作业,cronjob.yaml 将提供我的作业。我在命令行中设置图像标签 ID 时遇到问题,以下命令不会抛出任何错误,但它不会将作业图像标签更新为新标签。

helm upgrade cronjobs cronjobs/ --wait --set job.myservice.image.tag=b70d744

cronjobs 将 运行 使用旧图像标签,我该如何解决这个问题?

这是我的cronjobs.yaml

{{- $chart_name := .Chart.Name }}
{{- $chart_version := .Chart.Version | replace "+" "_" }}
{{- $release_name := .Release.Name }}

{{- range $job := .Values.jobs }}
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  namespace: "{{ $job.namespace }}"
  name: "{{ $release_name }}-{{ $job.name }}"
  labels:
    chart: "{{ $chart_name }}-{{ $chart_version }}"
spec:
  concurrencyPolicy: {{ $job.concurrencyPolicy }}
  failedJobsHistoryLimit: {{ $job.failedJobsHistoryLimit }}
  suspend: {{ $job.suspend }}
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: {{ $release_name }}
            cron: {{ $job.name }}
        spec:
          containers:
          - image: "{{ $job.image.repository }}:{{ $job.image.tag }}"
            imagePullPolicy: {{ $job.image.imagePullPolicy }}
            ports:
              - name: http
                containerPort: 80
                protocol: TCP
            name: {{ $job.name }}
            args:
{{ toYaml $job.args | indent 12 }}
            env:
{{ toYaml $job.image.env | indent 12 }}
            volumeMounts:
            - name: nfs
              mountPath: "{{ $job.image.nfslogpath }}"
          restartPolicy: OnFailure
          imagePullSecrets:
            - name: {{ $job.image.secret }}
          volumes:
            - name: nfs
              nfs:
                server: "{{ $job.image.server }}"
                path: "{{ $job.image.nfspath }}"
                readOnly: false
  schedule: {{ $job.schedule | quote }}
  successfulJobsHistoryLimit: {{ $job.successfulJobsHistoryLimit }}
  {{- end }}

这是我的 values.yaml

jobs:
  - name: myservice
    namespace: default
    image:
      repository: xxx.com/myservice
      tag: fe4544
      pullPolicy: Always
      secret: xxx
      nfslogpath: "/var/logs/"
      nfsserver: "xxx"
      nfspath: "/nfs/xxx/cronjobs/"
      nfsreadonly: false
      env:
    schedule: "*/5 * * * *"
    args:
    failedJobsHistoryLimit: 1
    successfulJobsHistoryLimit: 3
    concurrencyPolicy: Forbid
    suspend: false

  - name: myservice2
    namespace: default
    image:
      repository: xxxx/myservice2
      tag: 1dff39a
      pullPolicy: IfNotPresent
      secret: xxxx
      nfslogpath: "/var/logs/"
      nfsserver: "xxxx"
      nfspath: "/nfs/xxx/cronjobs/"
      nfsreadonly: false
      env:
    schedule: "*/30 * * * *"
    args:
    failedJobsHistoryLimit: 1
    successfulJobsHistoryLimit: 2
    concurrencyPolicy: Forbid
    suspend: false

由于您在 values.yaml 文件中使用数组,请参阅 related issue

备选方案

  • 您的 values.yaml 缺少 argsenv[= 的值71=]。我在示例中设置了它们,并将缩进更改为 14

  • 你的cronjob.yamlserver: "{{ $job.image.server }}"值为空,我已经改成了.image.nfsserver

不使用数组,而是像下面的示例那样分隔您的服务:

values.yaml

jobs:
  myservice:
    namespace: default
    image:
      repository: xxx.com/myservice
      tag: fe4544
      pullPolicy: Always
      secret: xxx
      nfslogpath: "/var/logs/"
      nfsserver: "xxx"
      nfspath: "/nfs/xxx/cronjobs/"
      nfsreadonly: false
      env:
        key: val
    schedule: "*/5 * * * *"
    args:
      key: val
    failedJobsHistoryLimit: 1
    successfulJobsHistoryLimit: 3
    concurrencyPolicy: Forbid
    suspend: false

  myservice2:
    namespace: default
    image:
      repository: xxxx/myservice2
      tag: 1dff39a
      pullPolicy: IfNotPresent
      secret: xxxx
      nfslogpath: "/var/logs/"
      nfsserver: "xxxx"
      nfspath: "/nfs/xxx/cronjobs/"
      nfsreadonly: false
      env:
        key: val
    schedule: "*/30 * * * *"
    args:
      key: val
    failedJobsHistoryLimit: 1
    successfulJobsHistoryLimit: 2
    concurrencyPolicy: Forbid
    suspend: false

在您的 cronjob.yaml 中使用 {{- range $job, $val := .Values.jobs }} 迭代值。

在您使用 {{ $job.name }} 的地方使用 $job

使用 {{ .suspend }} 而不是 {{ $[=93= 来访问 suspend 这样的值] }}

cronjob.yaml

{{- $chart_name := .Chart.Name }}
{{- $chart_version := .Chart.Version | replace "+" "_" }}
{{- $release_name := .Release.Name }}

{{- range $job, $val := .Values.jobs }}
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  namespace: {{ .namespace }} 
  name: "{{ $release_name }}-{{ $job }}"
  labels:
    chart: "{{ $chart_name }}-{{ $chart_version }}"
spec:
  concurrencyPolicy: {{ .concurrencyPolicy }}
  failedJobsHistoryLimit: {{ .failedJobsHistoryLimit }}
  suspend: {{ .suspend }}
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: {{ $release_name }}
            cron: {{ $job }}
        spec:
          containers:
          - image: "{{ .image.repository }}:{{ .image.tag }}"
            imagePullPolicy: {{ .image.imagePullPolicy }}
            ports:
              - name: http
                containerPort: 80
                protocol: TCP
            name: {{ $job }}
            args:
{{ toYaml .args | indent 14 }}
            env:
{{ toYaml .image.env | indent 14 }}
            volumeMounts:
            - name: nfs
              mountPath: "{{ .image.nfslogpath }}"
          restartPolicy: OnFailure
          imagePullSecrets:
            - name: {{ .image.secret }}
          volumes:
            - name: nfs
              nfs:
                server: "{{ .image.nfsserver }}"
                path: "{{ .image.nfspath }}"
                readOnly: false
  schedule: {{ .schedule | quote }}
  successfulJobsHistoryLimit: {{ .successfulJobsHistoryLimit }}
{{- end }}

传值使用--set :

helm upgrade cronjobs cronjobs/ --wait --set jobs.myservice.image.tag=b70d744

示例:

helm install --debug --dry-run --set jobs.myservice.image.tag=my123tag .

...
HOOKS:
MANIFEST:

---
# Source: foo/templates/cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  namespace: default
  name: "illmannered-iguana-myservice"
  labels:
    chart: "foo-0.1.0"
spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 1
  suspend: false
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: illmannered-iguana
            cron: myservice
        spec:
          containers:
          - image: "xxx.com/myservice:my123tag"
            imagePullPolicy:
            ports:
              - name: http
                containerPort: 80
                protocol: TCP
            name: myservice
            args:
              key: val

            env:
              key: val

            volumeMounts:
            - name: nfs
              mountPath: "/var/logs/"
          restartPolicy: OnFailure
          imagePullSecrets:
            - name: xxx
          volumes:
            - name: nfs
              nfs:
                server: "xxx"
                path: "/nfs/xxx/cronjobs/"
                readOnly: false
  schedule: "*/5 * * * *"
  successfulJobsHistoryLimit: 3
---
# Source: foo/templates/cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  namespace: default
  name: "illmannered-iguana-myservice2"
  labels:
    chart: "foo-0.1.0"
spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 1
  suspend: false
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: illmannered-iguana
            cron: myservice2
        spec:
          containers:
          - image: "xxxx/myservice2:1dff39a"
            imagePullPolicy:
            ports:
              - name: http
                containerPort: 80
                protocol: TCP
            name: myservice2
            args:
              key: val

            env:
              key: val

            volumeMounts:
            - name: nfs
              mountPath: "/var/logs/"
          restartPolicy: OnFailure
          imagePullSecrets:
            - name: xxxx
          volumes:
            - name: nfs
              nfs:
                server: "xxxx"
                path: "/nfs/xxx/cronjobs/"
                readOnly: false
  schedule: "*/30 * * * *"
  successfulJobsHistoryLimit: 2

希望对您有所帮助!

如果需要传递数组值,可以使用大括号(unix shell 需要引号):

--set test={x,y,z}
--set "test={x,y,z}"

结果 YAML:

test:
  - x
  - y
  - z

来源:https://helm.sh/docs/intro/using_helm/#the-format-and-limitations-of---set

已编辑:为 unix shell 添加了 double-quotes,例如 bash

Update for Helm 2.5.0

As of Helm 2.5.0, it is possible to access list items using an array index syntax.

例如,--set servers[0].port=80 变为:

servers:
  - port: 80

在 helm 3 上。这对我有用。 --set "servers[0].port=80" --set "servers[1].port=8080"

为了完整起见,我将 post 一个更复杂的 Helm 3 示例。

假设您的 values.yaml 文件中有:

extraEnvVars:
- name: CONFIG_BACKEND_URL
  value: "https://api.example.com"
- name: CONFIG_BACKEND_AUTH_USER
  value: "admin"
- name: CONFIG_BACKEND_AUTH_PWD
  value: "very-secret-password"

您可以 --set 只为 CONFIG_BACKEND_URL value 这样:

helm install ... --set "extraEnvVars[0].value=http://172.23.0.1:36241"

其他两个变量(即 CONFIG_BACKEND_AUTH_USERCONFIG_BACKEND_AUTH_PWD)将从 values.yaml 文件中读取,因为我们不会用 --set 覆盖它们。 extraEnvVars[0].name 相同,根据 values.yaml.

将是 CONFIG_BACKEND_URL

来源:https://helm.sh/docs/intro/using_helm/#the-format-and-limitations-of---set