【K8s】专题十六(3):Kubernetes 包管理工具之 Helm 语法

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【K8s】专题十六(2):Kubernetes 包管理工具之 Helm 使用


目录

一、写在前边

二、基本结构

1、结构说明

[2、Chart.yaml 示例](#2、Chart.yaml 示例)

[3、values.yaml 示例](#3、values.yaml 示例)

[4、templates/ 目录](#4、templates/ 目录)

[5、charts/ 目录](#5、charts/ 目录)

三、模版语法

1、模版指令

2、注释方法

3、内置对象

4、模版函数

5、管道

6、控制结构

7、模版变量

8、命名模版

9、锚点(Anchor)和锚点别名


一、写在前边

前文我们介绍过,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
...
相关推荐
Sans_39 分钟前
初识Docker-Compose(包含示例)
后端·docker·容器
孔令飞1 小时前
04 | 初始化 fastgo 项目仓库
开发语言·ai·云原生·golang·kubernetes
TechStack 创行者2 小时前
Docker+Flask 实战:打造高并发微服务架构
运维·docker·微服务·容器·架构
Sirius Wu2 小时前
三级缓存架构
容器·kubernetes·embedding
容器魔方2 小时前
KubeEdge边缘设备管理系列(四):Mapper-Framework视频流处理
云原生·容器·云计算
a_j583 小时前
k8s面试题总结(十四)
docker·容器·kubernetes
桂月二二4 小时前
云原生Serverless平台:无服务器计算的架构革命
云原生·架构·serverless
weixin_307779134 小时前
Azure云生态系统详解:核心服务、混合架构与云原生概念
云原生·数据库架构·azure
DevSecOps选型指南4 小时前
2025软件供应链安全案例︱证券行业云原生DevSecOps敏捷安全实践
安全·云原生·代码审计·开发安全·软件供应链安全厂商