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

Jac*_*ack 24 kubernetes-helm

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

helm upgrade cronjobs cronjobs/ --wait --set job.myservice.image.tag=b70d744
Run Code Online (Sandbox Code Playgroud)

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 }}
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

Thi*_*cao 51

If you need to pass array values you can use curly braces (unix shell require quotes):

--set test={x,y,z}
--set "test={x,y,z}"
Run Code Online (Sandbox Code Playgroud)

Result YAML:

test:
  - x
  - y
  - z
Run Code Online (Sandbox Code Playgroud)

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

EDITED : added double-quotes for unix shell like bash

  • 非常感谢,这不起作用,但我通过缩小逗号使其工作(以防其他人面临同样的问题):`helm update opining-frog deploy/traefik/chart --set externalIps={a\,b \,c}`。与此斗争了几个小时。 (10认同)
  • 谢谢大卫!似乎以下内容也可以解决所述错误: `--set "service.ListValue={a,b,c}"` (4认同)

Laz*_*ass 25

Helm 2.5.0 更新

从 Helm 2.5.0 开始,可以使用数组索引语法访问列表项。

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

servers:
  - port: 80
Run Code Online (Sandbox Code Playgroud)


Fra*_*ula 9

为了完整起见,我将发布一个使用 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"
Run Code Online (Sandbox Code Playgroud)

--set可以value这样CONFIG_BACKEND_URL

helm install ... --set "extraEnvVars[0].value=http://172.23.0.1:36241"
Run Code Online (Sandbox Code Playgroud)

其他两个变量(即CONFIG_BACKEND_AUTH_USERCONFIG_BACKEND_AUTH_PWD)将从文件中读取,values.yaml因为我们没有用--set. 与extraEnvVars[0].name以下相同。CONFIG_BACKEND_URLvalues.yaml

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


小智 8

掌舵 3。这对我有用。--设置“服务器[0].端口=80”--设置“服务器[1].端口=8080”

  • 这也适用于嵌套元素。示例: `"elements[0].arguments[0].value=firstValue"` `"elements[0].arguments[1].value=secondValue"` (3认同)

edb*_*ead 6

由于您在values.yaml文件中使用数组,请参阅相关问题

替代方案

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

  • 您的cronjob.yaml server: "{{ $job.image.server }}"值为空,我已将其更改为.image.nfsserver

不使用数组,只需将您的服务分开,如下例所示:

值.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
Run Code Online (Sandbox Code Playgroud)

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

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

使用{{ .suspend }}而不是{{ $job.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 }}
Run Code Online (Sandbox Code Playgroud)

使用--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
Run Code Online (Sandbox Code Playgroud)

希望有帮助!

  • 现在支持使用 `--set "test={x,y,z}"` 和 `--setservers[0].port=80` 传递数组,如其他答案中所述。 (3认同)