我想成为能够使用 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” 参数 }}

可以用类似的写法来实现

我查了一下,发现 {{ include … }} 和 {{ template … }} 也可以写成 {{ include … }} ,但就我初步调查的感觉来看,基本上是使用 include 较为合适。

如果可以以这种方式编写,每个部署的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 }}
Values.nginx和Values.httpd分别表示将”values.yaml”文件中的nginx和httpd部分作为参数传递进去。nginx和httpd下面有replicas、name和image等键值对,这三个键值对分别对应着deployment中的.replicas、.name和.image。

确认部署是否完成

您可以确认如下问题无误地进行部署。

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应该还有其他有用的用法,所以我个人也希望以后能继续学习。

广告
将在 10 秒后关闭
bannerAds