【问题标题】:how can I iteratively create pods from list using Helm?如何使用 Helm 从列表中迭代创建 pod?
【发布时间】:2018-12-04 01:33:05
【问题描述】:

我正在尝试从 helm 中的 yaml 循环创建多个 pod。如果我使用--debug --dry-run 运行,输出符合我的预期,但是当我实际部署到集群时,只存在循环的最后一次迭代。

一些 yaml 给你:

{{ if .Values.componentTests }}
{{- range .Values.componentTests }}
apiVersion: v1
kind: Pod
metadata:
  name: {{ . }}
  labels:
    app: {{ . }}
    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace "+" "_" }}
    release: {{ $.Release.Name }}
    heritage: {{ $.Release.Service }}
spec:
{{ toYaml $.Values.global.podSpec | indent 2 }}
  restartPolicy: Never
  containers:
  - name: {{ . }}
    ports:
      - containerPort: 3000
    image: 123456789012.dkr.ecr.eu-west-1.amazonaws.com/{{ . }}:latest
    imagePullPolicy: Always
    command: ["sleep"]
    args: ["100d"]
    resources:
      requests:
        memory: 2000Mi
        cpu: 500m
{{- end }}
{{ end }}

当我运行helm upgrade --install --set componentTests="{a,b,c}" --debug --dry-run

我得到以下输出:

# Source: <path-to-file>.yaml
apiVersion: v1
kind: Pod
metadata:
  name: a
  labels:
    app: a
    chart: integrationtests-0.0.1
    release: funny-ferret
    heritage: Tiller
spec: 
  restartPolicy: Never
  containers:
  - name: content-tests
    ports:
      - containerPort: 3000
    image: 123456789012.dkr.ecr.eu-west-1.amazonaws.com/a:latest
    imagePullPolicy: Always
    command: ["sleep"]
    args: ["100d"]
    resources:
      requests:
        memory: 2000Mi
        cpu: 500m
apiVersion: v1
kind: Pod
metadata:
  name: b
  labels:
    app: b
    chart: integrationtests-0.0.1
    release: funny-ferret
    heritage: Tiller
spec:  
  restartPolicy: Never
  containers:
  - name: b
    ports:
      - containerPort: 3000
    image: 123456789012.dkr.ecr.eu-west-1.amazonaws.com/b:latest
    imagePullPolicy: Always
    command: ["sleep"]
    args: ["100d"]
    resources:
      requests:
        memory: 2000Mi
        cpu: 500m
apiVersion: v1
kind: Pod
metadata:
  name: c
  labels:
    app: users-tests
    chart: integrationtests-0.0.1
    release: funny-ferret
    heritage: Tiller
spec:
  restartPolicy: Never
  containers:
  - name: c
    ports:
      - containerPort: 3000
    image: 123456789012.dkr.ecr.eu-west-1.amazonaws.com/c:latest
    imagePullPolicy: Always
    command: ["sleep"]
    args: ["100d"]
    resources:
      requests:
        memory: 2000Mi
        cpu: 500m
---

(由于敏感/不相关,某些部分已被编辑/删除)

在我看来,它做了我想做的事,即为a 创建一个 pod,另一个为b,第三个为c

但是,当实际将它安装到集群中时,我总是只得到与列表中最后一个元素对应的 pod。 (在这种情况下,c)几乎就像它们相互覆盖一样,但考虑到它们有不同的名称,我认为它们不应该吗?即使使用--debug 而不是--dry-run 运行,输出告诉我我应该有3 个吊舱,但使用kubectl get pods 我只能看到一个。

如何使用 Helm 从列表中迭代地创建 pod?

【问题讨论】:

    标签: kubernetes yaml kubernetes-helm


    【解决方案1】:

    找到了!

    显然,helm 使用 --- 作为 pod/services/whatHaveYou 规范之间的分隔符。

    在单个图表中多次指定相同的字段是有效的,它将使用任何给定字段的最后指定值。为了避免覆盖值并创建多个 pod,只需在循环末尾添加分隔符:

    {{ if .Values.componentTests }}
    {{- range .Values.componentTests }}
    apiVersion: v1
    kind: Pod
    metadata:
      name: {{ . }}
      labels:
        app: {{ . }}
        chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace "+" "_" }}
        release: {{ $.Release.Name }}
        heritage: {{ $.Release.Service }}
    spec:
    {{ toYaml $.Values.global.podSpec | indent 2 }}
      restartPolicy: Never
      containers:
      - name: {{ . }}
        ports:
          - containerPort: 3000
        image: 123456789012.dkr.ecr.eu-west-1.amazonaws.com/{{ . }}:latest
        imagePullPolicy: Always
        command: ["sleep"]
        args: ["100d"]
        resources:
          requests:
            memory: 2000Mi
            cpu: 500m
    ---
    {{- end }}
    {{ end }}
    

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 2021-04-19
      • 2019-05-19
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多