从18年初开始使用helm,也看到过helm3版本的一些规划路线图,对里面的一些功能比较期待。就在昨天helm项目发布了helm3-alpha.1版本,现在迫不及待想要试试新功能,哈哈…
新功能总览
- 移除Tiller 组件
- Release name 可缩小至Namespace范围(意味着release name 可重复)。
- 默认关闭随机生成release name,需要显示启用选项
--generate-name
- 移除 helm serve 提供本地repository 功能
- 将requirements.yaml的内容移到Chart.yaml文件中
- 支持 helm push 到远端 chart repository,支持登陆认证
- 支持 Chart Library(keeping charts DRY.)
- 简化内置模版里面的对象
- 使用JSONSchema验证chart的Values
其它是一些终端命令的重命名:
helm delete -> helm uninstall (–purge 默认就已经启用,所以如果需要显示保留,在卸载时需添加–keep-history)
helm inspect -> helm show
helm fetch -> helm pull
移除Tiller
这个改动应该是最大的吧,直接去除了一个服务端组件,从此只有helm这个客户端来和kubernetes集群进行交互操作。 所以从之前的交互流程: helm client –gRPC–> helm server (Tiller) –> kubernetes api (install chart)
变成: helm client –gRPC–> kubernetes api(install chart)
因为helm 是使用了kubeconfig来与 kubernetes集群通信,所以如 helm 3的changelog中说的,管理员可以进行更细粒度的权限控制。 还有release 也会在集群中进行记录。只不过是随着release chart在同一Namespace中。
Release name 范围缩小至Namespace
在helm2,release name 是全局的,意味着即使安装某个chart到不同的Namespace,release name名字也不能一样。这个缺陷应该困扰了很多helm用户。
在helm3之前,Chart Release 记录都和Tiller服务一起,在一个Namespace中。现在由于移除了Tiller组件,每个chart的Release记录与它部署到哪个namespace一样,存在同一个Namespace中。这样就可以在不同Namespace中使用同一个Release name。
NOTES: 在Helm 2 之前,Release 信息以ConfigMap存储在tiller 部署的Namespace中。Helm 3是以Secret资源来存储Release信息的。
动手做一做
安装helm3
sudo wget https://get.helm.sh/helm-v3.0.0-alpha.1-linux-amd64.tar.gz && tar -xvf helm-v3.0.0-alpha.1-linux-amd64.tar.gz
sudo cp linux-amd64/helm /usr/local/bin/
初始化helm
helm init
不指定Release name安装一个chart
$ helm install stable/nginx
Error: must either provide a name or specify --generate-name
So,下面是正确方式:
helm install stable/traefik --generate-name
在不同Namespace中使用同一个Release name 安装chart
helm install traefik-test -n default stable/traefik
使用kubectl切换到默认namespace为目标部署namespace中,这里官方文档暂时没有更新。
格式:kubectl config set-context CONTENT_NAME --namespace NAMESPACE
,如:
kubectl config set-context gke_hi42-top_us-east1-b_my-test --namespace qa
如果不自行使用kubectl切换,那么会报以下错误提示:
Error: cannot re-use a name that is still in use
上面的错误提示不太明显,应该在加上一条:“请手动使用kubectl切换到目标Namespace”。
不过还是觉得在使用 -n NAMESPACE
之后,应该由helm 内部来实现切换context,而不是让用户来执行kubectl config。
使用 traefik-test 作为Release name继续安装Chart到qa namespace中:
helm install traefik-test -n qa stable/traefik
查看已安装的chart
现在我们可以列出所有安装的chart release:
helm list --all-namespaces
NAME NAMESPACE REVISION UPDATED STATUS CHART
traefik-test default 1 2019-05-16 19:20:07.537745555 +0800 +08 deployed traefik-1.68.2
traefik-test qa 1 2019-05-16 19:47:31.145192715 +0800 +08 deployed traefik-1.68.2
traefik-1558005396 default 1 2019-05-16 19:16:40.235417243 +0800 +08 deployed traefik-1.68.2
从上面的输出可以看到,NAMESPACE那一列也由最后一列提到了第二列。方便观测。
NOTES: --all 选项只会列出当前kube context文件中定义namesapce中部署的release
小总结
helm 3 的一些功能可谓是从很早之前就开始计划,现在终于来了。解决了很多使用上的不便。虽然现在依然有些不完善之处,考虑到HELM 在CNCF还是孵化状态,希望后面能越来越好,也期待早日”毕业”。
参考:helm v3 docs