Helm 是 Kubernetes 的软件包管理工具。本文需要读者对 Docker、Kubernetes 等相关知识有一定的了解。 本文将介绍 Helm 中的相关概念和基本工作原理,并通过一些简单的示例来演示如何使用Helm来安装、升级、回滚一个 Kubernetes 应用。
Helm 是什么??
Helm
是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
Helm 解决了什么痛点?
在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。比如你安装一个 WordPress 博客,用到了一些 Kubernetes (下面全部简称k8s)的一些资源对象,包括 Deployment 用于部署应用、Service 提供服务发现、Secret 配置 WordPress 的用户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在mariadb里面的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不方便进行管理,直接通过 kubectl 来管理一个应用,你会发现这十分蛋疼。 所以总结以上,我们在 k8s 中部署一个应用,通常面临以下几个问题:
- 如何统一管理、配置和更新这些分散的 k8s 的应用资源文件
- 如何分发和复用一套应用模板
- 如何将应用的一系列资源当做一个软件包管理
Helm 相关组件及概念
Helm 包含两个组件,分别是 helm 客户端 和 Tiller 服务器:
helm
是一个命令行工具,用于本地开发及管理chart,chart仓库管理等Tiller
是 Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来生成一个 release 并管理 releasechart Helm
的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源release
使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 ReleaseRepoistory Helm chart
的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包
Helm 原理
下面两张图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart 软件仓库)、Chart(软件包)之间的关系以及它们之间如何通信
helm 组件通信
helm 架构
创建release
- helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
- helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
- Tiller 服务端根据 chart 和 values 生成一个 release
- Tiller 将install release请求直接传递给 kube-apiserver
删除release
- helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
- helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
- Tiller 服务端根据 chart 和 values 生成一个 release
- Tiller 将delete release请求直接传递给 kube-apiserver
更新release
- helm 客户端将需要更新的 chart 的 release 名称 chart 结构和 value 信息传给 Tiller
- Tiller 将收到的信息生成新的 release,并同时更新这个 release 的 history
- Tiller 将新的 release 传递给 kube-apiserver 进行更新
chart 的基本结构
Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源。Chart中的文件安装特定的目录结构组织, 最简单的chart 目录如下所示:
- charts 目录存放依赖的chart
- Chart.yaml 包含Chart的基本信息,包括chart版本,名称等
- templates 目录下存放应用一系列 k8s 资源的 yaml 模板
- _helpers.tpl 此文件中定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用
- NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等
- values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值
helm安装
环境要求
- 可用的
Kubernetes
集群 - 正确的可用的
kubectl config
简单做法
只要一个简单的 helm init
命令,就可以自动完成 Tiller 的安装,以及 Helm 本地设置。
安装docker
安装Kubernetes单节点
kubernetes单节点与集群唯一不一样的就是不需要其他node加入集群,然后把master节点的污点去掉,因为默认master是不允许被调度启动pods的
代码语言:javascript复制# kubectl taint nodes --all node-role.kubernetes.io/master-
Helm-cli
Helm Client
是用户命令行工具,其主要负责如下:
- 本地 chart 开发
- 仓库管理
- 与 Tiller sever 交互
- 发送预安装的 chart
- 查询 release 信息
- 要求升级或卸载已存在的 release
在安装Helm之前要保证有一个完整的Kubernetes集群在正常运行。
安装方式有很多,具体参考官网安装文档,这里只是tar的安装方法。
下载helm的安装包
在该链接的Installation and Upgrading部分的链接是下载tar.gz包的链接,我这里选则的版本是这个
代码语言:javascript复制# tar zxf helm-v3.4.2-linux-amd64.tar.gz
安装helm,其实主要就是要这个命令的脚本即可,所以解压缩之后,将helm命令脚本复制到系统中的命令可执行环境变量的目录中即可
大多数情况下,安装只需要简单地获取一个构建好的helm二进制包
代码语言:javascript复制# mv linux-amd64/helm /usr/local/bin/helm
Helm-tiller(服务端)
Tiller Server是一个部署在Kubernetes集群内部的 server,其与 Helm client、Kubernetes API server 进行交互。Tiller server 主要负责如下:
- 监听来自 Helm client 的请求
- 通过 chart 及其配置构建一次发布
- 安装 chart 到Kubernetes集群,并跟踪随后的发布
- 通过与Kubernetes交互升级或卸载 chart
- 简单的说,client 管理 charts,而 server 管理发布 release
本身服务端需要运行命令helm init进行部署安装,但在3.x之后被移除,如果使用的helm版本为2.x,请参考Helm初始化文档
Helm的使用
仓库
helm的使用是需要使用仓库的,就像docker和kubernetes一样,需要从仓库中拉取作者创建好的模板文件为己用
仓库 是归集和分享chart的地方。只针对于Kubernetes包。
添加chart仓库,常见的选择是helm的官方仓库,如下:
代码语言:javascript复制格式: 添加:helm repo add [NAME] [URL] 删除: helm repo remove [NAME]
# helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories
阿里云:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
微软:http://mirror.azure.cn/kubernetes/charts
helm search
Helm有强大的搜索命令。可以搜索两类不同资源:
helm search hub 搜索 Artifact Hub,该仓库列出了来自不同仓库的大量chart。
代码语言:javascript复制# helm search hub
URL CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/gabibbo97/389ds 0.1.0 fedora-32 389 Directory Server
https://hub.helm.sh/charts/aad-pod... 3.0.0 1.7.1 Deploy components for aad-pod-identity
https://hub.helm.sh/charts/arhatdev/abbot 0.1.0 latest Network Manager Living at Edge
# ... and many more
helm search repo 搜索已经(用 helm repo add)加入到本地helm客户端的仓库。该命名只搜索本地数据,不需要连接网络。
代码语言:javascript复制# helm search repo
NAME CHART VERSION APP VERSION DESCRIPTION
stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools
stable/aerospike 0.3.5 v4.5.0.5 DEPRECATED A Helm chart for Aerospike in Kubern...
stable/airflow 7.13.3 1.10.12 DEPRECATED - please use: https://github.com/air...
# ... and many more
指定本地仓库
代码语言:javascript复制# helm search repo [仓库名]
仓库模糊查找
Helm搜索使用字符串模糊匹配,因此输入部分名称也可以
代码语言:javascript复制# helm search repo sql
NAME CHART VERSION APP VERSION DESCRIPTION
stable/gcloud-sqlproxy 0.6.1 1.11 DEPRECATED Google Cloud SQL Proxy
stable/mssql-linux 0.11.4 14.0.3023.8 DEPRECATED - SQL Server 2017 Linux Helm Chart
stable/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy...
# ... and many more
helm install
使用search搜到到可以用包之后,即可使用helm install安装
最简单的方式有两个参数:查找到发布名称和chart名称。
现在找一个数据库来部署
代码语言:javascript复制[root@t10 ~]# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
...
stable/mariadb 7.3.14 10.3.22 DEPRECATED Fast, reliable, scalable, and easy t...
发布名称自定义,chart名称为search看到的名称stable/mariadb
代码语言:javascript复制格式:helm install [发布名称] [chart名称]
# helm install happy-panda stable/mariadb
WARNING: This chart is deprecated
NAME: happy-panda
LAST DEPLOYED: Mon Dec 28 11:23:42 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated
Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).
The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`)
```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install my-release bitnami/<chart> # Helm 3
$ helm install --name my-release bitnami/<chart> # Helm 2
```
To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute
```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm upgrade my-release bitnami/<chart>
```
Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion.
Please be patient while the chart is being deployed
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace default -l release=happy-panda
Services:
echo Master: happy-panda-mariadb.default.svc.cluster.local:3306
echo Slave: happy-panda-mariadb-slave.default.svc.cluster.local:3306
Administrator credentials:
Username: root
Password : $(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run happy-panda-mariadb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mariadb:10.3.22-debian-10-r27 --namespace default --command -- bash
2. To connect to master service (read/write):
mysql -h happy-panda-mariadb.default.svc.cluster.local -uroot -p my_database
3. To connect to slave service (read-only):
mysql -h happy-panda-mariadb-slave.default.svc.cluster.local -uroot -p my_database
To upgrade this helm chart:
1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' parameter as shown below:
ROOT_PASSWORD=$(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
helm upgrade happy-panda stable/mariadb --set rootUser.password=$ROOT_PASSWORD
现在mariadb的chart已经安装。上述发布的名称是:happy-panda。 (如果想让Helm为你生成一个名称,去掉发布名称并加上–generate-name)
如:helm install stable/mariadb --generate-name
安装方法
代码语言:javascript复制本地chart包: helm install foo foo-0.1.1.tgz
解压的chart目录: helm install foo path/to/foo
完整URL: helm install foo https://example.com/charts/foo-1.2.3.tgz
helm list
查看发布后的chart
代码语言:javascript复制# helm list
NAME NAMESPACE REVISIO UPDATED STATUS CHART APP VERSION
happy-panda default 1 2020-12-28 13:10:44.016697442 -0500 EST deployed mariadb-7.3.14 10.3.22
helm status
使用helm status,可以查看chart发布的状态或者配置信息
代码语言:javascript复制格式:helm status [发布名称]
# helm status happy-panda
# 输出的内容和刚install结束的内容是一样的
helm show values
以上的安装使用了chart的所有默认配置,也可以对配置进行自定义,首先通过helm show values命令查看chart的可配置项
代码语言:javascript复制格式:helm show values [chart名称]
# helm show values stable/mariadb
## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
# global:
# imageRegistry: myRegistryName
# imagePullSecrets:
# - myRegistryKeySecretName
# storageClass: myStorageClass
## Use an alternate scheduler, e.g. "stork".
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
##
# schedulerName:
## Bitnami MariaDB image
## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
##
image:
registry: docker.io
repository: bitnami/mariadb
tag: 10.3.22-debian-10-r27
...
通过yaml文件覆盖默认配置
代码语言:javascript复制# echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
# helm install -f config.yaml stable/mariadb --generate-name
mariadbUser和mariadbDatabase分别是mariadb数据库里面的用户和数据库,以上更改意思是创建了数据库新用户user0,和创建了新数据库user0db,且该用户拥有user0db数据库的访问权限。
通过命令行覆盖默认配置
代码语言:javascript复制# helm install --set name=value stable/mariadb --generate-name
name: value
# 多个值用','分割
# helm install --set a=b,c=d stable/mariadb --generate-name
a: b
c: d
# 负载表达式
# helm install --set outer.inner=value stable/mariadb --generate-name
outer:
inner: value
# 列表配置
# helm install --set name={a, b, c} stable/mariadb --generate-name
name:
- a
- b
- c
# 数组索引
# helm install --set servers[0].port=80 stable/mariadb --generate-name
servers:
- port: 80
# 数组索引 负载
# helm install --set servers[0].port=80,servers[0].host=example --generate-name
servers:
- port: 80
host: example
# 一个变量多个值
# helm install --set name=value1,value2 --generate-name
name: "value1,value2"
–set指定的值会被helm upgrade运行时–reset-values指定的值清空。
实例更改标签选择
代码语言:javascript复制# helm install --set nodeSelector."kubernetes.io/role"=master --generate-name
nodeSelector:
kubernetes.io/role: master
helm upgrade
当chart新版本发布时,或者您想改变发布的配置,可以使用 helm upgrade 命令。
升级采用已有版本并根据您提供的信息进行升级。由于Kubernetes的chart会很大且很复杂,Helm会尝试执行最小增量升级。 这样只会升级自最新版发生改变的部分。
格式和install使用文件替换默认配置的方法类似
代码语言:javascript复制格式:helm upgrade -f [yaml文件名] [发布名称] [chart名称]
# vim config.yaml
mariadbUser: cyj
# helm upgrade -f config.yaml happy-panda stable/mariadb
...
查看发布的更新内容是否生效
代码语言:javascript复制# helm get values happy-panda
USER-SUPPLIED VALUES:
mariadbUser: cyj
helm rollback
如果发现更新出现了问题,可以使用helm rollback进行回滚
通过helm hist [发布名称]查看版本
代码语言:javascript复制# helm hist happy-panda
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Dec 28 11:23:42 2020 superseded mariadb-7.3.14 10.3.22 Install complete
2 Mon Dec 28 11:59:13 2020 deployed mariadb-7.3.14 10.3.22 Upgrade complete
代码语言:javascript复制格式:helm rollback [发布名称] REVISION
# helm rollback happy-panda 1
Rollback was a success! Happy Helming!
# helm hist happy-panda
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Dec 28 11:23:42 2020 superseded mariadb-7.3.14 10.3.22 Install complete
2 Mon Dec 28 11:59:13 2020 superseded mariadb-7.3.14 10.3.22 Upgrade complete
3 Mon Dec 28 12:08:22 2020 deployed mariadb-7.3.14 10.3.22 Rollback to 1
helm uninstall
从集群中卸载发布,使用helm uninstall
代码语言:javascript复制格式:helm uninstall [发布名称]
# helm uninstall happy-panda
release "happy-panda" uninstalled