一、认识Helm
在之前的文章中的应用部署过程可知,在Kubernetes系统上面部署容器化应用时需要事先手动编写资源配置清单文件,而且其每一次的配置定义基本上都是硬编码。基本上无法实现复用。对于较大规模的应用场景、分发、版本控制、查找、回滚甚至是查看都将是用户的噩梦。Helm却可以大大的简化应用管理的难度。
简单来说,Helm就是Kubernetes的应用程序包管理器,类似于Linux系统之上的yum或apt-get等。可用于实现帮助用户查找、分享及使用Kubernetes应用程序,目前的版本由CNCF所维护。它的核心打包功能组件称为chart,可以帮助用户创建、安装及升级复杂应用。
Helm将Kubernetes的资源(如Deployment、Service或ConfigMap等)打包到一个Chart中,制作并测试完成的各个Charts将保存到Charts仓库进行存储和分发。另外,Helm实现了可配置的发布,它支持应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除和更新等操作。Helm的架构图如下图所示:
简单来说,Helm其实就是一个基于Kubernetes的程序包(资源包)管理器,它将一个应用的相关资源组织成Charts,并通过Charts管理程序包,其使用优势可以简单总结为如下几个方面:
- 管理复杂应用:Charts能够描述哪怕是最复杂的程序结构,其提供了可重复使用的应用安装的定义。
- 易于升级:使用就地升级和自定义钩子来解决更新的难题。
- 简单分享:Charts易于通过公共或私有服务完成版本化、分享及主机创建。
- 回滚:可使用"helm rollback"命令轻松实现快速回滚。
二、Helm的核心术语及架构
Helm将Kubernetes应用的相关配置组织成Charts,并通过它完成应用的常规管理操作。通常来说,使用Charts管理应用的流程包括从0开始创建Charts、将Charts及其相关的文件打包为归档格式、将Charts存储于仓库(repository)中并与之交互、在Kubernetes集群中安装或卸载Charts以及管理经Helm安装的应用的版本发行周期,因此,对Helm来说,它具有以下几个关键概念:
- Charts:即一个Helm的程序包,它包含运行了一个Kubernetes应用所需要的镜像、依赖关系和资源的定义等等,必要时还会包含Service的定义;它类似于APT的dpkg文件或者yum的rpm文件。
- Repository:Charts的仓库,用于集中存储和分发Charts,类似于Perl的CPAN,或者Python的PYPI。
- Config:应用程序实例化安装运行时使用的配置信息。
- Release:应用程序实例化运行于Kubernetes集群中的一个Charts实例,在同一个集群上,一个Charts可以使用不同的Config重复安装多次,每次安装都会创建一个新的Release。
事实上,Charts更像是存储于Kubernetes集群之外的程序,它的每次安装是指在集群中使用专门配置运行一个实例,执行过程有点类似于在操作系统上基于程序启动一个进程。
Helm主要是由Helm客户端、Tiller服务器和Charts仓库(repository)组成。
Helm客户端是命令行客户端工具,采用Go语言编写,基于gRPC协议与Tiller server进行交互。它主要完成如下任务: - 本地Charts开发
- 管理Charts仓库
- 与Tiller服务器交互:发送Charts以安装、查询Release的相关信息以及升级或卸载已有的Release。
Tiller server是托管运行于Kubernetes集群之中的容器化服务应用,它接收来自Helm客户端的请求,并在必要时于Kubernetes API Server进行交互。它主要完成以下任务: - 监听来自于Helm客户端的请求。
- 合并Charts和配置以构建一个Release。
- 向Kubernetes集群安装Charts并对相应的Release进行跟踪。
- 升级和卸载Charts
通常,用户于Helm客户端本地遵循其格式编写Charts文件,而后即可部署于Kubernetes集群之上运行为一个特定的Release。仅在有分发需求时,才应该将同一应用的Charts文件打包成归档压缩格式提交到特定的Charts仓库。仓库既可以运行为公共托管平台,也可以是用户自建的服务器,仅供特定的组织或个人使用。
三、Helm的安装
1)创建helm目录并下载helm(需要主机提前配置科学上网)
]# mkdir helm
]# cd helm
]# curl -L https://git.io/get_helm.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
100 7160 100 7160 0 0 3692 0 0:00:01 0:00:01 --:--:-- 19724
Downloading https://get.helm.sh/helm-v2.17.0-linux-amd64.tar.gz
Preparing to install helm and tiller into /usr/local/bin
helm installed into /usr/local/bin/helm
tiller installed into /usr/local/bin/tiller
Run 'helm init' to configure helm.
2)创建Tiller的Service Account
]# vim helm-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
]# kubectl apply -f helm-rbac.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
3)初始化Helm
]# helm init --service-account=tiller --history-max 300
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://charts.helm.sh/stable
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://v2.helm.sh/docs/securing_installation/
4)查看Tiller资源信息
]# kubectl get deployment tiller-deploy -n kube-s