简述

Helm是Kubernetes的包管理工具,类似于操作系统中的yum,apt-get。Helm提供应用的编排部署、升级、卸载等管理操作。

快速开始

在开始之前,我们简单理解一下Helm template的基本原理。其实也很简单,Helm使用gotemplate模板语言来编写代表Kubernetes资源(deployment,service, etc…)的模板文件,并提供让用户配置这些模板变量的能力。在部署时Helm通过模板引擎将模板渲染成真正的Kubernetes资源文件,并将它们部署到节点上。

创建Helm包

1
helm create myapp

目录结构

自动生成的模板目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
myapp
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│   └── test-connection.yaml
└── values.yaml
  • templates/ 目录下是模板文件,当Helm需要生成chart的时,会渲染该目录下的模板文件,将渲染结果发送给kubernetes。
  • charts/ 目录是存放依赖的子包名称。
  • Chart.yaml 文件保存chart的基本描述信息,这些描述信息也可以在模板中被引用。
  • values.yaml 文件保存模板的默认值,用户可以在helm install 或者 helm upgrade可以指定新的值来覆盖默认值。
  • _helper.tpl 下划线开头的文件,helm视为公共库定义文件,主要用于定义通用的子模版、函数等,helm不会将这些公共库文件的渲染结果提交给k8s处理。
  • NOTES.txt chart包的帮助信息文件,执行helm install命令安装成功后会输出这个文件的内容。

常用操作

v3版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 部署Helm包
helm install myapp ./myapp

# 升级Helm包
helm upgrade myapp ./myapp

# 查看部署的Helm包
helm list -A

# 卸载Helm包
helm uninstall myapp

# 验证chart是否遵循最佳实践
helm lint

# 测试helm包渲染,不真正部署,只返回渲染结果
helm install --dry-run --debug

# 查看已部署的helm包渲染结果
helm get manifest <NAME>

开发基础

详细文档参考Helm中文文档:chart模板开发指南

STX-OpenStack Helm包解析

目录结构

cyborg 组件Helm包为例,讲解各目录及文件的用途。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cyborg
├── .helmignore # Building Packages时忽略内容
├── Chart.yaml # Helm包基础描述信息。包含包名、版本、描述、维护人员信息等
├── charts # Helm包依赖的工具包。推荐通过requirements.yaml文件维护
├── templates # Helm包模板文件目录。_开头的文件Helm不会提交Kubernetes处理。
│   └── bin # 存放安装过程用到的可执行文件。
│      ├── _cyborg-agent-init.sh.tpl # 服务启动前进行预处理
│      ├── _cyborg-agent.sh.tpl # 每个服务启动关闭均通过调用可执行文件的start、stop方法执行
│      ├── _cyborg-api.sh.tpl
│      ├── _cyborg-conductor.sh.tpl
│      └── _db-sync.sh.tpl # 同步DB脚本
│   ├── configmap-bin.yaml # 创建Kubernetes存储资源,存放可执行文件
│   ├── configmap-etc.yaml # 创建Kubernetes存储资源,存放配置文件
│   ├── daemonset-agent.yaml # cyborg服务,主要通过Daemonset、Deployment、StatefulSet维护Pod
│   ├── deployment-api.yaml
│   ├── deployment-conductor.yaml
│   ├── ingress-api.yaml # kubernetes Ingress。创建域名,映射至service。
│   ├── job-db-drop.yaml # 任务:删除DB,默认不执行
│   ├── job-db-init.yaml # 任务:初始化DB
│   ├── job-db-sync.yaml # 任务:同步DB
│   ├── job-image-repo-sync.yaml # 任务:同步需要的镜像资源
│   ├── job-ks-endpoints.yaml # 任务:创建keystone endpoint
│   ├── job-ks-service.yaml # 任务:创建keystone service
│   ├── job-ks-user.yaml # 任务:创建keystone user
│   ├── job-rabbit-init.yaml # 任务:初始化rabbitmq
│   ├── secret-db.yaml # 保存DB连接信息,包含admin、cyborg用户
│   ├── secret-ingress-tls.yaml # 保存tls证书
│   ├── secret-keystone.yaml # 保存keystone认证信息,包含admin、cyborg用户
│   ├── secret-rabbitmq.yaml # 保存rabbitmq连接信息,包含admin、cyborg用户
│   ├── service-api.yaml # kubernetes service,与Pod内部做映射,集群内部可访问
│   └── service-ingress-api.yaml # kubernetes service,与Pod内部做映射,集群内外部均可访问
├── requirements.yaml # 依赖的工具包信息。推荐通过该文件维护,需指定依赖的Helm包名称、位置、版本
└── values.yaml # Helm基础变量文件。Helm通过模板语言把values.yaml中的变量渲染至templates目录中,生成指定的Kubernetes yaml文件

values.yaml 解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
labels:                                  # 配置各个Pod调度所需要匹配的标签值
...
images: # 配置cyborg及基础Pod需要的Docker image信息
...
conf: # 配置cyborg组件的配置文件
...
network: # 配置Kubernetes网络
...
dependencies: # 配置Pod启动流程依赖关系,控制部署流程
...
secrets: # 配置cyborg组件创建的Kubernetes secrets名称
...
endpoints: # 配置连接信息。包括DB、rabbitmq、memcached、keystone、cyborg及依赖的组件
...
pod: # 配置Pod生命流程管理信息,包括安全、亲和性、挂载卷、副本数、资源限制等
...
manifests: # 配置部署时执行的任务
...

服务部署流程

  1. 执行 helm install 后,helm 模板语言(go template)会将 values.yaml 中的值渲染进 templates 目录下的所有文件,并将除 NOTES.txt 及 _开头的文件以外的其余文件发送给 Kubernetes 处理。
  2. Kubernetes 会将所有渲染好的 yaml文件统一创建出来。
  3. 创建的流程控制,如先创建数据库、rabbitmq等信息,然后启动服务,是通过 Daemonset、Deployment、StatefulSet 中的 initContainers 部分控制,initContainers 会优先启动 kubernetes_entrypoint_init_container ,根据 values.yaml 文件中 dependencies 配置的依赖信息,决定是否开始运行。
  4. 运行流程:存储文件和Job类任务优先运行,Completed状态之后,开始运行服务类Pod。

参考文档