文章目录
Charts
Charts描述的是一组k8s资源相关的文件集合,用户可以通过简单地修改一些参数使得helm部署的应用符合我们的要求。
Charts 结构
wordpress/
Chart.yaml # 包含了chart信息的YAML文件
LICENSE # 可选: 包含chart许可证的纯文本文件
README.md # 可选: 可读的README文件
values.yaml # chart 默认的配置值
values.schema.json # 可选: 一个使用JSON结构的values.yaml文件
charts/ # 包含chart依赖的其他chart
crds/ # 自定义资源的定义
templates/ # 模板目录, 当和values 结合时,可生成有效的Kubernetes manifest文件
templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件
templates/
目录包括了模板文件。安装应用时,helm会将用户设置的参数值通过模板引擎渲染到模板文件里,然后再将渲染后的结果发送给kubernetes。values.yaml
这个文件包含了chart的 默认值 。这些值会在用户执行helm install
或helm upgrade
时被相应的命令行参数覆盖。Chart.yaml
文件包含了该chart的描述。你可以从模板中访问它。charts/
目录可以包含其他的chart。
Chart.yaml
apiVersion: The chart API version (required)
name: The name of the chart (required)
version: A SemVer 2 version (required)
kubeVersion: A SemVer range of compatible Kubernetes versions (optional)
description: A single-sentence description of this project (optional)
type: The type of the chart (optional)
keywords:
- A list of keywords about this project (optional)
home: The URL of this projects home page (optional)
sources:
- A list of URLs to source code for this project (optional)
dependencies: # A list of the chart requirements (optional)
- name: The name of the chart (nginx)
version: The version of the chart ("1.2.3")
repository: (optional) The repository URL ("https://example.com/charts") or alias ("@repo-name")
condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled )
tags: # (optional)
- Tags can be used to group charts for enabling/disabling together
import-values: # (optional)
- ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items.
alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times
maintainers: # (optional)
- name: The maintainers name (required for each maintainer)
email: The maintainers email (optional for each maintainer)
url: A URL for the maintainer (optional for each maintainer)
icon: A URL to an SVG or PNG image to be used as an icon (optional).
appVersion: The version of the app that this contains (optional). Needn't be SemVer. Quotes recommended.
deprecated: Whether this chart is deprecated (optional, boolean)
annotations:
example: A list of annotations keyed by name (optional).
Chart 类型
type字段定义了chart的类型。有两种类型: application
和 library
。 application
是默认类型,是可以完全操作的标准chart。 库类型 chart 提供针对chart构建的实用程序和功能。 库类型chart与应用类型chart不同,因为它不能安装,通常不包含任何资源对象。
应用类型chart 可以作为库类型chart使用。可以通过将类型设置为 library来实现。 然后这个库就被渲染成了一个库类型chart,所有的实用程序和功能都可以使用。所有的资源对象不会被渲染。
Chart 依赖
Helm 中,chart可能会依赖其他任意个chart。 这些依赖可以使用Chart.yaml文件中的dependencies 字段动态链接,或者被带入到charts/ 目录并手动配置。
dependencies:
- name: apache
version: 1.2.3
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
- name字段是你需要的chart的名称
- version字段是你需要的chart的版本
- repository字段是chart仓库的完整URL。必须使用helm repo add在本地添加仓库
- 你可以使用仓库的名称代替URL
$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
dependencies:
- name: awesomeness
version: 1.0.0
repository: "@fantastic-charts"
一旦你定义好了依赖,运行 helm dependency update 就会使用你的依赖文件下载所有你指定的chart到你的charts/目录。
当 helm dependency update 拉取chart时,会在charts/目录中形成一个chart包。因此对于上面的示例,会在chart目录中期望看到以下文件
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
Templates and Values
Helm Chart 模板是按照 Go 模板语言书写, 增加了50个左右的附加模板函数, 这些函数来自 Sprig 库和一些其他 指定的函数。
所有模板文件存储在chart的 templates/ 文件夹。 当Helm渲染chart时,它会通过模板引擎遍历目录中的每个文件。
模板的Value通过两种方式提供:
- Chart开发者可以在chart中提供一个命名为 values.yaml 的文件。这个文件包含了默认值。
- Chart用户可以提供一个包含了value的YAML文件。可以在命令行使用 helm install命令时提供。
当用户提供自定义value时,这些value会覆盖chart的values.yaml文件中value。
模板文件
模板文件遵守书写Go模板的标准惯例.
示例:
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {
{
.Values.imageRegistry }}/postgres:{
{
.Values.dockerTag }}
imagePullPolicy: {
{
.Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {
{
default "minio" .Values.storage }}
Values文件
针对前面部分的模板,values.yaml文件提供的必要值如下:
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"
然后在模板文件中使用.Values
对象就可以任意访问这些值了
注意:chart包含的默认values文件必须被命名为values.yaml。不过在命令行可以通过-f
指定其他文件。
Hook 机制
Helm 提供了一个 hook 机制允许chart开发者在发布生命周期的某些点进行干预。比如你可以使用hook用于:
- 安装时在加载其他chart之前加载配置映射或密钥
- 安装新chart之前执行备份数据库的任务,然后在升级之后执行第二个任务用于存储数据。
- 在删除发布之前执行一个任务以便在删除服务之前退出滚动。
helm定义了以下hook:
- pre-install 在模板渲染之后,Kubernetes资源创建之前执行
- post-install 在所有资源加载到Kubernetes之后执行
- pre-delete 在Kubernetes删除之前,执行删除请求
- post-delete 在所有的版本资源删除之后执行删除请求
- pre-upgrade 在模板渲染之后,资源更新之前执行一个升级请求
- post-upgrade 所有资源升级之后执行一个升级请求
- pre-rollback 在模板渲染之后,资源回滚之前,执行一个回滚请求
- post-rollback 在所有资源被修改之后执行一个回滚请求
- test 调用Helm test子命令时执行 ( test文档)
示例:
apiVersion: batch/v1
kind: Job
metadata:
name: "some-job"
labels:
app.kubernetes.io/managed-by: {
{
.Release.Service | quote }}
app.kubernetes.io/instance: {
{
.Release.Name | quote }}
app.kubernetes.io/version: {
{
.Chart.AppVersion }}
helm.sh/chart: "{
{ .Chart.Name }}-{
{ .Chart.Version }}"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
# 在所有资源加载到Kubernetes之后执行
"helm.sh/hook": post-install
# 可以为钩子定义权重,这有助于建立一个确定性的执行顺序
"helm.sh/hook-weight": "-5"
# 定义策略来决定何时删除对应的钩子资源
"helm.sh/hook-delete-policy": hook-succeeded
...
此处省略
...
内置对象
Release
Release
对象描述了版本发布本身
- Release.Name: release名称
- Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)
- Release.IsUpgrade: 如果当前操作是升级或回滚的话,该值将被设置为true
- Release.IsInstall: 如果当前操作是安装的话,该值将被设置为true
- Release.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增
- Release.Service: 该service用来渲染当前模板
Values
Values
对象是从values.yaml文件和用户提供的文件传进模板的。默认为空
Chart
Chart.yaml
文件内容。 Chart.yaml
里的所有数据在这里都可以可访问的。比如 {
{ .Chart.Name }}-{
{ .Chart.Version }}
会打印出 mychart-0.1.0
Files
在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。
- Files.Get 通过文件名获取文件的方法。 (.Files.Get config.ini)
- Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
- Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
- Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
- Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
- Files.AsConfig 使用YAML格式返回文件体的方法
Capabilities
- Capabilities.APIVersions 是一个版本列表
- Capabilities.APIVersions.Has $version 说明集群中的版本 (比如,batch/v1) 或是资源 (比如, apps/v1/Deployment) 是否可用
- Capabilities.KubeVersion 和Capabilities.KubeVersion.Version 是Kubernetes的版本号
- Capabilities.KubeVersion.Major Kubernetes的主版本
- Capabilities.KubeVersion.Minor Kubernetes的次版本
- Capabilities.HelmVersion 包含Helm版本详细信息的对象,和 helm version 的输出一致
- Capabilities.HelmVersion.Version 是当前Helm语义格式的版本
- Capabilities.HelmVersion.GitCommit Helm的git sha1值
- Capabilities.HelmVersion.GitTreeState 是Helm git树的状态
- Capabilities.HelmVersion.GoVersion 是使用的Go编译器版本
Template
包含当前被执行的当前模板信息
- Template.Name: 当前模板的命名空间文件路径 (e.g. mychart/templates/mytemplate.yaml)
- Template.BasePath: 当前chart模板目录的路径 (e.g. mychart/templates)