Helm是由Deis发起的一个开源工具,有助于简化部署和管理Kubernetes应用。

基本概念

Helm可以理解为Kubernetes的包管理工具,可以方便地发现、共享和使用Kubernetes构建的应用。包含如下概念:

  • Chart: 一个helm包,包含一个应用运行所需的镜像、依赖以及k8s资源编排等定义,类似yum的rpm文件。
  • Release: 在k8s上运行的一个chart实例。每次安装chart都会创建一个新的release。
  • Repository: 用于发布和存储Chart仓库。

基本组件

  • Helm CLI: helm客户端,可以在本地执行
  • Tiller: 服务器端组件,运行在k8s上,管理k8s应用程序生命周期
  • Repository: chart仓库,helm cli通过http协议访问chart仓库中的索引文件和压缩包

helm命令

通过helm cli能够实现k8s应用的管理操作。顶级options:

1
2
3
4
5
6
7
--debug: 打开日志显示
--home string: helm配置路径,默认为~/.helm
--host string: tiller地址,覆盖 $HELM_HOST
--kube-context string: 指定使用的kubeconfig上下文
--kubeconfig string: 指定kubeconfig的绝对路径
--tiller-connection-timeout int: helm和tiller建立连接超时,单位s,默认300
--tiller-namespace: tiller命名空间,默认为kube-system

应用仓库

添加、展示、移除、更新和索引应用仓库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加一个chart仓库
helm repo add [flags] [NAME] [URL]

# 给定包含chart包的目录生成索引文件
helm repo index [flags] [DIR]

# 列出已有的仓库
helm repo list [flags]

# 移除指定仓库
helm repo remove [flags] [NAME]

# 更新每个chart仓库的最新信息缓存到本地,供helm search检测仓库中的chart使用
helm repo update [flags]

检索应用

1
2
# 在管理的所有仓库中检索应用
helm search [keyword] [flags]

创建应用

1
2
3
4
5
6
7
8
9
10
11
12
# 在指定目录中创建应用
helm create [/dir/]chartname [flags]

mycharts/
Chart.yaml #描述关于chart的信息
LICENSE #可选项, 描述chart的license
README.md #可选项,可读性高的介绍文档
requirements.yaml #可选项,列出chart的依赖
values.yaml #chart的默认配置
charts/ #存放chart依赖的其他chart包
templates/ #模板目录,基于values.yaml生成有效的k8s清单文件
template/NOTES.txt #可选项,描述简短用法说明。

应用依赖

通过编辑mycharts/requirements.yaml,声明依赖的子应用。

1
2
3
4
5
6
7
dependencies:
- name: apache #chart的名称
version: 1.2.3 # chart的版本
repository: http://example.com/charts #chart的仓库url
- name: mysql
version: 3.2.1
repository: http://another.example/charts

1
2
3
4
5
6
7
8
9
10
# 根据requirements.yaml配置,将依赖的应用包从仓库中拉取到charts目录,移除旧的
# 同时会生成requirements.lock
helm dependency update [flags] CHART

# 基于requirements.lock,重新构建charts中的应用
# 如果没有lock文件,类似update操作
helm dependency build [flags] CHART

# 展示应用依赖的所有子应用包
helm dependency list [flags] CHART

应用归档

把chart应用打包成归档文件

1
2
3
4
5
6
7
8
9
10
11
helm package [flags] [ChART-PATH] [...]

--app-version string: 打包时设置chart的appVersion
--version string: 打包时设置chart的version
--dependency-update: 打包时更新依赖
--destination string: 指定打包应用存放的目录
--save: 保存打包应用放在本地仓库,默认为true

--sign: 开启pgp私钥签名打包的应用 使用sign时,指定签名要使用的密钥名称和公钥环路径
--key string
--keyring string

应用检测

检测chart应用开发完成后,潜在的问题

1
2
3
4
5
# 验证指定路径下的应用格式是否正确
helm lint [flags] PATH

# 打印应用的Chart.yaml READEME values.yaml中的内容
helm inspect [chart | readme | values] CHARTNAME

应用安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 验证应用包是否为可信任方提供的
helm verify [flags] PATH
--keyring: 指定公钥环路径

# chart支持:
# reponame/chartname
# path/xxx.tgz
# repo-url/xx.tgz
helm install [CHART] [flags]
helm install --repo repourl chartname

# 额外指定配置,覆盖values.yaml
helm install -f myvalues.yaml CHART

# 配置级别覆盖
helm install --set k1=v1,k2=v2 CHART

# 正式安装前的调试,检查release生成的manifests是否正确
helm install CHART --dry-run --debug

# 将指定版本的chart应用安装到指定的命名空间下
# 安装前:verify验证是否有有效来源文件,dep-up更新依赖
# name为release默认自动生成,version默认为latest,namespace默认为default
helm install chart --verfiy --dep-up --name string --repo string --version string --namespace string

release查看

1
2
3
4
helm get [flags] RELEASE-NAME

#下载指定release的所有钩子、配置清单、noteh和values文件
helm get hooks[ manifest | notes | values ] releasename

release测试

1
2
3
4
# 为release运行测试命令
helm test [RELEASE] [flags]
--cleanup: 完成删除测试pod
--parallel: 并行运行测试pod

release状态

1
2
3
# 查看release的运行状态
helm status [flags] RELEASE-NAME
--output string: 状态信息输出格式,json or yaml

release升级

1
2
3
4
helm upgrade [RELEASE] [CHAR] [flags]

--version string: 选用指定版本的chart来升级release
--set k1=v1,k2=v2: 升级时,覆盖values.yaml中的部分值

release回滚

1
2
# 将release回滚到指定版本
helm rollback [flags] [RELEASE] [REVISION]

release卸载

1
2
3
helm delete [flags] RELEASE-NAME [...]

--purge: 清理干净,使得release可以重用

查看所有release

1
2
3
4
5
6
7
8
9
10
11
12
13
helm list [flags] [FILTER]

--chart-name: 根据应用名称排序
--date: 按安装时间排序
--deleted: 显示删除的release
--deleting: 显示正在删除中的
--deployed: 显示部署的
--failed: 显示失败的
--pending: 显示挂起的

--namespace string: 指定命名空间

helm list 'ara[a-z]+': 支持release name正则的过滤