helm通过将各种kubernets资源打包,类似于linux的apt-get或者yum工具,来完成复杂的软件安装和部署,并且支持部署实例的版本管理等,大大简化了在k8s上部署和管理的应用的复杂程度。
架构和组件
- chart:
chart就是helm package,包含了一个k8s app应用运行起来的所有要素,比如service, deployment, configmap, serviceaccount, rbac, 等,这些要素都是以template文件的形式存在,再结合values文件,最终渲染出能够被k8s执行的yaml文件,通常是以.tgz压缩包的形式提供,也可以是文件夹形式.
- repository:
仓库是charts的集合,方便进行分享和分发。下面是官网仓库和阿里云仓库的地址,
- https://artifacthub.io/
- https://developer.aliyun.com/hu
- release
release是helm chart在kubernetes的一个运行实例,你可以用不同的release name多次安装同一个chart,比如:当集群中需要多个redis实例,你可以使用不同的配置文件安装redis chart。
helm与linux软件包对比
helm | apt | |
安装包 | chart | deb |
仓库 | helm repository | apt repository/mirror |
操作系统 | kubernetes | linux |
包依赖 | helm dependency | deb dependency |
包管理工具 | helm client | apt |
运行流程
- 从chart仓库中获取chart;
- 使用者配置自己的values文件,根据自己的运行环境对values进行修改;
- 默认values文件和使用者values文件会进行一个merge,形成最终的values文件;
- 使用最终的values文件,渲染chart的template,形成可以被kubernetes执行的yaml;
- 调用kube apply提交yaml到kubernetes
helm的安装使用
推荐通过官方脚本安装
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
chart仓库使用
#删除默认源
helm repo remove stable
#添加国内源,使用阿里云
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#查看helm源添加情况
helm repo list
#搜索可部署的chart列表
helm search repo stable
#
相关仓库搜索命令
- 查看已经添加的仓库:helm repo list
- 搜索仓库有哪些chart:helm search repo stable
- 更新仓库列表到本地:helm repo update
- 搜索redis:helm search repo redis
- 查看redis chart详情:helm show chart stable/redis
- 查看redis values(values:相当于chart的配置文件):helm show values stable/redis
chart结构说明
helm使用的包格式被称为chart,它是描述所有k8s资源的文件集合.一个完整的chart用于部署一个完整的应用.
chart的目录结构
wordpress/
Chart.yaml # 包含了chart信息的YAML文件
LICENSE # 可选:包含了char许可证的文本文件
README.md # 可选:README文件
values.yaml # chart的默认配置
values.schema.json # 可选:JSON结构values.yaml
charts/ # 包含了chart依赖的其他chart
crds/ # 自定义资源的定义
templates/ # 模板目录,与values.yaml组合完整的资源对象配置文件
#
templates/NOTES.txt # 可选:包含了简要使用说明的文本文件
-----------------------------------
chart的yaml文件说明
apiVersion: chart的API版本号,必须
name: chart名称,必须
version: 应用的版本号,必须
kubeVersion: 兼容的kubernetes版本号范围,可选
description: 应用描述,可选
type: chart类型,可选
keywords:
- 关于应用的一组关关键字,可选
home: 关于应用的一组关键字,可选
sources:
- 应用源码的URL地址列表,可选
dependencies: # 依赖的一组其他chart信息,可选
- name: chart的名称,如nginx
version: chart的版本,如1.2.3
repository: 仓库URL(https://example.com/charts)或者别名("@repo-name")
condition: YAML格式,可选,用于启用或者禁用chart,例如subchart1.enabled)
tags: # 可选
- 用于启用或者禁用一组chart的tag
enabled: 可选,启用的bool值,确定是否加载chart
import-values: # 可选
- ImportValue : 将在子chart中设置的变量和值导入父chart中
alias: 可选,在chart中使用别名,需要多次添加相同的chart时会很有用
maintainers: # 可选
- name: 维护者的名称,每个维护者都需要
email: 维护者的邮箱,每个维护者都需要
url: 维护则的URL,每个维护者都需要
icon: 用作icon的svg或者png图片的url地址,可选
appVersion: 包含的应用版本,可选
deprecated: 设置该chart是否已被启用,可选,bool值
annotations:
example: annotation列表,可选
其他字段忽略.对其中的每个字段的详细说明参考官方说明.
操作实验
从远程仓库部署mariadb
举例,从远程仓库部署一个maraidb应用
自定义创建chart
1 生成空的charts
mkdir -p /root/.helm/cache/archive
cd /root/.helm/cache/archive
helm create mychart
注意,该命令能够在当前目录中创建一个名为mychart的图表,建议进入chart下载默认路径创建,默认路径为/root/.helm/cache/archive
确认charts文件目录结构
确认charts元数据文件:
cat Chart.yaml
查看values.yaml为文件,可以看到定义了一个可以直接安装容器化Nginx应用的Charts
2 修改charts以部署自定义服务
vim values.yaml
3 检查chart是否有语法错误,注意在chart所在的目录运行
helm lint mychart
没有报错
4 使用--dry-run和--debug参数调试chart包
helm install --set name=myapp mychart --dry-run --debug ./mychart
5 确认无误后,再次执行命令
helm install --set name=myapp mychart ./mychart/
6 查看helm状态
helm status mychar
7 通过status输出的notes提示运行相关验证服务
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=mychart" -o jsnotallow="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsnotallow="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
8 通过helm package打包
helm package mychart
打包完成后,可以使用本地.tgz文件进行helm install命令部署了
helm install mychart mychart-0.1.0.tgz
同时,可以将打包好的chart上传到chart仓库进行保存,供后续分发和部署使用.
升级或者回退一个应用
1 打包自定义应用,修改Chart.yaml文件,将版本号从0.1.0修改为0.2.0,然后使用helm package打包
cd /roo/.helm/cache/archive
vi mychart/Chart.yaml
helm package mychart
2 使用 helm upgrade已经部署的release,可以通过--version来指定版本号,如果没有版本号,则自动升级到最新版本.
helm list #查询
3 升级和回退
helm upgrade mychart local/mychart
helm rollback mychart
# 查看release历史
helm history myapp