简述
Helm是Kubernetes的包管理工具,类似于操作系统中的yum,apt-get。Helm提供应用的编排部署、升级、卸载等管理操作。
快速开始
在开始之前,我们简单理解一下Helm template的基本原理。其实也很简单,Helm使用gotemplate模板语言来编写代表Kubernetes资源(deployment,service, etc…)的模板文件,并提供让用户配置这些模板变量的能力。在部署时Helm通过模板引擎将模板渲染成真正的Kubernetes资源文件,并将它们部署到节点上。
创建Helm包
目录结构
自动生成的模板目录结构如下:
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: # 配置部署时执行的任务 ...
|
服务部署流程
- 执行
helm install
后,helm 模板语言(go template)会将 values.yaml
中的值渲染进 templates
目录下的所有文件,并将除 NOTES.txt 及 _开头的文件以外的其余文件发送给 Kubernetes 处理。
- Kubernetes 会将所有渲染好的 yaml文件统一创建出来。
- 创建的流程控制,如先创建数据库、rabbitmq等信息,然后启动服务,是通过
Daemonset、Deployment、StatefulSet
中的 initContainers
部分控制,initContainers
会优先启动 kubernetes_entrypoint_init_container
,根据 values.yaml
文件中 dependencies
配置的依赖信息,决定是否开始运行。
- 运行流程:存储文件和Job类任务优先运行,Completed状态之后,开始运行服务类Pod。
参考文档