什么是Helm
简单来说就是Kubernetes的包管理工具,类似于Centos的yum或Ubuntu的apt。不过他管理的是Kubernetes的yaml文件
组件(2.0与3.0)
在2.0的时候区分为客户端与服务端
客户端:
- 本地chart的编写
- 仓库的管理
- 与服务端Tiller交互
- 发送chart安装
- 关系chart版本信息获取
- 升级或者卸载安装的chart
服务端:
负责与helm客户端交互,并且与Kubernetes的api server通信
- 监听客户端发送的请求
- 合并chart与配置文件,构建release
- 安装chart到Kubernetes集群,跟进后续版本
- 通过与Kubernetes交互升级或者卸载chart
架构图2.0:
在3.0的时候就没有服务端,客户端功能与上面一样。但是服务端变为了helm库,它有接口直接与Kubernetes通信,而服务端的功能也转移到了它的身上。
架构图3.0:
使用Helm,需要一个Kubernetes集群。对于Helm的最新版本,我们建议使用Kubernetes的最新稳定版, 在大多数情况下,它是倒数第二个次版本。
三大概念
Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。
Repository(仓库) 是用来存放和共享 charts 的地方。它就像 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。
Release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的release。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该chart两次。每一个数据库都会拥有它自己的release 和 release name。
在了解了上述这些概念以后,就可以这样来解释 Helm:
Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
常用命令
helm [options] [release name]
helm search 检索chart包
helm fetch/pull 拉去chart包 --untar 下载直接解压缩 --untardir 下载指定目录解压缩
helm delete 删除版本
helm delete --purge 接触安装这个参数好像在3中没有了
helm upgrade 更新release
helm uninstall 卸载chart包
helm install 安装chart包
helm rollback 回滚release --recreate-pods配合这个参数能达成删除更新的效果
helm create 创建chart
helm repo add/list/remove/update helm仓库添加/列出/移除/更新
helm history 查看release安装历史版本
helm list/ls 查看安装的release
helm status 查看安装release状态
helm show/inspect all/chart/readme/values 查看参数信息(可重定向到文件中)
helm get all/manifest/notes/values 查看安装的release相关信息
helm package 打包chart
helm lint 检索打包chart的错误
helm dependency 管理chart依赖
helm completion 命令补全类似于kubernetes的那种需要先安装
安装方法:
在线安装
helm install --namespace test url
本地安装有两种
第一种:压缩包方式安装
helm install --namespace test nginx-0.1.0.tar.gz
第二种:本地目录安装
helm install --namespace test /root/mysql
修改默认参数安装
helm install mysql /root/mysql --values values.yaml
指定参数文件安装
helm install mysql /root/mysql -f values.yaml
Helm文件结构
[root@master ~]# tree sql
sql
├── charts
├── Chart.yaml
├── templates
│ ├── _helpers.tpl
│ ├── mysql-conf.yaml
│ ├── mysql-password-ok.yaml
│ ├── mysql-svc.yaml
│ └── NOTES.txt
└── Values.yaml
2 directories, 7 files
chart是helm的打包格式。或者说是Kubernetes的一组相关资源文件的集合。单个chart能部署简单的应用也可以部署复杂的应用。
chart.yaml 关于这个chart包的描述信息
README.md 预留的注意事项信息
values.yaml 变量值
charts 子chart或者说是依赖
crds 自定义资源
template 模板
NOTES.txt 运行提示的信息,将安装后说明发送给helm用户
index.yaml 本地架设存储库才会有,里面存的是所有chart的索引。可以用helm repo index根据chart目录生成
_helpers.tpl
。该文件是模板局部文件的默认位置
chart.yaml
apiVersion: The chart API version (required)
#有两种一种是v1另一种是v2,两者区别是在于依赖关系。v1版本是把依赖关系定义在requirements.yaml中,而v2版本是在chart.yaml中加入depencies字段,在该字段下定义。还有一种是把依赖放在charts目录下
name: The name of the chart (required)
#chart名字
version: A SemVer 2 version (required)
#这个是chart的版本,打包命名就是用的chart名字+chart版本
kubeVersion: A SemVer range of compatible Kubernetes versions (optional)
#指明受支持的kubernetes版本
description: A single-sentence description of this project (optional)
#描述信息
type: The type of the chart (optional)
#类型有两种,一种是应用图表,另一种是库图表。application or library,使用v2的时候二选一
keywords:
#此项目的关键字 - A list of keywords about this project (optional)
home: The URL of this projects home page (optional)
#项目主页url
sources:
#项目源代码url - 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如果,同时存在以condition为准如果不存在以tag为准,为真启用,为假不用
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)
#弃用chart
annotations: example: A list of annotations keyed by name (optional).
子chart细节
1、子chart被认为是独立的,所以永远不能明确依赖于父chart
2、子chart不能访问父chart值,也不能访问其他chart值
3、父chart值可以覆盖子chart值
4、Helm有一个global values的概念,所有的charts都可以访问
依赖项中的tags与condition(控制是否启用依赖chart)
# 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
在上面的示例中,所有带有标签的图表front-end
都将被禁用,但是由于subchart1.enabled
路径在父级值中的值为“ true”,因此该条件将覆盖front-end
标签并被subchart1
启用。
由于subchart2
已标记为,back-end
且该标记的评估结果为true
,因此 subchart2
将被启用。另请注意,尽管subchart2
已指定条件,但父级值中(还要看values的定义)没有相应的路径和值,因此该条件无效。
在标签和条件下使用CLI
该--set
参数可以照常使用,以更改标签和条件值。
helm install --set tags.front-end=true --set subchart2.enabled=false
标签(tags)和条件(condition)解析
- 条件(在值中设置时)始终会覆盖标签。存在的第一个条件路径将获胜,而该图表的后续条件路径将被忽略。
- 标签被评估为“如果图表的任何标签为真,则启用图表”。
- 标签和条件值必须设置在顶级父项的值中。(就是父chart中定义)
tags:
值中的键必须是顶级键。tags:
当前不支持全局和嵌套表。(就是父chart中定义)
通过依赖项导入子值
在某些情况下,希望允许子chart的值传播到父chart并作为通用默认值共享。
可以使用YAML列表在父chart的dependencies
字段中指定包含要导入的值的键import-values
。列表中的每个项目都是从子chart的exports
字段中导入的键。
要导入exports
键中未包含的值,请使用子代父(第二种)格式。
方法有两种:
第一种:exports
这是在data在包含值的情况下
父chart
# parent's Chart.yaml file dependencies: - name: subchart repository: http://localhost:10191 version: 0.1.0 import-values: - data 子chart # child's values.yaml file exports: data: myint: 99 结果 # parent's values myint: 99
第二种:
data不包含值的情况下
# parent's Chart.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
default.data在子chart中找到的值会被导入到父chart的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复制到charts/
目录中来明确表示这些依赖性。
依赖项可以是chart压缩包(foo-1.2.3.tgz
)或未打包的目录。但是其名称不能以_
或.开头。此类文件将被加载器忽略。
wordpress:
Chart.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mysql/
Chart.yaml
# ...
helm install 与 helm upgrade影响如何
假设一个名为“ A”的chart创建了以下Kubernetes对象
- 命名空间“ A-Namespace”
- statefulset“ A-StatefulSet”
- 服务“ A-服务”
此外,A依赖于创建对象的chart B
- 命名空间“ B-Namespace”
- 复制集“ B-ReplicaSet”
- 服务“ B服务”
在安装/升级chart A之后,创建/修改单个Helm版本。将按照以下顺序创建/更新上述所有Kubernetes对象:
- 名称空间
- B命名空间
- 服务
- B服务
- B-复制集
- 状态集
这是因为当Helm安装/升级chart时,chart中的Kubernetes对象及其所有依赖项都是
- 聚合成一个集合;然后
- 按类型排序,再按名称排序;然后
- 以该顺序创建/更新。
模板和参数
只有一点需要注意,就是在命令行与模板同时存在的时候命令行的参数会覆盖模板参数进行配置
而且在命令行指定参数值文件的时候,值文件名可以任意
依赖范围
父chart可以访问子chart中的值,但是子chart不能访问父chart的值,也不可以访问其他chart的值。
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,它可以访问MySQL密码字段.Values.mysql.password
。但是对于MySQL chart来说,它将密码字段简单地显示为.Values.password
全局值
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
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中使用,所有chart共享一个变量值(父chart中定义)。如果是子chart只会向下传递,子chart定义的值不会向上传递影响父chart的值。
父chart的全局变量优先于子chart
helm有一个合并的问题,不存在会合并有的时候就会导致问题出现,例如存活检测如果配置文件用的exec,而命令行用的http那么因为exec与http不同,就会出现存活检测有两种方式出现,但是在一个存活检测下。那么在Kubernetes中读取时就会出席那错误。
在命令行指定的时候,--set livenessprobe.httpget=null就可以解决掉,实际就是把httpget置空,只使用exec。
父chart与子chart可以共享模板,任何chart中定义的任何块都可以用于其他chart
{{- define "label" }}from: mychart{{ end }}
include与template的一个区别是,include可以动态引用模板
{{ include $mytemplate }}
正常引用就是{{ include "模板名字"}}
以上将取消引用$mytemplate
。template
相反,该函数将仅接受字符串文字。
如果想忽略helm中的文件,可以在.helmignore进行匹配
该.helmignore
文件用于指定您不想包含在helm chart中的文件。
如果存在此文件,则在打包应用程序时,该helm package
命令将忽略与该文件中指定模式匹配的所有文件.helmignore
。
这可以帮助避免在文件打包时添加不必要或敏感的文件或目录。
该.helmignore
文件支持Unix shell全局匹配,相对路径匹配和否定(以!前缀反向匹配)。每行仅考虑一种模式。
这是一个示例.helmignore
文件:
# comment
.git
*/temp*
*/*/temp*
temp?
https://v2.helm.sh/docs/chart_best_practices/