在理解Helm Controller前,整理一下Helm的作用:
Helm把Kubernetes资源(比如deployments、services或 ingress等)打包到一个chart中,而chart被保存到chart仓库。通过chart仓库可用来存储和分享chart。Helm使发布可配置,支持发布应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作。
简单来说,Helm就是一个第三方部署k8s应用的工具
另外,常用的Helm版本有v2跟v3,Helm v3区别于v2主要有以下特性:
1、移除了Tiller(from SA to kubeconfig)
原来Helm v2需要在 Kubernetes 集群中部署Tiller(Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件),Tiller pod 根据自身SA权限部署应用。并且在多租户环境下,为了进行权限管理需要部署多个Tiller。
在 Helm v3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的SA权限来进行一系列操作。这样做法即简单,又安全。
2、三方会谈 (Three-way Strategic merge patch)
会兼容通过第三方修改的属性(如通过kubectl edit修改的属性,在helm upgrade时会考虑进去)
3、使用Secret作为默认存储
4、crd-install hook迁移到了crds/路径等
Helm Controller
Helm Controller实际上就是一个CRD Controller,管理的是HelmChart类型的CRD API
1、Helm-controller 运行在master节点并list/watch HelmChart CRD对象
2、CRD onChange时执行Job更新
3、Job Container使用rancher/kilipper-helm为entrypoint
4、Killper-helm内置helm cli,可以安装/升级/删除对应的chart
以下通过实操来理解Helm Controller
通过nginx-helmchar.yaml定义一个新的HelmChart
由于在/var/lib/rancher/k3s/server/manifests目录下的yaml会自动apply,可以看到名为nginx的helmcharts已经创建
在default namespace下可以看到通过helm创建的deployment及pod
通过HelmChart部署应用,有以下好处
1、HelmChart把Helm的操作变成对CRD API的管理,当需要对应用进行修改时,只需修改HelmChart相关属性即可,Helm-controller会主动监听API对象是否发生变化;
2、省去在宿主机上安装helm的步骤;
3、兼容原生Helm v3 CLI,即可通过Helm v3查看已经安装的release