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

Kubernetes 如何使用Helm从列表中迭代创建pod?,kubernetes,yaml,kubernetes-helm,Kubernetes,Yaml,Kubernetes Helm,我正在尝试从头盔中的yaml循环创建一些吊舱。如果使用--debug--dry run运行,则输出符合我的预期,但当我实际部署到集群时,只会出现循环的最后一次迭代 为您准备一些yaml: {{ if .Values.componentTests }} {{- range .Values.componentTests }} apiVersion: v1 kind: Pod metadata: name: {{ . }} labels: app: {{ . }} chart:

我正在尝试从头盔中的yaml循环创建一些吊舱。如果使用
--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 }}
当我运行
helmupgrade--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
---
#来源:.yaml
版本:v1
种类:豆荚
元数据:
姓名:a
标签:
应用程序:a
图表:集成测试-0.0.1
释放:有趣的雪貂
遗产:蒂勒
规格:
餐馆政策:永不
容器:
-名称:内容测试
端口:
-集装箱港口:3000
图片:123456789012.dkr.ecr.eu-west-1.amazonaws.com/a:latest
imagePullPolicy:始终
命令:[“睡眠”]
参数:[“100d”]
资源:
请求:
内存:2000英里
cpu:500米
版本:v1
种类:豆荚
元数据:
姓名:b
标签:
应用程序:b
图表:集成测试-0.0.1
释放:有趣的雪貂
遗产:蒂勒
规格:
餐馆政策:永不
容器:
-姓名:b
端口:
-集装箱港口:3000
图片:123456789012.dkr.ecr.eu-west-1.amazonaws.com/b:latest
imagePullPolicy:始终
命令:[“睡眠”]
参数:[“100d”]
资源:
请求:
内存:2000英里
cpu:500米
版本:v1
种类:豆荚
元数据:
姓名:c
标签:
应用程序:用户测试
图表:集成测试-0.0.1
释放:有趣的雪貂
遗产:蒂勒
规格:
餐馆政策:永不
容器:
-姓名:c
端口:
-集装箱港口:3000
图片:123456789012.dkr.ecr.eu-west-1.amazonaws.com/c:latest
imagePullPolicy:始终
命令:[“睡眠”]
参数:[“100d”]
资源:
请求:
内存:2000英里
cpu:500米
---
(由于敏感/不相关,部分零件已被编辑/删除)

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

然而,当实际将其安装到集群中时,我总是只得到对应于列表中最后一个元素的pod。(在本例中,
c
)它们几乎是互相覆盖的,但鉴于它们有不同的名称,我认为它们不应该?即使使用
--debug
而不是
--dry run
运行,输出告诉我应该有3个pod,但是使用
kubectl get pods
我只能看到一个

如何使用Helm从列表中迭代创建吊舱?

找到了

很明显,helm使用
--
作为POD/服务/您所拥有的内容的规范之间的分隔符

在一个图表中多次指定相同的字段是有效的,它将对任何给定字段使用最后指定的值。为了避免覆盖值,而是创建多个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 }}
找到了

很明显,helm使用
--
作为POD/服务/您所拥有的内容的规范之间的分隔符

在一个图表中多次指定相同的字段是有效的,它将对任何给定字段使用最后指定的值。为了避免覆盖值,而是创建多个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 }}