你不得不了解Helm 3中的5个关键新特性
Helm是Kubernetes的一个软件包管理器。两个月前,它发布了第三个主要版本,Helm 3。在这一新版本中,有许多重大变化。本文将介绍我认为最关键的5个方面。
1、 移除了Tiller
Helm最终移除了其服务器端组件,Tiller。现在,它完全没有代理。Tiller之前是一个运行在Kubernetes上的小型应用程序,它用于监听Helm命令并处理设置Kubernetes资源的实际工作。
这是Helm3中最重大的更改。为什么Tiller的移除备受关注呢?首先,Helm应该是一种在Kubernetes配置上的模板机制。那么,为什么需要在服务器上运行某些代理呢?
Tiller本身也存在一些问题,因为它需要集群管理员的ClusterRole才能创建。因此,假设你要在Google Cloud Platform中启动的Kubernetes集群上运行Helm应用程序。首先,你需要启动一个新的GKE集群,然后使用helm init初始化Helm,然后…发现它失败了。这种情况之所以会发生是因为,在默认状态下,你没有给你的kubectl上下文分配管理员权限。现在你了解到了这一点,开始搜索为分配管理员权限的magic命令。这一系列操作下来,也许你已经开始怀疑Helm是否真的是一个不错的选择。
此外,由于Tiller使用的访问权限与你在kubectl上下文中配置的访问权限不同。因此,你也许可以使用Helm创建应用程序,但你可能无法使用kubectl创建该程序。这一情况如果没排查出来,看起来感觉像是安全漏洞。
幸运的是,现在Tiller已经被完全移除,Helm现在是一个客户端工具。这一更改会导致以下结果:
Helm使用与kubectl上下文相同的访问权限
你无需再使用helm init来初始化Helm
Release Name 位于命名空间中
Helm 3一直保持不变的是:它应该只是一个在Kubernetes API上执行操作的工具。如此,如果你可以使用纯粹的kubectl命令执行某项操作,那么也可以使用helm执行该操作。
2、 分布式仓库以及Helm Hub
Helm命令可以从远程仓库安装Chart。在Helm 3之前,它通常使用预定义的中心仓库,但你也能够添加其他仓库。但是从现在开始,Helm将其仓库模型从集中式迁移到分布式。这意味着两个重要的改变:
预定义的中心仓库被移除
Helm Hub(一个发现分布式chart仓库的平台)被添加到helm search
为了能够更好地理解这一改变,我给你们一个示例。在Helm 3之前,如果你想要安装一个Hazelcast集群,你需要执行以下命令:
$ helm2 install --name my-release stable/hazelcast
现在,这个命令不起作用了。你需要先添加远程仓库才能进行安装。这是因为这里不再存在一个预定义中心仓库。要安装Hazelcast集群,你首先需要添加其仓库然后安装chart:
$ helm3 repo add hazelcast https://hazelcast.github.io/charts/
$ helm3 repo update
$ helm3 install my-release hazelcast/hazelcast
好消息是现在Helm 命令可以直接在Helm Hub中寻找Chart。例如,如果你想知道在哪个仓库中可以找到Hazelcast,你只需执行以下命令即可:
$ helm3 search hub hazelcast
以上命令列出在Helm Hub中所有分布式仓库中名称中包含“hazelcast”的Chart。
现在,我来问你一个问题。移除掉中心仓库是进步还是退步?这有两种观点。第一种是chart维护者的观点。例如,我们维护Hazelcast Helm Chart,而Chart中的每个更改都需要我们将其传播到中心仓库中。这项额外的工作使得中心仓库中的许多Helm Chart没有得到很好地维护。这一情况与我们在Ubuntu/Debian包仓库中所经历的很相似。你可以使用默认仓库,但它常常只有旧的软件包版本。
第二种观点来自Chart的使用者。对于他们来说,虽然现在安装一个chart比之前稍微困难了一些,但另一方面,他们能够从主要的仓库中安装到最新的chart。
3、 JSON Schema 验证
从Helm 3开始,chart维护者可以为输入值定义JSON Schema。这一功能的完善十分重要,因为迄今为止你可以在values.yaml中放入任何你所需的内容,但是安装的最终结果可能不正确或出现一些难以理解的错误消息。
例如,你在port参数中输入字符串而不是数字。那么你会收到以下错误:
$ helm2 install --name my-release --set service.port=string-name hazelcast/hazelcast
Error: release my-release failed: Service in version "v1" cannot be handled as a Service:
v1.Service.Spec: v1.ServiceSpec.Ports: []v1.ServicePort: v1.ServicePort.Port: readUint32:
unexpected character: �, error found in #10 byte of ...|","port":"wrong-name|..., bigger
context ...|fault"},"spec":{"ports":[{"name":"hzport","port":"wrong-name","protocol":
"TCP","targetPort":"hazelca|...
你不得不承认这个问题难以分析和理解。
此外,Helm 3默认添加了针对Kubernetes对象的OpenAPI验证,这意味着发送到Kubernetes API的请求将会被检查是否正确。这对于Chart维护者来说,是一项重大利好。
4、 Helm 测试
Helm测试是一个小小的优化。尽管微小,但它也许实际上鼓励了维护者来写Helm测试以及用户在安装完每个chart之后执行helm test命令。在Helm 3之前,进行测试多少都显得有些奇怪:
1、 此前测试作为Pod执行(好像需要一直运行);现在你可以将其定义为Job。
2、 测试Pod不会自动被移除(除非你使用magic flag –cleanup),所以默认状态下,没有任何技巧,对于既定的版本你不能多次执行helm test。但幸运的是,现在可以自动删除测试资源(Pod、Job)。
当然旧的测试版本也并非不能使用,只需要使用Pod并始终记得执行helm test –cleanup。但也不得不承认,这一改进有助于提升测试体验。
5、 命令行语法
最后一点是,Helm命令语法有所改变。从积极的一面来看,我认为所有的改变都是为了让体验更好;从消极的方面看,这一语法不与之前的版本兼容。因此,现在编写有关如何使用Helm安装东西的步骤时,需要明确指出所使用的命令是用于Helm 2还是用于Helm 3。
举个例子,从helm install开始说起。现在版本名称已经成为必填参数,尽管在Helm 2中你可以忽略它,名称也能够自动生成。如果在Helm3中要达成相同的效果,你需要添加参数--generate-name。所以,使用Helm 2进行标准的安装应该如下:
$ helm2 install --name my-release hazelcast/hazelcast
在Helm 3中,需要执行以下命令:
$ helm3 install my-release hazelcast/hazelcast
还有另一个比较好的改变是,删除Helm版本后,无需添加—purge。简单地输入命令helm uninstall <release-name>即可删除所有相关的资源。
还有一些其他改变,如一些命令被重命名(不过使用旧的名称作为别名),有一些命令则被删除(如 helm init)。如果你还想了解更多关于Helm 命令语法更改的信息,请参考官方文档:
https://helm.sh/docs/faq/#cli-command-renames
结 论
Helm 3的发布,使得这一工具迈向一个新的阶段。作为用户,我十分喜欢Helm现在只是一个单纯的客户端工具。作为Chart维护者,Helm Hub以及分布式仓库的方法深得我心。我希望能在未来看到更多更有意思的改变。
如果你想了解Helm 3中的所有变化,请查看官方文档:
https://helm.sh/docs/faq/#changes-since-helm-2
原文链接:
你不得不了解Helm 3中的5个关键新特性的更多相关文章
- java-API中的常用类,新特性之-泛型,高级For循环,可变参数
API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...
- Java中的工具类和新特性
1:Collections集合框架工具类: /* 集合框架的工具类. Collections:集合框架的工具类.里面定义的都是静态方法. Collections和Collection有什么差别? Co ...
- Qt5 中对 C++11 一些新特性的封装
在 Qt5 中,提供更多 C++11 的特性支持,接下来我们将进行详细的说明. slots (槽) 的 Lambda 表达式 Lambda表达式 是 C++11 中的一个新语法,允许定义匿名函数.匿名 ...
- Vue.js源码中大量采用的ES6新特性介绍:模块、let、const
1 关于ES6 ECMAScript6(以下简称ES6)是JavaScript语言的最新一代标准,发布于2015年6月,因为ECMA委员会决定从ES6起每年更新一次标准,因此ES6被改名为E ...
- 【Qt开发】Qt5 中对 C++11 一些新特性的封装
C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...
- MySQL5.7中InnoDB不可不知的新特性
讲师介绍 赖铮 Oracle InnoDB团队 Principle Software Developer 曾任达梦.Teradata高级工程师,主要负责研发数据库执行引擎和存储引擎,十年以商数据库内 ...
- 你所不知道的 vscode,汇集历史版本中你可能不知道的新特性
壹 ❀ 引 vscode可以毫不夸张的说是大部分前端同学吃饭的工具(webstorm除外),随着时间的推移vscode其实也在不断推出了各种新功能新特性,但vscode并不会默认就实装这些新功能,我相 ...
- JDK 7中的文件操作的新特性
文件系统综述 一个文件系统在某种媒介(通常是一个或多个硬盘)上存储和组织文件.如今的大多数文件系统都是以树状结构来存储文件.在树的顶端是一个或多个根节点,在根节点一下,是文件和目录(在Windows系 ...
- Oracle12c中分区(Partition)新特性之TRUNCATEPARTITION和EXCHANGE PARTITION级联功能
TRUNCATE [SUB]PARTITION和EXCHANGE [SUB]PARTITION命令如今可以包括CASCADE子句,从而允许参照分区表向下级联这些操作.为确保该选项正常,相关外键也必须包 ...
随机推荐
- vue4——把输入框的内容添加到页面(简单留言板)
文章地址:https://www.cnblogs.com/sandraryan/ vue最最最简单的demo(记得引入) 实例化一个vue,绑定#app的元素,要渲染的数组arr作为data. 把ar ...
- CSS3 Box-shadow 阴影效果用法
一.基本用法: 二.内阴影用法: 三.阴影扩展长度值: box-shadow: 4rpx 4rpx 8rpx #aaa;
- SVG和canvas画图,js求数组最大最小值
windows命令行的内容怎么复制,右键选择标记,选中内容后再点击鼠标右键就复制了. 安装Node.js后再用npm install命令会出现如下warn:saveError ENOENT: no s ...
- element-ui-——el-uploadexcel导入
布局文件:(选择文件放在了弹框内部——即点击导入按钮后弹框显示,先下载模板再选择文件点击提交按钮才上传) )) { this.$notify({ message: '数据导入成功', type: 's ...
- Codeforces Round #178 (Div. 2)
A. Shaass and Oskols 模拟. B. Shaass and Bookshelf 二分厚度. 对于厚度相同的书本,宽度竖着放显然更优. 宽度只有两种,所以枚举其中一种的个数,另一种的个 ...
- java 事件监听机制组成
事件源(组件) 事件(Event) 监听器(Listener) 事件处理(引发事件后处理方式) 事件监听机制流程图 务必记牢: 确定事件源(容器或组件) 通过事件源对象的addXXXListener( ...
- linux版本依赖
记住, 你的模块代码一定要为每个它要连接的内核版本重新编译 -- 至少, 在缺乏 modversions 时, 这里不涉及因为它们更多的是给内核发布制作者, 而不是开发者. 模块 是紧密结合到一个特殊 ...
- 【21.58%】【codeforces 746D】Green and Black Tea
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- excel转换成实体
package com.cinc.ecmp.utils; import java.io.IOException; import java.io.InputStream; import java.lan ...
- gulp插件使用
//引入gulp组件 var gulp=require('gulp'); //创建任务 gulp.task('hello',function(){ console.log('hello'); }); ...