chart — 不是一捆清单,是一个包
一句话总结
图表不是收集了YAML的文件夹,而是包含版本、默认值和使用方法的软件包。
为什么需要这个?
一开始kubectl apply -f deployment.yaml一个就足够了。但是,当产生开发、阶段、运营三个环境的那一刻,文件就会分成三份。一开始复制数可能不同,但半年后,三份文件就会变成各自不同的生物。只附着在运营上的注释,只留给开发的旧图像标签,谁不知道哪个是正确的资源限制。这里真正的问题不是文件是三份,而是没有任何地方写着这其中什么是可以更改的值。
图表以结构回答那个问题。可以换的值是values.yaml啊,不能变形的形式是templates/啊,这个包裹是什么,是第几版呢?Chart.yaml写在E上。三个角色发挥不同的作用的事实本身就是文件。新来的人values.yaml只要打开一看,就能看到全部的“我可以触摸的把手”。
怎么行动
在图表目录中,每个位置都有固定的含义。
| 位置 | 什么 |
|---|---|
Chart.yaml |
图表的身份证。姓名、版本、appVersion、依赖性 |
values.yaml |
用户唯一可以阅读和修改的界面。默认值 |
templates/ |
渲染成manifest的文件 |
templates/_helpers.tpl |
用下划线开始——只包含没有宣言的命名模板定义 |
templates/NOTES.txt |
安装后不久人们阅读的指南 |
charts/ |
放置依赖图表(子图表)的位置 |
crds/ |
只有在install时才适用,在upgrade·uninstall时不触碰的特别区域 |
.helmignore |
从包装中要取走的东西 |
Chart.yaml经常在中感到困惑的是两个版本。version是图表本身的SemVer,在更改模板或基本值结构时上传。appVersion是该图表分发的应用程序的版本,图像标签的默认值或app.kubernetes.io/version流进标签中。两人独立移动——虽然应用程序一如既往,但为了修改一个标签,只上传排行榜版本的情况是非常正常的。apiVersion在Helm 3中必须v2并且,type是制作实际资源的application只提供带有名字的模板的library其中之一。
标签上有容器管理官方标准。app.kubernetes.io/name,instance,version,managed-by,还有helm.sh/chart. 如果用手重复写这些标签的话,一定会出错。_helpers.tpl集中在一个地方。在这里会产生一个重要的设计。必须将通用标签和选择器标签分开。 Deployment 的spec.selector是创建后无法更改的字段,共同标签中混合了图表版本和应用程序版本。如果直接在选择器中写上它,上传图表版本的瞬间选择器就会变,升级会被API服务器拒绝。所以选择器中绝对不会变的两个(name,instance)只放进去。
在现场相遇的样子
**第一,63字墙。**资源名称通常是将发布名称和排行榜名称连在一起制作的。在团队中payments-api-canary-eu-west一旦开始使用相同的版本名称,有一天突然名称违反了规则,安装失败。所以在名称助手中,惯例上trunc 63科trimSuffix "-"因为加着,剪下来后用连字符结尾的话也不有效。
**第二,没有注释的values.yaml.**使用图表的人阅读的不是模板values.yaml一个。如果没有注释,用户必须在模板中搜索并找出“更改这个值会发生什么”。用好值名并添加注释比单独写文档要花费更长时间。
第三,lint不是语法检查器。helm lint虽然可以看到YAML是否破损,但实际上更多的是看是否遵守惯例。大部分是没有图标或缺少推荐标签的警告。一旦养成忽视警告的习惯,真正的错误就会埋在中间。
给别人时要准备好的东西
只有自己团队使用图表的时候,可以随便做,但如果别人开始使用的话,已经约定好了。 依赖于没有的东西,无法改变。一开始确定好几件事的话,那个 问题减少了。
**values.yaml这就是文档。**如果在所有键上写上默认值,使用者会做什么
知道是否可以更改,只需一个文件。用注释写下单位和允许值。即使没有值
完全删除合适的身高的话,使用的人可能连有那种身高都不知道。
**values.schema.json提前阻止错误的值。**类型不正确或必填键
如果没有的话,渲染前会失败,所以不会有奇怪的东西上传到群集中。
Chart.yaml的两个版本不一样。version是排行榜本身的版本
appVersion是包含的应用程序的版本。只要修改一下排行榜,就只有前面那个了。
上传。两个一起移动的话,就无法区分图表修改和应用程序发布。
名字在助手一个地方制作。_helpers.tpl的fullname所有的资源都
使用的话,即使发布名称变更,资源名称也会一致跟随。每个资源都命名
直接使用的话,总有一天会出错。
标签遵循标准。app.kubernetes.io/name,instance,version,
component,managed-by粘上的话,其他工具会识别出来。还有在选择器上使用的
标签绝对不会更换 — Deployment 的selector是不可变的,换的话
升级失败了,要删除后重新创建。
NOTES.txt然后写下以下动作。 安装后屏幕上出现的唯一指南。
只要连接方法、确认命令、一个常见的错误就足够了。
依赖性是Chart.lock固定为。dependencies写下范围并锁定
如果不提交文件,相同的图表会拉入与昨天不同的子图表。
下次实习要做的事情
/root/helm/lab/labhub-web在图表上制作骨架Chart.yaml科values.yaml直接填充。从助手中选择姓名和标签,让所有对象都贴上标准标签,并渲染和保存安装指南。最后,将覆盖值的渲染和基本渲染并排放置,确认Service Selector和Pad标签是否真的一致。