Helm 介绍
Helm 是 Deis 开发的一个用于Kubernetes
应用的包管理工具,主要用来管理 Charts
。有点类似 CentOS 中的 yum包管理工具。可以很方便的将之前打包的好的yaml
文件部署到Kubernetes
上。
为何需要Helm?
kubernetes上的应用对象,都是由特定的资源描述组成,包括deployment
、service
等,都保存各自文件中或集中写到一个配置文件中,然后通过kubectl apply -f ...
进行部署。
如果应用只是一个或几个这样的服务组成,上面的部署方式足够了。而对于一个复杂的应用,会有很多类似上面的资源文件,例如为服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心。且由于缺少对发布过的应用版本管理和空置,使Kubernetes
上的应用和更新等面临诸多的挑战。主要面临以下几个问题:
- 如何管理、编辑和更新这些分散的
kubernetes
应用配置文件。 - 如何把一套相关的配置文件作为一个应用进行管理。
- 如何分发和重用
kubernetes
的应用配置。
Helm 组件
✏️ helm
Helm是一个命令行下的客户端工具,主要用于kubernetes
应用程序Chart
的创建、打包、发布和管理
✏️ Tiller
Tiller 是 Helm 的服务端,部署在Kubernetes
集群中,Tiller 用于接收 Helm 的请求,并根据 Chart 生成 kubernetes 的部署文件(Helm称为Release),然后提交给 Kubernetes 创建应用,Tiller 还提供了 Release 的升级、删除、回滚等一系列功能
✏️ Chart
Helm 的软件包,采用 TAR 格式,类似于 yum 的 rpm包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件
✏️ Release
基于 Chart 部署实体,一个 chart 被 helm 运行后将会生成对应的一个 release;将在 kubernetes 中创建出真实运行的资源对象。
✏️ Repoistory
Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
Helm 工作原理
下图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart软件仓库)、Chart(软件包)之间的关系。
Chart Install 过程
- Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
- Heml 将指定的 Chart 结构和 Values 信息通过 gRPC 传递给 Tiller。
- Tiller 根据 Chart 和 Values 生成一个 Release。
- Tiller 根据 Release 发送给 Kubernetes 用于生成 Release。
Chart Update 过程
- Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
- Helm 将需要更新的 Release 的名称、Chart结构和 Values 信息传递给 Tiller。
- Tiller 生成 Release 并更新指定名称的 Release 和 History。
- Tiller 将 Release 发送给 Kubernetes 用于更新 Release。
Chart Rollback 过程
- Helm 将要回滚的 Release 的名称传递给 Tiller。
- Tiller 根据 Release 的名称查找 History。
- Tiller 从 History 中获取上一个 Release。
- Tiller 将上一个 Release 发送给 Kubernetes 用于替换当前 Release。
Chart 处理依赖说明
Tiller 在处理 Chart 时,直接将 Chart 以及其依赖的所有 Charts 合并为一个 Release,同时传递给 Kubernetes。因此 Tiller 并不负责管理依赖之间的启动顺序。Chart 中的应用需要能够自行处理依赖关系。
Helm 版本介绍
Helm2时期,添加了Tiller组件和GRPC来处理Helm chart的安装和管理,呈现chart并将它们推送到Kubernetes API服务器,2019年11月13日,Helm 团队发布了 Helm v3
的第一个稳定版本
架构变化
很明显从helm v3
移除了 Tiller
Helm 3新特性
-
Release
名称可以在不同命名空间重用 -
支持将 Chart 推送至 Docker 镜像仓库中
-
使用JSONSchema验证chart values
-
其他特性如下
-
为了更好地协调其他包管理者的措辞
Helm CLI
个别更名helm delete` 更名为 `helm uninstall helm inspect` 更名为 `helm show helm fetch` 更名为 `helm pull 但以上旧的命令当前仍能使用
-
移除了用于本地临时搭建
Chart Repository
的helm serve
命令。 -
自动创建名称空间
在不存在的命名空间中创建发行版时,Helm 2创建了命名空间。Helm 3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误。
-
不再需要
requirements.yaml
, 依赖关系是直接在chart.yaml
中定义。
Helm 部署
helm 部署方式有很多,可以参考官方文档
helm v2 部署
1.下载helm
# wget https://mirrors.huaweicloud.com/helm/v2.16.9/helm-v2.16.9-linux-amd64.tar.gz
2.安装配置
# tar xvzf helm-v2.16.9-linux-amd64.tar.gz
# cp -av linux-amd64/helm /usr/bin/
# cp -av linux-amd64/tiller /usr/bin/
3.指定配置文件(此步骤视情况而定,比如rke部署的k8s集群则需要;kubeadm部署的集群默认在master节点则不需要)
# vim /root/.bashrc
alias helm='helm --kubeconfig /home/rancher/kube_config_cluster.yml'
# source /root/.bashrc
4.在kube-system命名空间中创建serviceaccount
# kubectl create serviceaccount --namespace kube-system tiller
5.创建ClousterRoleBinding以授予tiller账户对集群的访问权限
# kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=kube-system:tiller
6.安装helm server(tiller),注意保持版本号相同
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --force-upgrade
7.查看tiller服务是否正常运行
# kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-79f8998f84-85lwq 1/1 Running 0 45s
8.查看版本(注意:client和server版本必须要保持一致)
# helm version
Client: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
补充:如果需要在kubernetes
中卸载已部署的 Tiller, 可使用如下命令进行卸载
# helm reset
helm v3 部署
helm v3
已经移除了tiller
,所以只需要部署helm客户端即可,即解压软件移动命令即可
# wget https://mirrors.huaweicloud.com/helm/v3.2.1/helm-v3.2.1-linux-amd64.tar.gz
# tar xvzf helm-v3.2.1-linux-amd64.tar.gz
# cp -av linux-adm64/helm /usr/bin/
helm 常用命令
命令 | 描述 |
---|---|
create | 创建一个chart并指定名字 |
dependency | 管理chart依赖 |
get | 下载一个release。可用子命令:all、hooks、manifest、notes、values |
history | 获取release历史 |
install | 安装一个chart |
list | 列出release |
package | 将chart目录打包到chart存档文件中 |
pull | 从远程仓库中下载chart并解压到本地 # helm pull stable/mysql --untar |
repo | 添加,列出,移除,更新和索引chart仓库。可用子命令:add、index、list、remove、update |
rollback | 从之前版本回滚 |
search | 根据关键字搜索chart。可用子命令:hub、repo |
show | 查看chart详细信息。可用子命令:all、chart、readme、values |
status | 显示已命名版本的状态 |
template | 本地呈现模板 |
uninstall | 卸载一个release |
upgrade | 更新一个release |
version | 查看helm客户端版本 |
添加Chart仓库
常用仓库如下:
- 微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。
- 阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
- 官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,由于众所周知原因,在国内有点不好使,故不推荐。
- elasticsearch (https://helm.elastic.co) elastic
✏️ 添加仓库
添加微软仓库为 stable
# helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
添加阿里云仓库为 aliyun
# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
✏️ 查看仓库
# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
✏️ 查看一个仓库中所有的包
# helm search repo stable
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.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes
stable/airflow 7.1.5 1.10.10 Airflow is a platform to programmatically autho...
stable/ambassador 5.3.2 0.86.1 DEPRECATED A Helm chart for Datawire Ambassador
stable/anchore-engine 1.6.9 0.7.2 Anchore container analysis and policy evaluatio...
✏️ 删除仓库
# helm repo remove aliyun
"aliyun" has been removed from your repositories
Helm 基本使用
部署一个应用
这里示例通过helm部署一个MySQL进行示例
1.查找 chart
:
# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
stable/mysql 1.6.4 5.7.30 Fast, reliable, scalable, and easy to use open-...
......
2.查看下这个chart
的变量信息,这里将变量文件保存到本地,进行修改后再使用,这里我们将persistence
中enabled
改为false
,表示不适用存储卷,查看变量文件可以发现会自动绑定pvc
,但是这里没有提前准备pv
,如果不修改也可以,先创建一个pv即可。
# helm show values stable/mysql > values.yaml
# vim values.yaml
persistence:
enabled: false # 修改为false
## database data Persistent Volume Storage Class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
# storageClass: "-"
accessMode: ReadWriteOnce
size: 8Gi
annotations: {}
3.通过helm install
进行安装,这里由于修改了values
,所以通过-f
指定了本地的values.yaml
文件
# helm install my-mysql -f values.yaml stable/mysql
NAME: my-mysql
LAST DEPLOYED: Sun Jun 21 13:35:04 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
my-mysql.default.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h my-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward svc/my-mysql 3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
4.查看状态
# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-mysql default 1 2020-06-21 13:38:32.133419251 +0800 CST deployed mysql-1.6.4 5.7.30
查看发布状态
# helm status my-mysql
查看pod状态
# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-mysql-7557c5798c-lvshx 1/1 Running 0 35s
5.根据上面提示的查看密码,进行连接MySQL进行测试
# kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
i8MgJpwwZe
# kubectl exec -it my-mysql-7557c5798c-lvshx -- mysql -u root -pi8MgJpwwZe
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
构建一个 Helm Chart
上面变示例了通过helm部署一个应用(MySQL)。我们也可以进行自行构建Chart
进行部署。
Chart 目录结构说明
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
- Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
- values.yaml:用于存储 templates 目录中模板文件中用到的变量的值。
- templates:目录里面存放所有的 yaml 模板文件。
- charts:目录里存放这个 chart 依赖的所有子 chart。
- NOTES.txt:用于介绍 Chart 帮助信息,helm install 部署后展示给用户;例如:如何使用这个Chart,列出缺省的设置等。
- _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用