目录
helm简介
很多人都使用过Ubuntu下的ap-get或者CentOS下的yum, 这两者都是Linux系统下的包管理工具。采用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载应用程序。
我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。
对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。
除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
Helm 组件及相关术语
Helm
Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
Tiller
Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
Chart
Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。
Repoistory
Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
Release
使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。
注:需要注意的是:Helm 中提到的 Release 和我们通常概念中的版本有所不同,这里的 Release 可以理解为 Helm 使用 Chart 包部署的一个应用实例。
Helm工作原理
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
- Tiller根据Chart和Values生成一个Release
- Tiller将Release发送给Kubernetes用于生成Release
Chart Update过程:
- Helm从指定的目录或者tgz文件中解析出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
helm3 VS helm2
helm v2 版本: 包含两个组件,分别是 helm 客户端 和 Tiller 服务器, helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等;Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互。
helm v3 版本: 移除了Tiller,helm直接和K8s交互, SA通过 kuberconfig 配置认证。
一、Helm 客户端安装(v3.5为例)
Helm 的安装方式很多,这里采用二进制的方式安装。更多安装方法可以参考 Helm 的官方帮助文档。
方式一:使用官方提供的脚本一键安装
1 2 3 |
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh $ chmod 700 get_helm.sh $ ./get_helm.sh |
方式二:手动下载安装
从官网下载最新版本的二进制安装包到本地:https://github.com/kubernetes/helm/releases。
注意:是从Installation and Upgrading
这里下,不是Assets
里面下的。
1 2 3 4 5 6 7 8 |
# 下载二进制文件 wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz # 解压压缩包 tar -zxvf helm-*.tar.gz # 把 helm 指令放到bin目录下 mv linux-amd64/helm /usr/local/bin/helm # 验证 helm version |
二、常用 chart 源
①、初始化 chart 源仓库
准备好 helm 后,需要添加 helm 源数据仓库。有以下几个常见的源库
- https://charts.helm.sh/stable : helm官网 chart 库,稳定
- https://apphub.aliyuncs.com : 阿里云chart 库,速度最快
添加 chart 库
格式:helm repo add
自定义名称 chart库的地址
1 2 |
[root@k8s-master ~]# helm repo add stable https://charts.helm.sh/stable [root@k8s-master ~]# helm repo add aliyuncs https://apphub.aliyuncs.com |
查看当前集群有哪些 chart 库
helm repo list
1 2 3 4 |
[root@k8s-master ~]# helm repo list NAME URL stable https://kubernetes-charts.storage.googleapis.com/ aliyuncs https://apphub.aliyuncs.com |
查看某个 chart 库当中有哪些可安装程序
helm search repo chart库名
1 2 3 4 |
[root@k8s-master ~]# helm search repo aliyuncs NAME CHART VERSION APP VERSION DESCRIPTION aliyuncs/admin-mongo 0.1.0 1 MongoDB管理工具(web gui) aliyuncs/aerospike 0.3.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes |
②、查找想要安装的软件程序
docker search repo 程序名
例:helm search repo nginx 查找 nginx 程序都有哪些版本的应用
1 2 3 4 5 6 7 8 9 10 11 |
[root@k8s-master ~]# helm search repo nginx NAME CHART VERSION APP VERSION DESCRIPTION aliyuncs/nginx 5.1.5 1.16.1 Chart for the nginx server aliyuncs/nginx-ingress 1.30.3 0.28.0 An nginx Ingress controller that uses ConfigMap... aliyuncs/nginx-ingress-controller 5.3.4 0.29.0 Chart for the nginx Ingress controller aliyuncs/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego aliyuncs/nginx-php 1.0.0 nginx-1.10.3_php-7.0 Chart for the nginx php server stable/nginx-ingress 1.40.1 0.32.0 An nginx Ingress controller that uses ConfigMap... stable/nginx-ldapauth-proxy 0.1.4 1.13.5 nginx proxy with ldapauth stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego stable/gcloud-endpoints 0.1.2 1 DEPRECATED Develop, deploy, protect and monitor... |
③、部署 Helm 应用
要安装新软件包,请使用helm install
命令。
它包含两个参数:您选择的 发行版名称 要安装的 chart 的名称
例:安装一个 Nginx 应用
查看都有哪些软件可用:helm search repo nginx
安装aliyun 的nginx :helm install nginx nginx/aliyuncs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@k8s-master ~]# helm install nginx aliyuncs/nginx NAME: nginx LAST DEPLOYED: Thu Jun 25 17:29:46 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Get the NGINX URL: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace default -w nginx' export SERVICE_IP=$(kubectl get svc --namespace default nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") echo "NGINX URL: http://$SERVICE_IP/" |
查看访问的 SVC 映射端口:kubectl get svc --namespace default -w nginx
1 2 3 |
[root@k8s-master ~]# kubectl get svc --namespace default nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.99.153.167 <pending> 80:30367/TCP,443:32022/TCP 3m |
访问该 nginx 的 web 页面:curl -I 192.168.168.11:30367
要跟踪发布的状态或重新读取配置信息,可以使用 helm status +应用名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@k8s-master ~]# helm status nginx NAME: nginx LAST DEPLOYED: Thu Jun 25 17:29:46 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Get the NGINX URL: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace default -w nginx' export SERVICE_IP=$(kubectl get svc --namespace default nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") echo "NGINX URL: http://$SERVICE_IP/" |
④、查看helm 生成应用、卸载应用
helm list
查看集群中有哪些 helm 应用
helm uninstall +应用名
卸载应用
⑤、设置参数
参数设置有两种方式:
1、通过修改values.yaml
文件;
2、通过--set
命令。
命令格式:helm install --set key=value
--set
参数可以指定多个参数,他的值会覆盖values.yaml
定义的值,对象类型数据可以用 .
(点)分割属性名,例子: --set apiAppResources.requests.cpu=1
1 2 |
helm install web statble/nginx \ --set port=80 |
⑥、调试
helm命令加上--debug --dry-run
两个参数,让helm输出yaml清单文件,但是不执行创建。
例子:
1 2 3 |
helm install web statble/nginx \ --set port=80 \ --dry-run --debug |