helm实战·chart配置
目录
- helm实战系列·制作chart包
- helm命令行参数
- Chart.yaml文件
- 这里主要针对dependencies讲解,使用dependencies可以引入依赖的chart,以前文中wordpress-demo为例
- repository可以是仓库地址,也可以已经添加的仓库的名字(通过helm repo add添加)
- 当执行helm dependency update时,会将依赖的chart包下载到charts/目录下,依赖名字不能以_和.开头,不然不会被chart加载器加载依赖中的tag和condition字段,用于评估chart是否加载,condition优先级高于tag。
- 上面展示来看,带有tag为front-end会被禁用,subchart1.enabled会覆盖tag的逻辑,所以subchart1会启用。subchart2由于subchart2.enabled没有值,且带有back-end标签,所以也会启用。
- 父chart中Chart.yaml可以通过import-values导入子chart中values.yaml通过export导出的变量,通过helm get values可以看到父chart的values值中存在myint=99。
- 模板文件
helm实战系列·制作chart包
helm命令行参数
前文《制作chart包》安装过程中有提到了--set设置参数的方式, 还有通过--values/-f制定yaml文件, 如果在命令行中出现了多个文件, 最右的文件有效。其中--set的优先级高,会被合并到--values和chart包的values.yaml文件中,通过helm get values可以看到Release当前版本values参数
helm get values hello-helm -n helm-demo
USER-SUPPLIED VALUES:
null
同时使用helm upgrade指定--reset-values也会清除前次的--set的值。由于--set设置的复杂的值,例如
$ --set servers[0].port=80,servers[0].host=example
servers:
- port: 80
host: example
$ --set name={a, b, c}
name:
- a
- b
- c
$ --set a=b,c=d
a: b
c: d
$--set name=value1\,value2 使用\转义
name: "value1,value2"
$--set nodeSelector."kubernetes\.io/role"=master 这里使用到了toYaml函数
nodeSelector:
kubernetes.io/role: master
更加复杂的数据结构尽量不要使用--set来表达,一是容易出错,二是可读性差。针对情况在设计values.yaml时尽量不要使用复杂的数据结构。
##values.yaml配置
Helm使用了Go模板构建模板,除了有Sprig库 (“env”和“expandenv”由于安全原因去除),额外添加了includ和required方法。
value: {{ include "mytpl" . | lower | quote }}
#添加mytpl模板,转为小写,双引号括起来,一般字符串需要括起来,数字不用
备注:{{}}表示模板逻辑
value: {{ required "A valid .Values.who entry required!" .Values.who }}
# 从.Values.who获取值,如果为空打印错误信心
使用tpl方法,可以在模板中使用字符串作为模板,将模板字符串作为值传递给chart或渲染额外文件时有用,{{ tpl TEMPLATE_STRING VALUES }}
1.传递给chart
# values
template: "{{ .Values.name }}"
name: "Tom"
# template
{{ tpl .Values.template . }}
# output
Tom
2.渲染额外文件
# external configuration file conf/app.conf
firstName={{ .Values.firstName }}
lastName={{ .Values.lastName }}
# values
firstName: Peter
lastName: Parker
# template
{{ tpl (.Files.Get "conf/app.conf") . }}
# output
firstName=Peter
lastName=Parker
Chart.yaml文件
Chart.yaml文件必须的,从 v3.3.2,不再允许额外的字段。推荐的方法是在 annotations
中添加自定义元数据。有以下字段:
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
- 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
- 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
- name: chart名称 (nginx)
version: chart版本 ("1.2.3")
repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
tags: # (可选)
- 用于一次启用/禁用 一组chart的tag
import-values: # (可选)
- ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
- name: 维护者名字 (每个维护者都需要)
email: 维护者邮箱 (每个维护者可选)
url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
example: 按名称输入的批注列表 (可选).
这里主要针对dependencies讲解,使用dependencies可以引入依赖的chart,以前文中wordpress-demo为例
dependencies:
- condition: memcached.enabled
name: memcached
repository: https://charts.bitnami.com/bitnami
version: 6.x.x
- condition: mariadb.enabled
name: mariadb
repository: https://charts.bitnami.com/bitnami
version: 10.x.x
- name: common
repository: "@bitnami"
tags:
- bitnami-common
version: 1.x.x
repository可以是仓库地址,也可以已经添加的仓库的名字(通过helm repo add添加)
当执行helm dependency update时,会将依赖的chart包下载到charts/目录下,依赖名字不能以_和.开头,不然不会被chart加载器加载依赖中的tag和condition字段,用于评估chart是否加载,condition优先级高于tag。
# parentchart/Chart.yaml
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
上面展示来看,带有tag为front-end会被禁用,subchart1.enabled会覆盖tag的逻辑,所以subchart1会启用。subchart2由于subchart2.enabled没有值,且带有back-end标签,所以也会启用。
通过依赖导入字Value
# parent's Chart.yaml file
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data
# child's values.yaml file
exports:
data:
myint: 99
# parent's values
myint: 99
父chart中Chart.yaml可以通过import-values导入子chart中values.yaml通过export导出的变量,通过helm get values可以看到父chart的values值中存在myint=99。
事例2
# parent's Chart.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
# parent's values.yaml file
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
# subchart1's values.yaml file
default:
data:
myint: 999
mybool: true
# parent's final values
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
#由代码可以看出,父Chart.yaml中使用import-values字段通过子-父形式将父myimports对应的值给覆盖了,最终父Chart的values得到一个合并之后的值。
模板文件
上文也提到了helm使用了Go的模板渲染,所有的模板文件来自templates/,helm渲染Chart时,模板引擎会渲染templates/所有的文件,模板的值来自values.yaml。可以是chart包中的values.yaml,也可以是helm install -f values.yaml指定一个外部文件进行覆盖。
Values
是values.yaml文件或者helm install --set a=b
设置的变量,模板中也可以使用预定义的变量。
以下是预定义值,可以覆盖,区分大小写。
Release.Name
: 版本名称(非chart的)
Release.Namespace
: 发布的chart版本的命名空间,helm install -n helm-demo
-n 可以设置namespace
Release.Service
: 组织版本的服务
Release.IsUpgrade
: 如果当前操作是升级或回滚,设置为true
Release.IsInstall
: 如果当前操作是安装,设置为true
Chart
: Chart.yaml
的内容。因此,chart的版本可以从 Chart.Version
获得, 并且维护者在Chart.Maintainers
里。
Files
: chart中的包含了非特殊文件的类图对象。这将不允许您访问模板, 但是可以访问现有的其他文件(除非被.helmignore
排除在外)。使用{{ index .Files "file.name" }}
可以访问文件或者使用{{.Files.Get name }}
功能。您也可以使用{{ .Files.GetBytes }}
作为[]byte
访问文件内容。
Capabilities
: 包含了Kubernetes版本信息的类图对象。({{ .Capabilities.KubeVersion }}
) 和支持的Kubernetes API 版本({{ .Capabilities.APIVersions.Has "batch/v1" }}
)
Chart.yaml文件未知字段不会被解析,需要传值可以使用values.yaml
Values文件必要值
imageRegistry: "quay.io/deis" #镜像
dockerTag: "latest" #镜像tag
pullPolicy: "Always" #更新策略
storage: "s3" #存储
值的范围
values.yaml
文件里面可以访问子chart的值,以前文演示wordpress-demo为例,有依赖mysql和apache
title: "My WordPress Site" # Sent to the WordPress template
mysql:
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
#在父Chart的模板里面可以使用.Values.mysql.password访问,子Chart的模板不能访问title变量和apache.port变量
全局变量
title: "My WordPress Site" # Sent to the WordPress template
global:
app: MyWordPress
mysql:
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
helm2中已添加了全局变量,对于子Chart如mysql可以通过.Values.global.app访问
实际上经过渲染,最终的values.yaml文件如下:
title: "My WordPress Site" # Sent to the WordPress template
global:
app: MyWordPress
mysql:
global:
app: MyWordPress
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
global:
app: MyWordPress
port: 8080 # Passed to Apache
#可以看到会在子Chart中生成对应的global.app,另外某个子Chart如果声明过全局变量,不会透传到父模块,同时父chart的全局变量优先级高于子Chart。
架构文件
#values.schema.json用于描述values.yaml的结构,在执行helm安装,升级,校验等命令时会作为校验依据。本质上是用于校验Values对象的合法性。