记录一下helm v3版本的新特性以及试用情况 helm v2与v3可以共存,大家都用的是~/.helm

helm v3的特性

最大特性就是去掉了tiller,使用`~/.kube/config作为与集群的通信的桥梁

在 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 没有区别。

V3带来的变化

Release 不再是全局资源

在 Helm 2 中,Tiller 自身部署往往在 kube-system 下,虽然不一定是 cluster-admin 的全局管理员权限,但是一般都会有 kube-system 下的权限。 当 Tiller 想要存储一些信息的时候,它被设计成在 kube-system 下读写 ConfigMap 。

在 Helm 3 中,Helm 客户端使用 kubeconfig 作为认证信息直接连接到 Kubernetes APIServer,不一定拥有 cluster-admin 权限或者写 kube-system 的权限,因此它只能将需要存储的信息存在当前所操作的 Kubernetes Namespace 中,继而 Release 变成了一种命名空间内的资源。

Helm v2存储的release 都在tiller 所在的namespace,而且是以cm进行存储的。 Helm v3,所有的信息都存储在release对应的namespace 下,而且以secret存储。这是v2和v3很不相同的地方。

Values 支持 JSON Schema 校验器

Helm Charts 是一堆 Go Template 文件、一个变量文件 Values 和一些 Charts 描述文件的组合。Go Template 和 Kubernetes 资源描述文件的内容十分灵活,在开发迭代过程中,很容易出现一些变量未定义的问题。Helm 3 引入了 JSON Schema 校验,它支持用一长串 DSL 来描述一个变量文件的格式、检查所有输入的变量的格式。

当我们运行 helm installhelm upgradehelm linthelm template 命令时,JSON Schema 的校验会自动运行,如果失败就会立即报错。

推送 Charts 到容器镜像仓库中

互联网上有一些 Helm Charts 托管平台,负责分发常见的开源应用,例如 Helm HubKubeApps Hub

在企业环境中,用户需要私有化的 Helm Charts 托管。最常见的方案是部署 ChartMuseum,使其对接一些云存储。当然也有一些较为小众的方案,比如 App-Regsitry 直接复用了 Docker 镜像仓库 Registry V2,再比如 helm-s3 直接通过云存储 S3 存取 Charts 文件。

如今在 Helm 3,Helm 直接支持了推送 Charts 到容器镜像仓库的能力,希望支持满足 OCI 标准的所有 Registry。但这部分还没有完全被开发完,会在未来的 alpha 版本中被完善。

docker run -dp 5000:5000 --restart=always --name registry registry:2

然后下载一个chart包helm fetch stable/wordpress

# helmv3 chart save wordpress localhost:5000/wordpress:latest
Name: wordpress
Version: 0.6.13
Meta: sha256:83c48dd3c01a2952066ead67023ea14963a88db4287650baad5ea1ddd8ff9590
Content: sha256:248c8c68f4f614003c8b1a9d78787e5f07e979e9b996981df993cf380f498c97
latest: saved


# ./helmv3 chart list
REF                                NAME         VERSION    DIGEST     SIZE        CREATED
localhost:5000/wordpress:latest    wordpress    0.6.13     248c8c6    12.0 KiB    11 seconds


# helmv3 chart push localhost:5000/wordpress:latest
The push refers to repository [localhost:5000/wordpress]
Name: wordpress
Version: 0.6.13
Meta: sha256:83c48dd3c01a2952066ead67023ea14963a88db4287650baad5ea1ddd8ff9590
Content: sha256:248c8c68f4f614003c8b1a9d78787e5f07e979e9b996981df993cf380f498c97
latest: pushed to remote (2 layers, 12.6 KiB total)

代码复用 - Library Chart 支持

Helm 3 中引入了一种新的 Chart 类型,名为 Library Chart 。它不会部署出一些具体的资源,只能被其他的 Chart 所引用,提高代码的可用复用性。当一个 Chart 想要使用该 Library Chart 内的一些模板时,可以在 Chart.yaml 的 dependencies 依赖项中指定。

其他的一些变化

  • Go Import 的路径由 k8s.io/helm 变成了 helm.sh/helm
  • 简化了 Chart 内置变量 Capabilities 的一些属性
  • helm install 不再默认生成一个 Release 的名称,除非指定了 --generate-name
  • 移除了用于本地临时搭建 Chart Repository 的 helm serve 命令
  • helm delete 更名为 helm uninstall , helm inspect 更名为 helm show , helm fetch 更名为 helm pull ,但以上旧的命令当前仍能使用
  • requirements.yaml 被整合到了 Chart.yaml 中,但格式保持不变

安装过程

安装过程变得非常简单了,只需要安装client即可

# wget https://cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com/helm-v3.0.0-alpha.1-linux-amd64.tar.gz
--2019-07-10 09:50:39--  https://cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com/helm-v3.0.0-alpha.1-linux-amd64.tar.gz
正在解析主机 cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com (cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com)... 118.31.219.223
正在连接 cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com (cloudnativeapphub.oss-cn-hangzhou.aliyuncs.com)|118.31.219.223|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:12711766 (12M) [application/x-gzip]
正在保存至: “helm-v3.0.0-alpha.1-linux-amd64.tar.gz”

100%[=======================================================================================================================>] 12,711,766  1.31MB/s 用时 9.1s

2019-07-10 09:50:53 (1.34 MB/s) - 已保存 “helm-v3.0.0-alpha.1-linux-amd64.tar.gz” [12711766/12711766])

# ls
helm-v3.0.0-alpha.1-linux-amd64.tar.gz
# tar -zxf helm-v3.0.0-alpha.1-linux-amd64.tar.gz
# cd linux-amd64/
# mv helm /usr/local/bin/helmv3

使用过程

添加仓库

与V2是共享的!

# helm repo list
NAME            URL
local           http://127.0.0.1:8879/charts
microsoft       https://mirror.azure.cn/kubernetes/charts/

# helmv3 repo add ali-apphub https://apphub.aliyuncs.com
"ali-apphub" has been added to your repositories

# helm repo list
NAME            URL
local           http://127.0.0.1:8879/charts
microsoft       https://mirror.azure.cn/kubernetes/charts/
ali-apphub      https://apphub.aliyuncs.com

安装应用

helmV2安装的应用helmV3看不见,反之亦然!

先使用v2安装一次

# helm install ali-apphub/guestbook --set service.type=NodePort
NAME:   invisible-worm
LAST DEPLOYED: Wed Jul 10 09:57:57 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
invisible-worm-guestbook  0/2    0           0          0s
redis-master              0/1    0           0          0s
redis-slave               0/2    0           0          0s

==> v1/Service
NAME                      TYPE          CLUSTER-IP      EXTERNAL-IP  PORT(S)         AGE
invisible-worm-guestbook  LoadBalancer  10.101.48.210   <pending>    3000:25883/TCP  0s
redis-master              ClusterIP     10.105.253.249  <none>       6379/TCP        0s
redis-slave               ClusterIP     10.105.98.176   <none>       6379/TCP        0s


NOTES:
1. Get the application URL by running these commands:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc -w invisible-worm-guestbook --namespace default'
  export SERVICE_IP=$(kubectl get svc --namespace default invisible-worm-guestbook -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  echo http://$SERVICE_IP:3000

安装完成后查看信息

# helm status invisible-worm
LAST DEPLOYED: Wed Jul 10 09:57:57 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
invisible-worm-guestbook  2/2    2           2          13m
redis-master              1/1    1           1          13m
redis-slave               2/2    2           2          13m

==> v1/Pod(related)
NAME                                     READY  STATUS   RESTARTS  AGE
invisible-worm-guestbook-cbc8b5c8-bwwg4  2/2    Running  0         13m
invisible-worm-guestbook-cbc8b5c8-xb492  2/2    Running  0         13m
redis-master-9954bc48d-w4kvk             2/2    Running  0         13m
redis-slave-75f9c8bc49-msgnm             2/2    Running  0         13m
redis-slave-75f9c8bc49-wzn5q             2/2    Running  0         13m

==> v1/Service
NAME                      TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)         AGE
invisible-worm-guestbook  NodePort   10.101.48.210   <none>       3000:25883/TCP  13m
redis-master              ClusterIP  10.105.253.249  <none>       6379/TCP        13m
redis-slave               ClusterIP  10.105.98.176   <none>       6379/TCP        13m

NOTES:
1. Get the application URL by running these commands:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc -w invisible-worm-guestbook --namespace default'
  export SERVICE_IP=$(kubectl get svc --namespace default invisible-worm-guestbook -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  echo http://$SERVICE_IP:3000

而用V3是看不见这个已经安装的应用的

# helmv3 list
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART

再使用v3安装一次

# helmv3 install ali-apphub/guestbook --set service.type=NodePort
Error: must either provide a name or specify --generate-name

V3的一个特性就是必需要给应用娶一个名字,或者使用--generate-name选项来自动生成一个名字.

加上名字,重新安装

#  helmv3 install gusetbook  ali-apphub/guestbook --set service.type=NodePort
NAME: gusetbook
LAST DEPLOYED: 2019-07-10 10:13:20.098413164 +0800 CST m=+5.744019735
NAMESPACE: sure
STATUS: deployed

NOTES:
1. Get the application URL by running these commands:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc -w gusetbook-guestbook --namespace sure'
  export SERVICE_IP=$(kubectl get svc --namespace sure gusetbook-guestbook -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  echo http://$SERVICE_IP:3000

安装完成后查看信息:

# helmv3 status  gusetbook
NAME: gusetbook
LAST DEPLOYED: 2019-07-10 10:13:20.098413164 +0800 CST
NAMESPACE: sure
STATUS: deployed

NOTES:
1. Get the application URL by running these commands:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc -w gusetbook-guestbook --namespace sure'
  export SERVICE_IP=$(kubectl get svc --namespace sure gusetbook-guestbook -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  echo http://$SERVICE_IP:3000

其他一些命令

  • helm delete 更名为 helm uninstall
  • helm inspect 更名为 helm show
  • helm fetch 更名为 helm pull
  • 但以上旧的命令当前仍能使用

roadmap

  • alpha1: 移除Tiller, 提供Library charts, 存储格式改成secret, 开始OCI集成工作
  • alpha2: 更好的 OCI 集成,Lua 模板支持
  • alpha3: 重构更新策略(可能是客户端侧进行,也可能是服务端侧进行)
Copyright © suredandan 2018 all right reserved,powered by GitbookUpdateTime: 2020-04-09 16:42:03

results matching ""

    No results matching ""