Kubernetes 上的应用对象,都是由特定的资源描述组成,包括 Deployment、Service 等,都保存在各自的文件中或者集中写在一个配置文件,然后通过 kubectl apply -f 部署。
如果应用只由一个或几个这样的服务组成,上面的部署方式就足够了。
但是对于一个复杂的应用,会有很多类似上面的资源描述文件,如:微服务架构应用,组成应用的服务可能多达几十、上百个,如果有更新或回滚应用的需求,可能要修改和维护所涉及到大量的资源文件,而这种组织和管理应用的方式就显得力不从心了。并且由于缺少对发布过的应用进行版本管理和控制,使得 Kubernetes 上的应用维护和更新面临诸多的挑战,主要面临以下的问题:
Helm 是 Kubernetes 的包管理工具,就像 Linux 下的包管理器,如:yum、apt 等,可以很方便的将之前打包好的 yaml 文件部署到 Kubernetes 上。
Helm 可以做以下的事情:
Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。Repository(仓库) 是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。Release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release 。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name 。Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
可以类比 Docker 来理解,Chart 就类似于 Docker 中的镜像(Docker 中的镜像就是一系列文件的集合,Chart 也是一系列文件的集合),Repository(仓库)就类似于 Docker Hub,Release 就类似于 Docker 中的容器(可以根据镜像 run 多个容器)。
使用 Helm ,需要一个 Kubernetes 集群。对于 Helm 的最新版本,我们建议使用 Kubernetes 的最新稳定版, 在大多数情况下,它是倒数第二个次版本。

下载额二进制文件:
wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
解压文件:
tar -zxvf helm-v3.10.2-linux-amd64.tar.gz
将解压目录下的 helm 程序移动到 usr/local/bin/helm:
mv linux-amd64/helm /usr/local/bin/helm
helm 命令补全:
helm completion bash | sudo tee /etc/bash_completion.d/helm > /dev/null
source /usr/share/bash-completion/bash_completion
添加阿里云 helm 仓库:
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
常用仓库:
微软仓库:http://mirror.azure.cn/kubernetes/charts,推荐。
阿里云仓库:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts。
添加 chart 仓库:
helm repo add 仓库名 仓库URL地址
# 如下
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
查看 chart 仓库列表:
helm repo list
# 如下
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
ingress-nginx https://kubernetes.github.io/ingress-nginx
从 chart 仓库中更新本地可用 chart 的信息:
helm repo update
# 更新从各自chart仓库中获取的有关 chart 的最新信息。信息会缓存在本地,被诸如 'helm search' 等命令使用。
删除 Chart 仓库:
helm repo remove 仓库名
# 如下
helm repo remove aliyun
| 命令 | 描述 |
|---|---|
| create | 创建一个chart并指定名字 |
| dependency | 管理chart依赖 |
| get | 下载一个release。可用的子命令:all、hooks、manifest、notes、values。 |
| history | 获取release历史。 |
| install | 安装一个chart。 |
| list | 列出release。 |
| package | 将chart目录打包到chart存档文件中。 |
| pull | 从远程仓库中下载chart并解压到本地。比如:helm install stable/mysql --untar。 |
| repo | 添加、列出、移除、更新和索引chart仓库。可用的子命令:add、index、list、remove、update。 |
| rollback | 从之前的版本回退。 |
| search | 根据关键字搜索chart。可用的子命令:all、chart、readme、values。 |
| show | 查看chart的详细信息。可用的子命令:all、chart、readme、values。 |
| status | 显示已命名版本的状态。 |
| template | 本地呈现模板。 |
| uninstall | 卸载一个release。 |
| upgrade | 更新一个release。 |
| version | 查看Helm客户端版本。 |
mychart
├── Chart.yaml
├── charts # 该目录保存其他依赖的 chart(子 chart)
├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件
│ ├── NOTES.txt # 用户运行 helm install 时候的提示信息
│ ├── _helpers.tpl # 用于创建模板时的帮助类
│ ├── deployment.yaml # Kubernetes deployment 配置
│ ├── ingress.yaml # Kubernetes ingress 配置
│ ├── service.yaml # Kubernetes service 配置
│ ├── serviceaccount.yaml # Kubernetes serviceaccount 配置
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖
helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo redis
# 结果如下
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/redis 1.1.15 4.0.8 Open source, advanced key-value store. It is of...
aliyun/redis-ha 2.0.1 Highly available Redis cluster with multiple se...
bitnami/redis 18.0.1 7.2.0 Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster 9.0.1 7.2.0 Redis(R) is an open source, scalable, distribut...
stable/prometheus-redis-exporter 3.5.1 1.3.4 DEPRECATED Prometheus exporter for Redis metrics
stable/redis 10.5.7 5.0.7 DEPRECATED Open source, advanced key-value stor...
stable/redis-ha 4.4.6 5.0.6 DEPRECATED - Highly available Kubernetes implem...
aliyun/sensu 0.2.0 Sensu monitoring framework backed by the Redis ...
stable/sensu 0.2.5 0.28 DEPRECATED Sensu monitoring framework backed by...
DEPRECATED版本的一般是废弃的,不使用。
查看安装说明
helm show readme bitnami/redis
helm pull bitnami/redis
tar -xvf redis-17.4.3.tgz
修改 storageClass 为 managed-nfs-storage
设置 redis 密码 password
修改集群架构 architecture,默认是主从(replication,3个节点),可以修改为 standalone 单机模式
修改实例存储大小 persistence.size 为需要的大小
修改 service.nodePorts.redis 向外暴露端口,范围 <30000-32767>
给他一个单独命名空间(方便管理,实际生产看情况):
kubectl create namespace redis
cd ../
helm install redis ./redis -n redis
# 查看 helm 安装列表
helm list
# 查看 redis 命名空间下所有对象信息
kubectl get all -n redis
helm delete redis -n redis
要想升级 chart 可以修改本地的 chart 配置并执行:
helm upgrade [RELEASE] [CHART] [flags]
helm upgrade redis ./redis
使用 helm ls 的命令查看当前运行的 chart 的 release 版本,并使用下面的命令回滚到历史版本:
helm rollback <RELEASE> [REVISION] [flags]
查看历史
helm history redis
回退到上一版本
helm rollback redis
回退到指定版本
helm rollback redis 3