本文档作为简单的使用入门,详细文档还需参考官方文档。
安装
helm和kubectl一样就是个go的二进制包,
- 直接到官方仓库找二进制下载
- 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
- 在解压目录中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm)
当然闲麻烦也能用包管理器安装:
mac:
brew install helm
windows:
choco install kubernetes-helm
# or
scoop install helm
apt包:
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
helm
和kubectl
一样依赖kubeconf文件来调用apiserver,需要提前准备好。
名称解释及概念
用途
做为 Kubernetes 的一个包管理工具,Helm具有如下功能:
- 创建新的 chart
- chart 打包成 tgz 格式
- 上传 chart 到 chart 仓库或从仓库中下载 chart
- 在Kubernetes集群中安装或卸载 chart
- 管理用Helm安装的 chart 的发布周期
Helm 有三个重要概念:
Chart
代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。Repository
仓库。是用来存放和共享 charts 的地方。其实远端就是存储一个tar压缩包。Release
是运行在 Kubernetes 集群中的 chart 的实例。
helm原理
Helm是一个可执行文件,执行时分成两个不同的部分:
Helm客户端 是终端用户的命令行客户端。负责以下内容:
- 本地chart开发
- 管理仓库
- 管理发布
- 与Helm库建立接口
- 发送安装的chart
- 发送升级或卸载现有发布的请求
Helm库 提供执行所有Helm操作的逻辑。与Kubernetes API服务交互并提供以下功能:
- 结合chart和配置来构建版本
- 将chart安装到Kubernetes中,并提供后续发布对象
- 与Kubernetes交互升级和卸载chart
执行
Helm客户端和库是使用Go编程语言编写的
这个库使用Kubernetes客户端库与Kubernetes通信。现在,这个库使用REST+JSON。它将信息存储在Kubernetes的密钥中。 不需要自己的数据库。
如果可能,配置文件是用YAML编写的。
原理
Helm中用到的是golang 的template模板这个库功能。类似于Python的Jinja2。分为变量定义和模板定义两个部分,最终组合这两部分生成最终的文件内容。
我们通过更改不同的变量值和变量条件来达到生成不同最终文件内容的目的。
同时Helm也管理了最终文件的部署和版本管理功能。
常用包命令
# 添加远端仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 或者带有密码的私有仓库
helm repo add --username=xxx --password=xxxx myrepo https://xx.repo.cn/repo
# 搜索包
helm search repo bitnami/nginx
# 搜索并且列出可用versions
helm search repo bitnami/nginx -l
# 安装包
helm install <name> bitnami/nginx -n <namespace> [-f your-values.yaml]
支持命令列表可以查看官方文档: https://helm.sh/zh/docs/helm/helm/
k8s基础
使用Helm前需要简单了解下k8s的资源,因为helm包也就是对k8s资源的一种模板化的管理,最终生成的也是k8s中定义的资源。
常见的部署类型:
- Deployment: 部署无状态服务
- Statefullset: 部署有状态服务
- Daemonset: 守护进程部署
- CronJob: 定时任务
其它常用类型:
- Service: 定义集群内部或者外部vip
- ServiceAccount: 服务账号
- HorizontalPodAutoscaler: 自动扩缩容配置
- Configmap: 配置文件
- Secret: 秘钥
k8s学习推荐文档,这里面有各种资源的定义说明,对认识整个云原生生态有很大帮助。
构建包
下面来创建一个示例项目:
# 创建一个模板包,模板是部署一个简单的nginx服务。
helm create chartname
直接创建会发现已经填充了很多文件内容,下面是文件内容解释:
chartname/
Chart.yaml # 包含 Chart 基本信息(例如版本和名称)的 YAML 文件。
LICENSE # (可选)包含 Chart 许可证的纯文本文件。
README.md # (可选)应用说明和使用指南。
values.yaml # 该 Chart 的默认配置值。
values.schema.json # (可选)向 values.yaml 文件添加结构的 JSON Schema。
charts/ # 一个目录,包含该 Chart 所依赖的任意 Chart。
crds/ # 定制资源定义。
templates/ # 模板的目录,若提供相应值便可以生成有效的 Kubernetes 配置文件。
templates/NOTES.txt # (可选)包含使用说明的纯文本文件。
Chart.yaml 文件:
您必须为 Chart 提供 chart.yaml 文件。下面是一个示例文件,每个字段都有说明。
apiVersion: (必需)Chart API 版本。
name: (必需)Chart 名称。
version: (必需)版本,遵循 SemVer 2 标准。
kubeVersion: (可选)兼容的 Kubernetes 版本,遵循 SemVer 2 标准。
description: (可选)对应用的一句话说明。
type: (可选)Chart 的类型。
keywords:
- (可选)关于应用的关键字列表。
home: (可选)应用的 URL。
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 分组,一同启用/禁用。
import-values: (可选)
- ImportValues 保存源值到待导入父键的映射。每一项可以是字符串或者一对子/父子列表项。
alias: (可选)Chart 要使用的别名。当您要多次添加同一个 Chart 时,它会很有用。
maintainers: (可选)
- name: (必需)维护者姓名。
email: (可选)维护者电子邮件。
url: (可选)维护者 URL。
icon: (可选)要用作图标的 SVG 或 PNG 图片的 URL。
appVersion: (可选)应用版本。不需要是 SemVer。
deprecated: (可选,布尔值)该 Chart 是否已被弃用。
annotations:
example: (可选)按名称输入的注解列表。
Values.yaml 和模板
Helm Chart 模板采用 Go 模板语言编写并存储在 Chart 的 templates 文件夹。有两种方式可以为模板提供值:
在 Chart 中创建一个包含可供引用的默认值的 values.yaml 文件。
创建一个包含必要值的 YAML 文件,通过在命令行使用 helm install 命令来使用该文件。
下面是 templates 文件夹中模板的示例。
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
tag: ""
template文件示例:
这里面讲引用上面value.yaml文件定义的变量。
...
spec:
{
{
- if not .Values.autoscaling.enabled }}
replicas: {
{
.Values.replicaCount }}
{
{
- end }}
...
selector:
matchLabels:
{
{
- include "xx.selectorLabels" . | nindent 6 }}
...
spec:
containers:
- name: {
{
.Chart.Name }}
securityContext:
{
{
- toYaml .Values.securityContext | nindent 12 }}
image: "{
{ .Values.image.repository }}:{
{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {
{
.Values.image.pullPolicy }}
就是这么简单朴实,我们只要理解{
{}}
这里面的变量是哪来的就可以。
内置对象
{ { .Release.Name }}在模板中插入版本名称。Release是你可以在模板中访问的顶层对象之一。
- Release: Release对象描述了版本发布本身。包含了以下对象:
- Release.Name: release名称
- Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)
- Release.IsUpgrade: 如果当前操作是升级或回滚的话,该值将被设置为true
- Release.IsInstall: 如果当前操作是安装的话,该值将被设置为true
- Release.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增
- Release.Service: 该service用来渲染当前模板。Helm里始终Helm
- Values: Values对象是从values.yaml文件和用户提供的文件传进模板的。默认为空
- Chart: Chart.yaml文件内容。 Chart.yaml里的所有数据在这里都可以可访问的。比如 { { .Chart.Name }}-{ { .Chart.Version }} 会打印出 mychart-0.1.0
- Files: 在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。 请查看这个 文件访问部分了解更多信息
更多内置的对象见文档: https://helm.sh/zh/docs/chart_template_guide/builtin_objects/
内置函数
https://helm.sh/zh/docs/chart_template_guide/function_list/
其它重要概念
- 管道函数(filter函数)
- 流程控制
- with和range变量
- 命名模板
- .helmignore 文件
子chart和全局值
https://helm.sh/zh/docs/chart_template_guide/subcharts_and_globals/
本地测试
# 生成最终模板并输出到终端
helm template ./chartname --debug
# 测试在集群中的变量是否正确,但是不安装到集群
helm install ./chartname --dry-run
以下命令有助于调试:
- helm lint 是验证chart是否遵循最佳实践的首选工具。
- helm template --debug 在本地测试渲染chart模板。
- helm install --dry-run --debug:我们已经看到过这个技巧了,这是让服务器渲染模板的好方法,然后返回生成的清单文件。
- helm get manifest: 这是查看安装在服务器上的模板的好方法。输出当前安装到集群中的应用的文件。
根据报错修改自己的模板配置。
部署完后的操作
# 显示已经安装的包
helm list -n <namspace>
# 显示部署状态
helm status RELEASE_NAME -n <namspace>
# 卸载包
helm uninstall RELEASE_NAME -n <namspace>
# 获取当前不是使用的values变量
helm get values RELEASE_NAME -n <namspace>
# 升级安装
helm upgrade <name> bitnami/nginx -n <namespace> [-f your-values.yaml]