本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
[2、Chart.yaml 示例](#2、Chart.yaml 示例)
[3、values.yaml 示例](#3、values.yaml 示例)
[4、templates/ 目录](#4、templates/ 目录)
[5、charts/ 目录](#5、charts/ 目录)
一、写在前边
前文我们介绍过,Helm Chart 是一个包含 Kubernetes 资源定义文件的集合,通过模板化机制,可以灵活地配置和部署应用程序。本文将继续介绍 Helm Chart 的结构和语法,帮助读者更好地理解和和自定义 Helm Chart。
二、基本结构
1、结构说明
bash
helm create mychart # 创建一个 Chart 包
tree mychart # 查看 Chart 包结构
mychart/
├── charts # 依赖的 Chart 目录(子 Chart)
├── Chart.yaml # Chart 的元数据文件
├── templates # 默认的配置文件
│ ├── deployment.yaml # Deployment 对象模板
│ ├── _helpers.tpl # 辅助模板,用于定义可重用的模板片段
│ ├── hpa.yaml # HPA 对象模版
│ ├── ingress.yaml # Ingress 对象模版
│ ├── NOTES.txt # 编写 Chart 包的使用方法,可以和模版一样使用所有函数和对象
│ ├── serviceaccount.yaml # SA 对象模版
│ ├── service.yaml # Service 对象模板
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 模板文件目录
2、Chart.yaml 示例
Chart.yaml
是 Helm Chart 的元数据文件,定义了 Chart 的基本信息,如名称、版本、描述等。
bash
apiVersion: v2 # Chart API 版本,必须
name: mychart # Chart 名称,必须
version: 0.1.0 # Chart 版本,必须
description: xxx # Chart 描述,可选
appVersion: "1.0" # 应用程序版本,可选
3、values.yaml 示例
values.yaml 是 Helm Chart 的默认的配置文件,定义了模板中使用的变量值。在模板文件中,可以通过 {``{ .Values.replicaCount }}
等方式引用变量值。
bash
replicaCount: 1
image:
repository: nginx
tag: "1.19"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
4、templates/ 目录
templates/ 目录包含了 Kubernetes 资源的模板文件,Helm 会使用配置文件,将模板渲染后生成实际的 Kubernetes 资源清单。
5、charts/ 目录
charts/ 目录用于存放依赖的 Chart,即子 Chart。用户可以通过 helm dependency 命令管理这些依赖。
三、模版语法
1、模版指令
- {{ }} 之中的内容叫做模板指令
- {{ 非模版指令的数据 }} 转义方法:{{`{{ 非模版指令的数据 }}`}}
2、注释方法
- values.yaml 文件中使用 # 号进行注释
- templates/ 目录下的模版文件使用 {{/* xxx */}} 进行注释
3、内置对象
- Release 对象:描述了 Release 实例本身
bash
Release.Name # Release 的名称
Release.Time # Release 的时间
Release.Namespace # Release 的命名空间
Release.Service # Release 服务的名称
Release.Revision # Release 的修订版本号,从 1 开始累加
Release.IsUpgrade # 如果当前操作是升级或回滚,则将其设置为 true
Release.IsInstall # 如果当前操作是安装,则设置为 true
- Chart 对象:描述了 Chart.yaml 文件的内容
- Values 对象:描述了各类配置文件的内容
bash
Values 值有 4 个来源:
1)子 chart 包中的 values.yaml 文件
2)父 chart 包中的 values.yaml 文件
3)-f 或 --values 指定的 YAML 文件
4)--set 指定的键值对参数
- Files:用于访问非特殊文件
bash
Files.Get # 通过文件名获取文件
Files.Lines # 逐行读取文件内容
Files.AsSecrets # 使用 BASE64 编码格式返回文件内容
Files.Glob # 按照模式匹配文件名,返回文件列表
Files.AsConfig # 使用 YAML 格式返回文件内容
- Capabilities:用于访问 Kubernetes 信息
bash
{{ .Capabilities.KubeVersion }} # Kubernetes 版本信息
{{ .Capabilities.APIVersions.Has "batch/v1" }} # Kubernetes API 版本信息
4、模版函数
用于对传入的参数值进行函数处理。
bash
quote # 将从 .Values 读取的值变成字符串(自动添加双引号"")
squote # 将从 .Values 读取的值变成字符串(自动添加单引号'')
title # 将从 .Values 读取的值首字母变成大写字母
upper # 将从 .Values 读取的值变成大写字母
lower # 将从 .Values 读取的值变成小写字母
empty # 判断从 .Values 读取的值是否为空
repeat N # 将从 .Values 读取的值复制 N 次
indent N # 将从 .Values 读取的值缩进 N 个空格
nindent N # 将从 .Values 读取的值 换行 + 缩进 N个空格
default "xxx" # 定义默认值,以防从 .Values 读取的值不存在
split "/" # 将从 .Values 读取的值进行分割
toYaml # 将从 .Values 读取的值(List 类型)变成 YAML 格式
b64enc # 将从 .Values 读取的值进行 BASE64 编码
b64dec # 将从 .Values 读取的值进行 BASE64 解码
print # 返回各部分组合的字符串,非字符串类型会被转换成字符串
printf # 返回参数按顺序传递的格式化字符串
trim # 从字符串中移除首尾两边的空格
trimAll # 从字符串中移除给定的字符
contains # 测试字符串是否包含在另一个字符串中
cat # 将多个字符串合并成一个,用空格分隔
tpl # 将从 .Values 读取的模版指令进行渲染
5、管道
类似于 Linux 中的管道|,例如通过管道使用 quote 函数将从 .Values 读取的值变成字符串
bash
k8s: {{ .Values.course.k8s | quote }}
6、控制结构
- if / else 条件控制
bash
{{- if eq/ne/lt/gt/and/or/not .Values.xxx "参数" }}
xxxx
{{- else if xxxx }}
yyyy
{{- else }}
zzzz
{{- end }}
- with 指定范围
bash
{{- with .Values.course }}
k8s: {{ .k8s | upper | quote }}
python: {{ .python | repeat 3 | quote }}
release: {{ .Release.Name }}
{{- end}}
- range 循环控制
bash
# 第一种方式
## values.yaml 文件中
env:
enable: true
items:
name1: value1
name2: value2
## templates/deployment.yaml 文件中
containers:
- name: xxx
...
{{- if .Values.env.enable }}
env:
{{- range $name,$value := .Values.env.iterms }} # $name,$value 是模版变量
- name: {{ $name }}
value: {{ $value | quote }}
{{- end }}
{{- end }}
=================================================================================
# 第二种方式:
## values.yaml 文件中:
env:
- name: xxx1
value: xxx1
- name: xxx2
value: xxx2
## templates/deployment.yaml 文件中:
containers:
- name: xxx
...
env:
{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
7、模版变量
bash
{{- $releaseName := .Release.Name }}
🔔 := 叫做海象运算符
# 示例一
{{- $service := (.Template.Name | split "/")._2 }}
• .Template.Name|split "/": 使用 split 函数将 .Template.Name 按 "/" 分割成列表
• ._2: 从分割后的列表中取出第二个元素
# 示例二
{{- $config := index .Values.config $service }}
• index .Values.config $service: 从 .Values.config 中获取与 $service 对应的值
8、命名模版
- 模版名称是全局的,通常在 _helpers.tpl 文件中定义
- 在创建 Chart 包时,templates/ 目录下面默认会生成一个 _helpers.tpl 文件
- templates/ 目录下 NOTE.txt 文件和 _ 开头的文件(即 partials 文件)不会被识别为资源清单文件
- _ 开头的文件可以被 Chart 包中的其他文件调用
- define:声明命名模版
bash
{{/* 生成基本的labels标签 */ }}
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
- template:导入命名模版
bash
{{- template "mychart.labels" }}
- include:导入命名模版,并通过 indent 函数控制缩进
bash
{{- include "mychart.labels" | indent 2 }}
- template 与 include 的区别:
- template 是一个动作,后面无法使用管道,数据属性是内联的,无缩进
- include 是一个函数,后面可以使用管道,可以利用 indent 函数实现缩进
9、锚点(Anchor)和锚点别名
bash
# 锚点定义
anchors:
pod_template: &pod_template
apiVersion: v1
kind: Pod
metadata:
labels:
app: demo
...
# 锚点别名引用
apiVersion: v1
kind: Pod
metadata:
name: demo_pod
<<: *pod_template
...