【笔记】Helm-5 Chart模板指南-8 命名模板

命名模板

此时需要越过模板,开始创建其他内容了。该部分我们会看到如何在一个文件中定义 命名模板,并在其他地方使用。命名模板(有时称作一个部分或一个子模板)仅仅是在文件内部定义的模板,并使用了一个名字。有两种创建方式和几种不同的使用方法。

在 流控制 部分,我们介绍了三种声明和管理模板的方法:define,template,和block。在这部分,我们将使用这三种操作并介绍一种特殊用途的include方法,类似于template操作。

Helm | 流控制

命名模板时要记住一个重要细节:模板名称是全局的。如果您想声明两个相同名称的模板,哪个最后加载就使用哪个。因为在子chart中的模板和顶层模板一起编译,命名时要注意chart特定名称。

一个常见的名称惯例是用chart名称作为模板前缀:{{ define "mychart.labels" }}。使用特定chart名称作为前缀可以避免可能因为两个不同chart使用了相同名称的模板而引起的冲突。

这个规则同样适用于chart的不同版本。如果有mychart的1.0.0版本以一种方式定义了模板,mychart的2.0.0版本修改了已有的命名模板,那就会使用最后加载的版本。也可以在chart名称中添加版本来解决这个问题:{{ define "mychart.v1.labels" }}和{{ define "mychart.v2.labels" }}。

局部的和_文件

目前为止,我们已经使用了单个文件,且单个文件中包含了单个模板。但Helm的模板语言允许您创建命名的嵌入式模板,这样就可以在其他位置按名称访问。

在编写模板细节之前,文件的命名惯例需要注意:

1、templates/中的大多数文件被视为包含Kubernetes清单

2、NOTES.txt是个例外

3、命名以下划线(_)开始的文件则假定没有包含清单内容。这些文件不会渲染为Kubernetes对象定义,但在其他chart模板中都可用。

这些文件用来存储局部和辅助对象,实际上当我们第一次创建mychart时,会看到一个名为_helpers.tpl的文件,这个文件是模板局部的默认位置。

用define和template声明和使用模板

define操作允许我们在模板中创建一个命名模板,语法如下:

{{- define "MY.NAME" }}

  # body of template here

{{- end }}

{{- define "MY.NAME" }}# body of template here
{{- end }}

比如我们可以定义一个模板封装Kubernetes的标签:

{{- define "mychart.labels" }}

  labels: 

    generator: helm

    data: {{ now | htmlData }}

{{- end }}

{{- define "mychart.labels" }}labels:generator: helmdate: {{ now | htmlDate }}
{{- end }}

现在我们将模板嵌入到了已有的配置映射中,然后使用template包含进来:

{{- define "mychart.labels"}}

  labels:

    generator: helm

    date: {{ now | hemlDate }}

{{- end }}

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

  {{- template "mychart.labels" }}

data:

  myvalue: "Hello World"

  {{- range $key,$val := .Values.favorite }}

  {{ $key }}: {{ $val | quote }}

  {{-end }}

{{- define "mychart.labels" }}labels:generator: helmdate: {{ now | htmlDate }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap{{- template "mychart.labels" }}
data:myvalue: "Hello World"{{- range $key, $val := .Values.favorite }}{{ $key }}: {{ $val | quote }}{{- end }}

当模板引擎读取该文件时,它会存储mychart.labels的引用直到template "mychart.labels"被调用。然后会按行渲染模板,因此结果类似这样:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfidMap

metadata:

  name: running-panda-configmap

  labels:

    generator: helm

    data: 2016-11-02

data:

  myvalues: "Hello World"

  drink: "coffee"

  food: "pizza"

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: running-panda-configmaplabels:generator: helmdate: 2016-11-02
data:myvalue: "Hello World"drink: "coffee"food: "pizza"

注意:define不会有输出,除非像本示例一样用模板调用它。

按照惯例,Helm chart将这些模板放置在局部文件中,一般是_helpers.tpl。把这个方法移到那里:

{{/* Generate basic labels */}}

{{- define "mychart.labels" }}

  labels:

    generator: helm

    date: {{ now | htmlDate }}

{{- end }}

{{/* Generate basic labels */}}
{{- define "mychart.labels" }}labels:generator: helmdate: {{ now | htmlDate }}
{{- end }}

按照惯例define方法会有个简单的文档块({{/*...*/}})来描述要做的事。

尽管这个定义是在_helpers.tpl中,但它仍能访问configmap.yaml:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

  {{- template "mychart.labels" }}

data:

  myvalues: "Hello World"

  {{- range $key, $val := .Values.favorite }}

  {{ $key }}: {{ $val | quote }}

  {{- end }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap{{- template "mychart.labels" }}
data:myvalue: "Hello World"{{- range $key, $val := .Values.favorite }}{{ $key }}: {{ $val | quote }}{{- end }}

如上所述,模板名称是全局的。因此,如果两个模板使用相同名字声明,会使用最后出现的那个。由于子chart中的模板和顶层模板一起编译,最好用chart特定名称命名您的模板。常用的命名规则是用chart的名字作为模板的前缀:{{ define "mychart.labels" }}

设置模板范围

在上面定义的模板中,我们没有使用任何对象,仅仅使用了方法。修改定义好的模板让其包含chart名称和版本号:

{{/* Generator basic labels */}}

{{-define "mychart.labels" }}

  labels:

    generator: helm

    data: {{ now| htmlDate }}

    chart: {{ .Chart.Name }}

    version: {{ .Chart.Version }}

{{- end }}

{{/* Generate basic labels */}}
{{- define "mychart.labels" }}labels:generator: helmdate: {{ now | htmlDate }}chart: {{ .Chart.Name }}version: {{ .Chart.Version }}
{{- end }}

如果渲染这个,会得到以下错误:

$ helm install ---dry-run moldy-jaguar ./mychart

Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [unknown object type "nil" in ConfigMap.metadata.labels.chart,unknown object type "nil" in ConfigMap.metadata.labels.version]

$ helm install --dry-run moldy-jaguar ./mychart
Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [unknown object type "nil" in ConfigMap.metadata.labels.chart, unknown object type "nil" in ConfigMap.metadata.labels.version]

要查看渲染了什么,可以用--disable-openapi-validation参数重新执行:helm install --dry-run --disable-openapi-validation moldy-jaguar ./mychart。如果并不是我们想要的:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: modly-jaguar-configmap

  labels:

    generator: helm

    data: 2021-03-06

    chart:

    version:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: moldy-jaguar-configmaplabels:generator: helmdate: 2021-03-06chart:version:

名字和版本号怎么了?没有出现在我们定义的模板中。当一个(使用define创建的)命名模板被渲染时,会接收被template调用传入的内容。在我们的事例中,包含模板如下:

{{- template "mychart.labels" }}

{{- template "mychart.labels" }}

没有内容传入,所以模板中无法用.访问任何内容。但这个很容易解决,只需要传递一个范围给模板:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

  {{- template "mychart.labels" . }}

注意这个在template调用末尾传入的.,我们可以简单传入.Values或.Values.favorite或其他需求的范围。但一定要是顶层范围。

现在我们可以用helm install --dry-run --debug plinking-anaco ./mychart执行模板,然后得到:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: plinking-anaco-configmap

  labels:

    generator: helm

    data: 2021-03-06

    chart: mychart

    version: 0.1.0

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: plinking-anaco-configmaplabels:generator: helmdate: 2021-03-06chart: mychartversion: 0.1.0

现在{{ .Chart.Name }}解析为mychart, {{ .Chart.Version }}解析为0.1.0。

include方法

假设定义了一个简单模板如下:

{{- define "mychart.app" -}}

app_name: {{ .Chart.Name }}

app_version: "{{ .Chart.Version }}"

{{- end -}}

{{- define "mychart.app" -}}
app_name: {{ .Chart.Name }}
app_version: "{{ .Chart.Version }}"
{{- end -}}

现在假设我想把这个插入到模板的labels:部分和data:部分:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ template "mychart.app"" . }}

data:

  myvalues: "Hello World"

data:

  myvalue: "Hello World"

  {{- range $key, $val := .Values.favorite }}

  {{ $key }}: {{ $val | quote }}

{{ template "mychart.app" . }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmaplabels:{{ template "mychart.app" . }}
data:myvalue: "Hello World"{{- range $key, $val := .Values.favorite }}{{ $key }}: {{ $val | quote }}{{- end }}
{{ template "mychart.app" . }}

如果渲染这个,会得到以下错误:

$ helm install --dry-run measly-whippet ./mychart

Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [ValidationError(ConfigMap): unknown field "app_name" in io.k8s.api.core.v1.ConfigMap, ValidationError(ConfigMap): unknown field "app_version" in io.k8s.api.core.v1.ConfigMap]

$ helm install --dry-run measly-whippet ./mychart
Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [ValidationError(ConfigMap): unknown field "app_name" in io.k8s.api.core.v1.ConfigMap, ValidationError(ConfigMap): unknown field "app_version" in io.k8s.api.core.v1.ConfigMap]

要查看渲染了什么,可以用--disable-openapi-validation参数重新执行:helm install --dry-run --disable-openapi-validation measly-whippet ./mychart。输入不是我们想要的:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: measly-whippet-configmap

  labels:

    app_name: mychart

app_version: "0.1.0"

data:

  myvalue: "Hello World"

  drink: "coffee"

  food: "pizza"

app_name: mychart

app_version: "0.1.0"

注意两处的app_version缩进都不对,为啥?因为被替换的模板中文本是左右对齐的。由于template是一个行为,不是方法,无法将template调用的输出传给其他方法,数据只是简单地按行插入。

为了处理这个问题,Helm提供了一个template的可选项,可以将模板内容导入当前管道,然后传递给管道中的其他方法。

下面这个示例,使用indent正确地缩进了mychart.app模板:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

  labels:

{{ include "mchart.app" . | indent 4 }}

data:

  myvalue: "Hello World"

  {{- range $key,$val := .Values.favorite }}

  {{ $key }}: {{ $ val | quote }}

  {{- end }}

{{ include "mychart.app" . | indent 2 }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmaplabels:
{{ include "mychart.app" . | indent 4 }}
data:myvalue: "Hello World"{{- range $key, $val := .Values.favorite }}{{ $key }}: {{ $val | quote }}{{- end }}
{{ include "mychart.app" . | indent 2 }}

现在生成的YAML每一部分都可以正确缩进了:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: edgy-mole-configmap

  labels:

    app_name: mychart

    app_version: "0.1.0"

data:

  myvalue: "Hello World"

  drink: "coffee"

  food: "pizza"

  app_name: mychart

  app_version: "0.1.0"

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: edgy-mole-configmaplabels:app_name: mychartapp_version: "0.1.0"
data:myvalue: "Hello World"drink: "coffee"food: "pizza"app_name: mychartapp_version: "0.1.0"

小贴士:相较于使用template,在helm中使用include被认为是更好的方式 只是为了更好地处理YAML文档的输出格式

有时我们需要导入内容,但不是作为模板,也就是按字面意义导入文件内容,可以通过使用.Files对象访问文件来实现,这将在下一部分展开描述。

————————————

仅用于本人学习

来源:Helm | Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打印斐波那契数列

定义: 斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89……这个数列从第3项开始 ,每一项都等于前两项之和。 …

2402d,d引入新的勾挂降级

原文 我正在试为ArrayLiteralExps添加一个降级模板.它应该调用_d_arrayliteralTX1.我在expressionsem.d中引入了以前的所有降级,并打算通过在此处添加它来同样处理该降级. 但是,ArrayLiteralExps比其他式更挑剔,因为编译器干了许多优化,并最终创建了额外的ArrayLiteralExps或…

各种能源折标准煤参考系数

各种能源折标准煤参考系数Conversion Factors from Physical Units to Coal Equivalent能源名称平均低位发热量折标准煤系数EnergyAverage Low Calorific ValueConversion Factor原煤20 908千焦/(5 000千卡)/千克0.7143千克标准煤/千克Raw Coal20 908 kjoule/(5 000 kcal)/kg0.…

k8s-项目部署案例

一、容器交付流程 在k8s平台部署项目流程 在K8s部署Java网站项目 DockerFile 如果是http访问,需要在镜像仓库配置可信任IP 三、使用工作负载控制器部署镜像 建议至少配置两个标签 一个是声明项目类型的 一个是项目名称的 继续配置属性 资源配额 健康检查 五、使…

GraphicsMagick 的 OpenCL 开发记录(三十四)

文章目录 如何写ScaleImage()的硬件加速函数&#xff08;八&#xff09; <2022-05-05 周四> 如何写ScaleImage()的硬件加速函数&#xff08;八&#xff09; 我觉得Y方向的缩放以下面这种ScaleFilter()的方法是实现不了的&#xff0c;我只能添加进X方向的处理&#xff0…

【集合系列】HashMap 集合

HashMap 集合 1. 概述2. 方法3. 遍历方式4. 代码示例15. 代码示例26. 注意事项 其他集合类 父类 Map 实现类 LinkedHashMap 集合类的遍历方式 具体信息请查看 API 帮助文档 1. 概述 HashMap 是 Java 中的一种集合类&#xff0c;它实现了 Map 接口。HashMap 使用键值对存储数据…

手动汉化unity编辑器,解决下载中文语言报错问题

手动汉化unity编辑器&#xff0c;解决下载中文语言报错问题 START 最近在下载支持微信小程序版本的编辑器时&#xff0c;中文语言包&#xff0c;一直无法下载。记录一下 手动汉化unity编辑器的方法 &#xff0c;帮助和我遇到同样问题的人。 解决方案 1. 下载汉化包 https:…

ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

ubuntu22.04laptop OpenCV Get Started: 005_rotate_and_translate_image 1. 源由2. translate/rotate应用Demo3 translate_image3.1 C应用Demo3.2 Python应用Demo3.3 平移图像过程 4. rotate_image4.1 C应用Demo4.2 Python应用Demo4.3 旋转图像过程 5. 总结6. 参考资料 1. 源由…

unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题

自己这几天用 unity 2021 xcode 14.2 开发ios内购&#xff0c;appstore上面内购商品都已经配置好了&#xff0c;但是在手机里就是不显示&#xff0c;最后才发现必需得满足以下条件才行&#xff1a; 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…

springboot/ssm大学生就业服务平台就业招聘宣传管理系统Java系统

springboot(ssm大学生就业服务平台 就业招聘宣传管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql…

基于 Python 的漏洞扫描系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Web 目录爆破神器:DirBuster 保姆级教程(附链接)

一、介绍 DirBuster 是一个用于强制目录浏览的渗透测试工具&#xff0c;它主要用于在Web应用程序中识别隐藏的目录和文件。这个工具被设计成非常灵活&#xff0c;可以根据用户的需求进行配置。以下是 DirBuster 的一些主要特点和用法&#xff1a; 主要特点&#xff1a; 字典爆…

k8s报错记录(持续更新中....)

k8s报错记录(持续更新中…) 1. 部署k8s遇到kube-flannel已经构建&#xff0c;但是coredns一直处于ContainerCreating和pending状态 解决问题&#xff1a; 通过 kubectl describe pod -n kube-system coredns-7ff77c879f-9ls2b 查看pod的详细信息&#xff0c;报错说是cni 配置没…

主动网络安全:成本效率和危机管理的战略方法

如何面对复杂网络攻击的进攻策略以及零信任模型的作用。攻击后反应性网络安全策略的基本步骤&#xff0c;透明度和准备工作。 讨论采用主动网络安全方法的好处&#xff0c;特别是在成本效率和危机管理方面&#xff0c;进攻性安全测试对合规性和零日响应的影响。 组织应该更多…

Python SimpleHTTPServer - Python HTTP 服务器

Python SimpleHTTPServer Python SimpleHTTPServer 模块是一个非常方便的工具。您可以使用 Python SimpleHTTPServer 将任何目录转换为简单的 HTTP web 服务器。 Python SimpleHTTPServer 仅支持两种 HTTP 方法 - GET 和 HEAD。因此&#xff0c;它是一个很好的工具&#xff0…

周总结2024-02-08

文章目录 周总结&#xff1f;&#xff1f;nono……月总结新年计划 周总结&#xff1f;&#xff1f;nono……月总结 2024年第一个月并没有像之前一样直接写博客发布&#xff0c;其实我是一个及其容易受影响的人&#xff0c;别人提的建议我一般都会在意&#xff0c;主要原因有以…

K8S之Pod常见的状态和重启策略

Pod常见的状态和重启策略 常见的Pod状态PendingPodScheduledUnschedulablePodInitializingImagePullBackOffInitializedRunningErrorCrashLoopBackOffTerminatingSucceededFailedEvictedUnknown Pod的重启策略使用Always重启策略使用Never重启策略使用OnFailure重启策略(常用) …

在Python中读写Kafka队列

在Python中读写Kafka队列通常使用kafka-python库&#xff0c;这是一个非常流行的库&#xff0c;可以让你方便地与Kafka集群进行交互。以下是安装这个库以及基本使用方法的介绍。 安装kafka-python 首先&#xff0c;你需要安装kafka-python包。可以通过pip命令轻松安装&#x…

HttpClient | 支持 HTTP 协议的客户端编程工具包

目录 1、简介 2、应用场景 3、导入 4、API 5、示例 5.1、GET请求 5.2、POST请求 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初…

java实现栈功能

1.使用数组方式 public static void main(String[] args) throws Exception {BufferedReader br new BufferedReader(new InputStreamReader(System.in));int operateNum Integer.parseInt(br.readLine());//操作次数String inputInfo;//输入信息StringBuilder outputSb new…