【K8s】Kubernetes 包管理工具之 Helm 语法

前文我们介绍过,Helm Chart 是一个包含 Kubernetes 资源定义文件的集合,通过模板化机制,可以灵活地配置和部署应用程序。本文将继续介绍 Helm Chart 的结构和语法,帮助读者更好地理解和和自定义 Helm Chart。

基本结构

1、结构说明

代码语言:javascript代码运行次数:0运行复制
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 的基本信息,如名称、版本、描述等。

代码语言:javascript代码运行次数:0运行复制
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 }} 等方式引用变量值。

代码语言:javascript代码运行次数:0运行复制
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 实例本身
代码语言:javascript代码运行次数:0运行复制
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 对象:描述了各类配置文件的内容
代码语言:javascript代码运行次数:0运行复制
Values 值有 4 个来源:
1)子 chart 包中的 values.yaml 文件
2)父 chart 包中的 values.yaml 文件
3)-f 或 --values 指定的 YAML 文件
4)--set 指定的键值对参数
  • Files:用于访问非特殊文件
代码语言:javascript代码运行次数:0运行复制
Files.Get                   # 通过文件名获取文件
Files.Lines                 # 逐行读取文件内容
Files.AsSecrets             # 使用 BASE64 编码格式返回文件内容
Files.Glob                  # 按照模式匹配文件名,返回文件列表
Files.AsConfig              # 使用 YAML 格式返回文件内容
  • Capabilities:用于访问 Kubernetes 信息
代码语言:javascript代码运行次数:0运行复制
{{ .Capabilities.KubeVersion }}                    # Kubernetes 版本信息
{{ .Capabilities.APIVersions.Has "batch/v1" }}     # Kubernetes API 版本信息

4、模版函数

用于对传入的参数值进行函数处理。

代码语言:javascript代码运行次数:0运行复制
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 读取的值变成字符串。

代码语言:javascript代码运行次数:0运行复制
k8s: {{ .Values.course.k8s | quote }}

6、控制结构

  • if / else 条件控制
代码语言:javascript代码运行次数:0运行复制
{{- if eq/ne/lt/gt/and/or/not .Values.xxx "参数" }}
xxxx
{{- else if xxxx }}
yyyy
{{- else }}
zzzz
{{- end }}
  • with 指定范围
代码语言:javascript代码运行次数:0运行复制
{{- with .Values.course }}
k8s: {{ .k8s | upper | quote }}
python: {{ .python | repeat 3 | quote }}
release: {{ .Release.Name }}
{{- end}}
  • range 循环控制
代码语言:javascript代码运行次数:0运行复制
# 第一种方式
## 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、模版变量

代码语言:javascript代码运行次数:0运行复制
{{- $releaseName := .Release.Name }}