Helm 包含了很多可以在模板中利用的模板函数。包括密码安全、日期、字典、逻辑与流程控制、列表、正则表达式、字符串、类型转换、统一资源定位等17大类的模板函数,本节主要介绍语义版本函数(Semantic Version Functions)、URL函数(URL Functions)、UUID函数(UUID Functions)、k8s函数。
1、逻辑与流程控制函数(Logic and Flow Control)
2、字符串函数(String)
3、类型转换函数(Type Conversion)及正则表达式函数(Regular Expressions)
4、密码安全函数(Cryptographic and Security)及编码函数(Encoding)
5、日期函数(Date)
6、字典函数(Dictionaries)
7、列表函数(Lists)
8、数学计算函数(Math)
9、网络、文件路径及反射函数(Network、File Path、Reflection)
10、语义版本函数(Semantic Versions)、URL函数(URL)、UUID函数(UUID)、k8s和chart函数(Kubernetes and Chart)
1、语义版本函数(Semantic Version Functions)
有些版本结构易于分析和比较。Helm提供了适用于 SemVer 2 版本的函数。包括 semver
和 semverCompare
。
1.1 semver
semver函数将字符串解析为语义版本:
- 语法:
semver .Arg1
$version := semver "1.2.3-alpha.1+123"
如果解析失败,会由一个错误引起模板执行中断。
$version是一个指向Version对象的指针,包含了以下属性:
- $version.Major: 主版本号 (上面的1)
- $version.Minor: 次版本号 (上面的2)
- $version.Patch: 补丁版本号 (上面的3)
- $version.Prerelease: 预发布版本号 (上面的alpha.1)
- $version.Metadata: 构建元数据 (上面的123)
- $version.Original: 原始版本字符串
另外,你可以使用Compare函数比较一个Version和另一个version:
semver "1.4.3" | (semver "1.2.3").Compare
上面会返回 -1。
返回值可以是:
- -1 如果给定的版本大于Compare方法调用的版本
- 1 如果Compare调用的版本更大
- 0 如果版本相同
(注意在语义版本中,Metadata 字段在版本比较时不比较)
templates/semver.yaml 文件内容
semver: {{ semver "1.2.0" }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/semver.yaml
---
# Source: myapp/templates/semver.yaml
semver: 1.2.0
1.2 semverCompare
一个更健壮的比较函数是semverCompare(semver 版本的对比比较)。 SemVer函数使用 semver规划库,由Sprig作者创建。这个版本支持版本范围:
- 语法:
semverCompare .Arg1 .Arg2
- semverCompare “1.2.3” “1.2.3” 检查精确匹配
- semverCompare “~1.2.0” “1.2.3” 检查主要版本和次要版本,且补丁版本第二个版本是 大于等于 第一个。
templates/semverCompare.yaml 文件内容
{{- $semversion := "1.2.0" }}
{{- if semverCompare ">=1.9.0" $semversion }}
api: "v2"
{{- else }}
api: "v1"
{{- end }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/semverCompare.yaml
---
# Source: myapp/templates/semverCompare.yaml
api: "v1"
1.3 基本比较
两个元素的比较。首先,比较字符串是以空格或逗号分隔的。然后以|| (OR)分隔。比如:">= 1.2 < 3.0.0 || >= 4.2.3"
是要比较大于等于1.2且小于等于3.0.0 或者大于等于4.2.3的。
基本比较符有:
=
: 相等!=
: 不相等>
: 大于<
: 小于>=
: 大于等于<=
: 小于等于
1.4 使用预发布版本
预发布版本,对于那些不熟悉它们的人,是用于稳定版本或一般可用版本之前的软件版本。预发布版本的例子包括开发版、 alpha版、beta版,和rc版本。稳定版1.2.3的预发布版本可能是1.2.3-beta.1,按照优先顺序,预发布版本在相关版本之前发布。 比如:
1.2.3-beta.1 < 1.2.3
。
- 根据语义版本指定的预发布版本可能不与对应的发行版本兼容。
- 预发布版本表示版本不稳定且可能不满足其相关正常版本所表示的预期兼容性要求。
使用不带预发布版本比较器约束的语义版本的比较会跳过预发布版本。比如 >=1.2.3
会跳过预发布而>=1.2.3-0
会计算并查找预发布版本。
按照规范,上例中的0作为预发布的版本是因为预发布版本只能包含ASCII字母数字和连字符(以及.分隔符), with . separators),另外排序按照ASCII排序顺序。在ASCII排序中,最小的字符是0(查看 ASCII表)。
理解ASCII排序顺序很重要因为A-Z是在a-z之前,这意味着>=1.2.3-BETA
会返回 1.2.3-alpha。这里并不适合大小写敏感, 因为是按照ASCII排序规范指定顺序。
1.5 连字符范围比较
有多个方法处理范围,首先是连字符范围。像这样:
1.2 - 1.4.5
等同于>= 1.2 <= 1.4.5
2.3.4 - 4.5
等同于>= 2.3.4 <= 4.5
1.6 比较通配符
x, X, 和 *
可用于通配符。适用于所有比较运算符。当使用=运算符时,会返回补丁级别的比较。比如:
1.2.x
相当于>= 1.2.0, < 1.3.0
>= 1.2.x
相当于>= 1.2.0
<= 2.x
相当于< 3
*
相当于>= 0.0.0
1.7 波浪符号范围比较 (补丁版本)
波浪 (~
) 比较运算符是补丁级别范围的比较,在指定次要版本和主要版本变化且没有次要版本时使,比如:
~1.2.3
相当于>= 1.2.3, < 1.3.0
~1
相当于>= 1, < 2
~2.3
相当于>= 2.3, < 2.4
~1.2.x
相当于>= 1.2.0, < 1.3.0
~1.x
相当于>= 1, < 2
1.8 插入符号比较 (主要版本)
插入符(^
)比较运算是主版本级别改变时使用。在1.0.0 发布之前,次要版本充当API稳定级别版本。 当比较主要的API版本更改时,这很有用,比如:
^1.2.3
相当于>= 1.2.3, < 2.0.0
^1.2.x
相当于>= 1.2.0, < 2.0.0
^2.3
相当于>= 2.3, < 3
^2.x
相当于>= 2.0.0, < 3
^0.2.3
相当于>=0.2.3 <0.3.0
^0.2
相当于>=0.2.0 <0.3.0
^0.0.3
相当于>=0.0.3 <0.0.4
^0.0
相当于>=0.0.0 <0.1.0
^0
相当于>=0.0.0 <1.0.0
2、URL函数(URL Functions)
Helm 包含 urlParse
, urlJoin
, 和 urlquery
函数可以用做处理URL。
2.1 urlParse
解析URL的字符串并生成包含URL部分的字典。
- 语法:
urlParse .Arg1
urlParse "http://admin:secret@server.com:8080/api?list=false#anchor"
上述结果为: 包含URL对象的字典:
scheme: 'http'
host: 'server.com:8080'
path: '/api'
query: 'list=false'
opaque: nil
fragment: 'anchor'
userinfo: 'admin:secret'
这是使用Go标准库中的URL包实现的。更多信息,请查看: https://golang.org/pkg/net/url/#URL。
2.2 urlJoin
将一个映射(由urlParse生成的)连接成URL字符串(将 map 中的 信息 组合成一个 url)。
- 语法:
urlJoin .Arg1 .Arg2 .Arg3 ...
urlJoin (dict "fragment" "fragment" "host" "host:80" "path" "/path" "query" "query" "scheme" "http")
上述结果会生成以下字符串:http://host:80/path?query#fragment
templates/urlJoin.yaml 文件内容
urlJoin: |
{{- $UrlMap := dict "scheme" "https" "host" "www.jicki.cn" }}
Url: {{ urlJoin $UrlMap }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/urlJoin.yaml
---
# Source: myapp/templates/urlJoin.yaml
urlJoin: |
Url: https://www.jicki.cn
2.3 urlquery
返回作为参数传入的值的转义版本,这样就可以嵌入到URL的查询部分。
- 语法:
urlquery .Arg1
$var := urlquery "string for query"
templates/urlquery.yaml 文件内容
{{- $password := "https://jicki.cn/abc/" }}
password: {{ $password | urlquery }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/urlquery.yaml
---
# Source: myapp/templates/urlquery.yaml
password: https%3A%2F%2Fjicki.cn%2Fabc%2F
3、UUID函数(UUID Functions)
Helm 可以生成UUID v4 通用唯一ID。
- 语法:
uuidv4
uuidv4
结果为: 一个新的v4类型的UUID(随机生成)。
templates/uuid.yaml 文件内容
uuidv4: {{ uuidv4 }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/uuidv4.yaml
---
# Source: myapp/templates/uuidv4.yaml
uuidv4: 894a3cce-1f72-4535-a4cf-67a563a9e130
4、k8s函数(Kubernetes and Chart Functions)
Helm 包含了用于 Kubernetes的函数,包括 .Capabilities.APIVersions.Has
, Files
, lookup
。
4.1 lookup
lookup 用于在正在运行的集群中查找资源。当和 helm template
命令一起使用时会返回一个空响应。
可以在内置对象的lookup函数查看更多细节。
4.2 .Capabilities.APIVersions.Has
返回API版本或资源是否在集群中可用。
.Capabilities.APIVersions.Has "apps/v1"
.Capabilities.APIVersions.Has "apps/v1/Deployment"
更多信息可查看内置对象文档。
4.3 File Functions
有几个函数能使您能够访问chart中的非特殊文件。比如访问应用配置文件。请查看模板中访问文件。
注意,这里很多函数的文档是来自 Sprig。Sprig是一个适用于Go应用的函数模板库。
评论区