什么是Helm
在没有 Helm 之前,在 Kubernetes 部署应用需要依次部署 deploy , svc 等,步骤繁琐,配置复杂,容易出错。况且随着许多项目微服务化,复杂应用在容器中的部署显得更加复杂,Helm 通过支持发布版本管理和控制,很大程度简化了 Kubernetes 中的应用部署和管理。
Helm 本质就是让 k8s 中的应用管理可配置,能够动态生成。通过动态生成方式生成 k8s 清单文件( deploy.yaml , service.yaml ) 。然后调用 kubectl 自动执行 k8s 资源部署。
Helm 提供类似 Linux 中的 YUM 包管理器,是部署环境的流程封装。Helm 有两个重要的概念: chart 和 release
- chart 是创建一个应用信息的集合,包括各种 k8s 对象配置模板,参数定义,依赖关系,文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt, yum 中的软件安装包。
- release 是 chart 的运行实例 ,代表了一个正在运行的应用。当 chart 被安装到 k8s 集群,就生成一个 release。 chart 能够多次安装到同一个集群,每次安装都是一个 release。
Helm 架构
在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。
然而在多租户场景下,这种方式也会带来一些安全风险,我们即要对这个 ServiceAccount 做很多剪裁,又要单独控制每个租户的控制,这在当前的 Tiller 模式下看起来有些不太可能。
于是在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。这样做法即简单,又安全。
虽然 Tiller 文件被移除了,但 Release 的信息仍在集群中以 ConfigMap 的方式存储,因此体验和 Helm 2 没有区别。

Helm 安装
- 安装 helm
这边以MacOS 为例,其他操作系统详见 https://helm.sh/docs/intro/install/
yangtengcandeMacBook-Pro:prometheus yangtengcan$ brew install kubernetes-helm Updating Homebrew… ==> Downloading https://homebrew.bintray.com/bottles/helm-3.2.4_1.catalina.bottle.tar.gz
################################################################## 100.0%
==> Pouring helm-3.2.4_1.catalina.bottle.tar.gz ==> Caveats Bash completion has been installed to: /usr/local/etc/bash_completion.d zsh completions have been installed to: /usr/local/share/zsh/site-functions ==> Summary 🍺 /usr/local/Cellar/helm/3.2.4_1: 54 files, 42.7MB
- 查看 helm 版本
yangtengcandeMacBook-Pro:prometheus yangtengcan$ helm version version.BuildInfo{Version:”v3.2.4”, GitCommit:”0ad800ef43d3b826f31a5ad8dfbb4fe05d143688”, GitTreeState:”dirty”, GoVersion:”go1.14.3”}
Helm 使用
- 添加仓库
yangtengcandeMacBook-Pro:charts yangtengcan$ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts “stable” has been added to your repositories
- 创建模板
yangtengcandeMacBook-Pro:demo yangtengcan$ helm create demo yangtengcandeMacBook-Pro:demo yangtengcan$ tree . ├── Chart.yaml ├── charts # 这个 charts 依赖的其他 charts,始终被安装 ├── templates # 描述这个 Chart 的相关信息、包括名字、描述信息、版本 │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── service.yaml │ ├── serviceaccount.yaml │ └── tests │ └── test-connection.yaml └── values.yaml #模板变量文件
3 directories, 10 files
- 安装
yangtengcandeMacBook-Pro:demo yangtengcan$ helm install -f values.yaml mydemo .
NAME: mydemo
LAST DEPLOYED: Sat Jun 27 11:33:59 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods —namespace default -l “app.kubernetes.io/name=demo,app.kubernetes.io/instance=mydemo” -o jsonpath=”{.items[0].metadata.name}”)
echo “Visit http://127.0.0.1:8080 to use your application”
kubectl —namespace default port-forward $POD_NAME 8080:80
- 验证
yangtengcandeMacBook-Pro:demo yangtengcan$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mydemo-6957ff97b9-kc2bf 1/1 Running 0 4m3s
yangtengcandeMacBook-Pro:demo yangtengcan$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mydemo default 1 2020-06-27 11:33:59.080793 +0800 CST deployed demo-0.1.0 1.16.0
Helm 安装Dashboard
使用官方提供的 Chart
helm repo add stable http://mirror.azure.cn/kubernetes/charts
修改 values.yaml 镜像为国内镜像
registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
修改 service 类型为 NodePort
service: type: NodePort externalPort: 443 nodePort: 30000
部署dashboard
helm install -f values.yaml dashboard .
访问dashboard

- 创建token
yangtengcandeMacBook-Pro:kubernetes-dashboard yangtengcan$ cat sa.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
kind: ServiceAccount
name: admin
namespace: kube-system
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcilekubectl apply -f sa.yaml
- 获取token
kubectl get secret
kubectl get secret -n kube-system | grep admin-token | awk '{print $1}'-o jsonpath={.data.token} -n kube-system | base64 -d

