Helm

Helm 可以帮助管理 Kubernetes 应用程序,其作用类似于 CentOS 的 yum。对于越来越复杂的 Kubernetes 应用程序来说,如果单纯依靠手动维护应用程序的 YAML 资源清单文件,成本是巨大的,此时 Helm 就解决了这方面的难题。通过使用 Helm Charts,可以定义、安装和升级复杂的 Kubernetes 应用程序。

安装 Helm

安装前提:在需要使用 Helm 命令的节点上能够通过 kubectl 访问集群,Helm 其实就是读取的 kubeconfig 文件来访问集群。

同时由于 Helm V2 版本必须在 Kubernetes 集群中安装一个 Tiller 服务进行通信,这样大大降低了其安全性和可用性,所以在 V3 版本中移除了服务端,采用了通用的 Kubernetes CRD 资源来进行管理,这样就只需要连接上 Kubernetes 即可。直接去 Github 下载即可,我这里采用的最新版 3.11.1

# 下载解压安装
wget https://get.helm.sh/helm-v3.11.1-linux-amd64.tar.gz
tar -zxf helm-v3.11.1-linux-amd64.tar.gz 
mv linux-amd64/helm  /opt/service/kubernetes/server/bin/

# 查看安装结果
helm version

# 配置命令提示补全
echo "source <(helm completion bash)" >> /etc/profile
source /etc/profile

Helm 客户端安装完成后,就需要类似 yum 配置 yum 源一样进行仓库配置。最常用的就是官方的 Helm stable charts 仓库,但由于国内网络问题,可以使用微软的 charts 仓库代替:

# 添加名称为 stable 的仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts/

# 查看仓库列表
helm repo list

如图所示:

 

安装 Chart 包

可以使用 helm install 命令安装一个 chart 包。Helm 有多种方法来找到和安装 chart 包,最简单的就是使用官方的 stable 这个仓库直接安装。

首先从仓库中将可用的 charts 信息同步到本地,可以确保获取到最新的 charts 列表:

# 同步信息
helm repo update

# 安装包
helm install stable/mysql --generate-name

如果没有指定名称,则此时会提示 Error: INSTALLATION FAILED: must either provide a name or specify --generate-name,让配置或随机生成一个。同时需要注意,名称只支持 _,不支持 -

完成后会输出 MySQL 一些部署信息:

 

安装成功的应用叫做一个 release,可以通过它进行筛选查看对应 release 创建的所有资源:

kubectl get all -l release="mysql-1677926923"

如图所示:

 

相当于创建了一个 Deployment 和一个 Service。

其它操作:

# 查看 chart 包的相关信息
helm show chart stable/mysql

# 查看已经通过 helm 安装的 release,想要看到 uninstalled 状态的 release 则需要 -a 参数
helm ls -a

# 查看 release 状态
helm status mysql-1677926923

# 删除 release
helm uninstall mysql-1677926923

注意:uninstall 命令会从 Kubernetes 中删除 release,也会删除与 release 相关的所有 Kubernetes 资源以及 release 历史记录。如果想要保留 release 的历史记录,可以在删除的时候使用 --keep-history 参数。通过该删除删除的 release,查看 status 的时候显示的状态会是 uninstalled,而不是找不到。

如图所示:

 

如果是uninstalled 状态,还可以对它进行回滚:

# 回滚 release,需要指定对应的 reversion 版本
helm rollback mysql-1677926923 1

helm install 命令可以从多个源进行安装:

  • chart 仓库(类似于上面的方法)
  • 本地 chart 压缩包(helm install foo-0.1.1.tgz)
  • 本地解压缩的 chart 目录(helm install foo path/foo)
  • 在线的 URL(helm install fool https://example.com/charts/foo-1.2.3.tgz)

定制 Chart 包

通过上面的方法直接 install 安装的 Chart 包只会是默认的配置,这在生产中往往是不够用的。一般都需要用户对它进行配置。

# 查看 Chart 包支持自定义的配置参数
helm show values stable/mysql

可以通过创建 YAML 对显示的字段进行覆写,新建 config.yaml:

mysqlRootPassword: root123
mysqlUser: hello
mysqlPassword: world
mysqlDatabase: demo

安装的时候指定文件:

helm install mysql -f config.yaml stable/mysql

通过查看 Pod 的环境变量可以看到配置:

 

在安装过程中,有两种方法可以传递配置数据:

  • --values(-f):指定一个 YAML 文件来覆盖 values 值,可以指定多个值。
  • --set:在命令行上指定覆盖的配置。

如果同时使用这两个参数,--values(-f) 将被合并到具有更高优先级的 --set。使用 --set 指定的值将持久化在 ConfigMap 中。

已经存在的 release 可以获取到设置的 values:

helm get values mysql

已设置的值也通过允许 helm upgrade 并指定 --reset 值来清除。

--set 的用法与 YAML 对应关系:

# 单个值,YAML 示例:
# name: dylan
--set name=dylan

# 多个值,YAML 示例:
# name: dylan
# age: 18
--set name=dylan,age=18

# 多层级,YAML 示例:
# info:
#   name: dylan
--set info.name=dylan

# 列表数组,YAML 示例:
# list:
#   - a
#   - b
--set list={a,b}

# 设置数组中的某个值,YAML 示例:
# info:
#   - name: user1
#     age: 18
--set info[0].age=18

# 特殊字符转义,YAML 示例:
# nodeSelector:
#   kubernetes.io/role: master
--set nodeSelector."kubernetes\.io/role"=master

可以看出 --set 很多时候对于复杂的结构是很难用,所有更推荐 YAML 的方式。

升级和回滚

当新版本的 chart 包发布的时候,或者想要更改 release 的配置的时候,可以使用 helm upgrade 命令来操作。

升级需要一个现有的 release,并根据提供的信息对其进行升级。因为 Kubernetes charts 可能很大而且很复杂,Helm 会尝试以最小的侵入性进行升级,它只会更新自上一版本以来发生的变化:

# 升级
helm upgrade mysql-1677927765 -f config.yaml stable/mysql

# 查看更新的 value
helm get values mysql-1677927765

每一次upgrade,REVISION 的值就会 +1。

如果升级不符合预期,需要回滚到之前的版本,就需要执行下面的命令:

# 查看当前的版本
helm ls

# 查看历史版本
helm history mysql-1677927765

# 回滚到指定版本
helm rollback mysql-1677927765 2

# 查看之前的更新是否还在
helm get values mysql-1677927765

如图所示:

 

相当于发布了一个新版本,只是这个版本跟之前的版本一样。

除此之外,还可以指定一些选项来定制 install/upgrade/rollback 的一些行为,常用的参数有:

  • --timeout:等待 Kubernetes 命令完成的时间,默认是 300(5分钟)。
  • --wait:等待直到所有 Pods 和其它资源都就绪,然后才标记 release 为成功。将等待与 --timeout 一样长的时间,如果超时,则 release 将标记为失败。
  • --no-hooks:将会跳过命令的运行 hooks。
  • --recreate-pods:仅适用于 upgrade 和 rollback,这个标志将导致重新创建所有的 Pods。