Helm 是构建于 Kubernetes 之上的包管理器,可以理解为 yum,homebrew 或者 pip,用于简化包分发,安装,版本管理等操作流程
基本概念
- Chart
chart 就是 Helm 所管理的包,包含着一个应用要部署至 Kubernetes 上所必须的所有资源
- Release
Release 就是 chart 在 Kubernetes 上部署后的实例,chart 每次部署都会产生一次 Release
- Repository
- Config
Config 用于部署 chart 时自定义配置,在部署的时候,会将 Config 和 chart 进行合并,共同构成将部署的应用
Helm 是一个 C/S 架构,分为客户端helm 和服务端Tiller
- Mac
1 |
brew <span class="token function">install</span> kubernetes-helm |
- Ubuntu
1 |
<span class="token function">sudo</span> snap <span class="token function">install</span> helm --classic |
服务端安装要求 $HOME/.kube/config
配置正确且有kubectl
操作权限
- 创建账户
tiller-rbac.yaml
1 |
<span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> v1 <span class="token key atrule">kind</span><span class="token punctuation">:</span> ServiceAccount <span class="token key atrule">metadata</span><span class="token punctuation">:</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> tiller <span class="token key atrule">namespace</span><span class="token punctuation">:</span> kube<span class="token punctuation">-</span>system <span class="token punctuation">---</span> <span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> rbac.authorization.k8s.io/v1 <span class="token key atrule">kind</span><span class="token punctuation">:</span> ClusterRoleBinding <span class="token key atrule">metadata</span><span class="token punctuation">:</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> tiller <span class="token key atrule">roleRef</span><span class="token punctuation">:</span> <span class="token key atrule">apiGroup</span><span class="token punctuation">:</span> rbac.authorization.k8s.io <span class="token key atrule">kind</span><span class="token punctuation">:</span> ClusterRole <span class="token key atrule">name</span><span class="token punctuation">:</span> cluster<span class="token punctuation">-</span>admin <span class="token key atrule">subjects</span><span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">kind</span><span class="token punctuation">:</span> ServiceAccount <span class="token key atrule">name</span><span class="token punctuation">:</span> tiller <span class="token key atrule">namespace</span><span class="token punctuation">:</span> kube<span class="token punctuation">-</span>system |
1 |
kubectl apply -f tiller-rbac.yaml |
1 |
helm init --service-account tiller |
这种方式默认会使用 gcr.io/kubernetes-helm/tiller
,可以通过指定镜像的方式初始化
1 |
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --service-account tiller |
1 |
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://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts Adding local repo with URL: http://127.0.0.1:8879/charts <span class="token variable">$HELM_HOME</span> has been configured at /root/.helm. Tiller <span class="token punctuation">(</span>the Helm server-side component<span class="token punctuation">)</span> has been upgraded to the current version. |
- 查看版本
1 |
helm version |
1 |
Client: <span class="token operator">&</span>version.Version<span class="token punctuation">{<!-- --></span>SemVer:<span class="token string">"v2.11.0"</span>, GitCommit:<span class="token string">"79d07943b03aea2b76c12644b4b54733bc5958d6"</span>, GitTreeState:<span class="token string">"clean"</span><span class="token punctuation">}</span> Server: <span class="token operator">&</span>version.Version<span class="token punctuation">{<!-- --></span>SemVer:<span class="token string">"v2.11.0"</span>, GitCommit:<span class="token string">"2e55dbe1fdb5fdb96b75ff144a339489417b146b"</span>, GitTreeState:<span class="token string">"clean"</span><span class="token punctuation">}</span> |
- 查看 deploy
1 |
kubectl -n kube-system get deploy tiller-deploy |
1 |
NAME READY UP-TO-DATE AVAILABLE AGE tiller-deploy 1/1 1 1 91s |
helm 通过 gRPC 将 chart 发送至 Tiller,Tiller 则通过内置的 Kubernetes 客户端与Kubernetes 的API Server 进行交流,将 chart 进行部署,并生成 Release 用于管理
1 |
kubectl get svc -o wide -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT<span class="token punctuation">(</span>S<span class="token punctuation">)</span> tiller-deploy ClusterIP 10.107.157.104 <span class="token operator"><</span>none<span class="token operator">></span> 44134/TCP 24h app<span class="token operator">=</span>helm,name<span class="token operator">=</span>tiller |
Tiller 默认采用 ClusterIP 类型的 Service 进行部署,但是 ClusterIP 类型的 Service 仅限于集群内访问,所以 Helm 通过 socat 的端口转发,进而实现本地与 Tiller 的通信