Yaml动态变量



所以,我只是从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要容易一些。

最新更新