kubernetes - 如何使用 Helm 从列表中迭代创建 pod?
问题描述
我正在尝试从 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
另一个 forb
和第三个 for创建一个 pod c
。
但是,当实际将其安装到集群中时,我总是只得到与列表中最后一个元素对应的 pod。(在这种情况下,c
)几乎就像它们相互覆盖一样,但是鉴于它们具有不同的名称,我认为它们不应该这样做吗?即使运行--debug
但不是--dry-run
输出告诉我我应该有 3 个 pod,但使用kubectl get pods
我只能看到一个。
如何使用 Helm 从列表中迭代地创建 pod?
解决方案
找到了!
显然,helm---
用作 pods/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 }}
推荐阅读
- python - 将 python 中的日志记录配置文件作为命令行参数传递
- java - 在本地获取 ERROR: org.apache.hadoop.hbase.PleaseHoldException: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
- python - 通过 Python 从和向蓝牙设备获取实时音频数据
- spring-boot - SessionId 在 Spring Boot Application 中的每个 curl 请求中不断变化
- python - 来自 Python 的 HTTP 请求不工作,在其他软件中工作
- angular - 在 Angular 动态表单创建中使用常量文件中的服务加载选择选项
- javascript - 如何在电子应用程序中使用 Vue 计算、数据、.. 属性?
- jenkins - 在 Jenkins Pipeline 中导入具有常量的类时出错
- trace - 使用 dd-trace-go 获取工作进程跨度 ID
- c# - 如何比较两个列表
并列出 在c#中