所以,我只是从YAML和k8s开始,也许这个问题来自于缺乏对YAML和Helm如何协同工作的理解。但我想知道我是否可以在值中声明一个变量。在脚本运行期间将更改的YAML文件?我正在考虑为我开始的每个pod积累价值,这将被保存为每个pod的环境变量。我可以手动为每个pod创建不同的值,但我想知道是否有一个自动的方式这样做?希望我的问题是清楚的:)
Helm允许使用它的模板使用条件。例如,我可以在values.yaml
environment: preprod
然后在我的helm chart
{{ if eq .Values.environment "preprod" }}
## Do preprod stuff here
{{ end }}
{{ if eq .Values.environment "prod" }}
## Do prod stuff here
{{ end }}
这意味着如果我运行helm install
,那么.Values.environment
将解析为"preprod"{{ if eq .Values.environment "preprod" }}...{{ end }}
中的块将被打印到yaml中。
如果我想覆盖这个默认值,我可以通过添加--set
开关(详细信息在这里)
helm install --set environment=prod
将导致.Values.environment
变量解析为" product "而{{ if eq .Values.environment "prod" }} ... {{ end }}
中的块将被输出。
Helm模板是无状态的,变量结构是不可变的。
我可以在
values.yaml
文件中声明一个变量,该变量将在脚本运行期间更改吗?
那是不可能的,不。
如果你有函数式编程的经验,你可以在Helm模板的上下文中使用一些相关的技巧。模板只接受一个参数,但是您可以将该参数设置为一个列表,然后通过一系列递归模板调用向前传递一些状态。如果你想这样做,考虑写一个Kubernetes操作符:即使你必须学习Go来做,这种语言比模板语言更主流和实用,而且更容易测试。
话虽如此:
…为我开始的每个pod积累价值…
如果你想要的是一组非常相似的pod,除了它们有顺序的名字,这是StatefulSet提供的东西之一。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: some-name
spec:
replicas: 5
这个StatefulSet生成的pod将被命名为some-name-0
,some-name-1
,等等。您的应用程序代码可以通过hostname
命令和特定于语言的等价物查看这些名称。那可以满足你的需要。
如果需要更复杂的东西,还可以使用模板range
循环来生成一系列文档。每个文档都需要以---
YAML文档开始标记开始。您需要注意,range
重新绑定了.
特殊模板变量,就像.Values
这样的结构中出现的那样,我倾向于将其保存起来。
{{- $top := . }}
{{- $i := range until 5 }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "mychart.fullname" $top }}-{{ $i }}
spec: { ... }
{{- end }}
您应该总是使用更高级的结构,如部署、状态集或工作,而不是创建裸pod。尝试适应它们的模式通常比尝试手动创建几个非常不同的pod要容易一些。