我想成为能够使用 Helm 的 _helpers.tpl 文件的人
首先
由于对Helm图表中的_helpers.tpl文件的使用方式不太清楚,我在本文中将尝试写下自己的理解和使用目的。
我认为在使用helm create [Chart名称]创建Helm Chart模板时,可以得到以下的结构。但是,这次文章的主题是在templates目录中创建一个名为_helpers.tpl的文件。
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl # 一体どう使うの??
│ ├── deployment.yaml
│ ...
└── values.yaml
确认如何使用values.yaml
在_helpers.tpl之前,首先考虑一下”values.yaml的使用方式”。
values.yaml是用于Helm图表的默认参数。以下是一个简单的示例,其中定义了Deployment资源的参数。
replicas: "3"
name: nginx
image: docker.io/nginx:1.25.1
在templates目录下有一个deployment.yaml文件,它会参考values.yaml中的值。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .Values.name }}
name: {{ .Values.name }}-deployment
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ .Values.name }}
template:
metadata:
labels:
app: {{ .Values.name }}
spec:
containers:
- image: {{ .Values.image }}
name: {{ .Values.name }}
如果要使用默认值直接部署 Deployment 资源,则可以按照以下方式执行 helm install 命令。
helm install nginx .
如果您想将值更改为除默认值以外的值,可以使用例如–set选项来进行更改。
helm install nginx . --set replicas=2
当我们重新审视时,可以将Helm Chart部署视为“程序执行”。在执行程序时,values.yaml可以被视为与配置文件或命令行参数相对应的东西。
又增加一個部署資源。
在这里,我们不仅需要使用nginx,还需要使用httpd。当尝试添加httpd的Deployment时,结果是”Manifest结构完全相同,只有值不同”,这让我们感到困惑…
当前的目录结构大致如下。deployment-httpd.yaml和deployment-nginx.yaml的内容几乎相同,这让我们很苦恼。
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl # どう使うの?
│ ├── deployment-httpd.yaml # ↓ほぼ同じ内容...
│ └── deployment-nginx.yaml # ↑ほぼ同じ内容...
└── values.yaml
如果您有编写程序的经验,您可能会认为“如果完全相同的内容出现,那么可以将其放入函数中!”在Helm Chart中,可以以类似函数的方式进行编写,从而避免当前冗长的写法,但这种操作是否可行呢?
在_helpers.tpl文件中尝试以函数的方式编写。
总的来说,你可以在_helpers.tpl中像编写函数一样来解决上述问题。不详细解释的话,我们先来稍微修改一下之前提到的templates/deployment.yaml,将Deployment资源的模板写在_helpers.tpl中试试看。
{{- define "deployment" -}}
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: {{ .name }}
name: {{ .name }}-deployment
spec:
replicas: {{ .replicas }}
selector:
matchLabels:
app: {{ .name }}
template:
metadata:
labels:
app: {{ .name }}
spec:
containers:
- image: {{ .image }}
name: {{ .name }}
{{- end -}}
与 templates/deployment.yaml 的不同之处有以下两点。
-
- 変数を参照する{{ .Values.xxxx }}の記述を{{ .xxxx }}に変更する
- 最初に{{- define “deployment” -}}、最後に{{- end -}}をつける
以下是关于某个剧情的一些剧透,如果用函数来比喻的话,上述内容将会被用于未来如下的方式。
{{- define “deployment” -}}のdeploymentが関数の名前
その中で使われている{{ .xxxx }}が関数の引数を通して渡された変数
戻り値は{{- define “deployment” -}}から{{- end -}}までの部分に変数を代入してレンダリングされたテキスト(具体的にはDeploymentのマニフェスト)
创建调用函数的部分
下面提供一个原生的中文重新表达:
接下来,我们将创建一个调用在_helpers.tpl中定义的部署的部分。在程序的函数中,我们可以使用deployment(参数)这样的写法,但在Helm的情况下,我们需要做一些不同的处理。
请将以下内容以中文进行表述,仅需要一个选项:
{{ 包括 “deployment” 参数 }}
可以用类似的写法来实现
如果可以以这种方式编写,每个部署的YAML文件只需要用一行表示。
{{ include "deployment" nginx用の引数 }}
{{ include "deployment" httpd用の引数 }}
设定用作函数参数的变量
在上述的每个YAML文件中,我没有明确指定“用于nginx的参数”和“用于httpd的参数”的设置方式,具体应该如何配置呢?
与这个“参数”相关的部分可以通过将其设置为在value.yaml中定义的值来进行设置。因此,我们可以在value.yaml中按以下方式进行配置,以设置nginx和httpd使用不同的值。
nginx:
replicas: "1"
name: nginx
image: docker.io/nginx:1.25.1
httpd:
replicas: "3"
name: httpd
image: docker.io/httpd:2.4.57
以这种方式写,可以通过指定如下的参数来获取values.yaml文件中的值。
{{ include "deployment" .Values.nginx }}
{{ include "deployment" .Values.httpd }}
确认部署是否完成
您可以确认如下问题无误地进行部署。
helm install nginx-and-httpd .
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-deployment 3/3 3 3 54s
nginx-deployment 1/1 1 1 54s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
httpd-deployment-77d86486fb-k4d5l 1/1 Running 0 73s
httpd-deployment-77d86486fb-l2wm7 1/1 Running 0 73s
httpd-deployment-77d86486fb-r2nf4 1/1 Running 0 73s
nginx-deployment-5c5c5dfff9-w25hz 1/1 Running 0 73s
最后
通过使用_helpers.tpl并以实际例子为基础,我确认了define可以像程序函数一样使用。除了本次介绍的内容,define应该还有其他有用的用法,所以我个人也希望以后能继续学习。