ytt与各类yaml相关工具对比

Posted by 梁远鹏 on 2023-02-25 | 阅读 |,阅读约 4 分钟

TOC

前言

ytt 是 CNCF 项目 carvel 中的一个命令行工具,来看看 ytt 与业内其他 yaml 相关工具的对比情况.

ytt vs Go text/template (或其他的一些文本模板工具)

大多数通用模板工具不理解他们正在模板化的内容,认为它只是普通文本,也就是说所有内容都是文本,没有特别处理的地方.

而 ytt 操作 yaml 结构,因此消除了文本模板工具常见的典型转义和格式化问题.此外呢, ytt 提供了一种非常简单的方法,可以让结构以一种更加可读的方式被重用,这可以通过一些文本模板工具来实现.

ytt vs jsonnet

ytt 在概念上非常接近 jsonnet,两者都是对数据结构而不是文本来进行操作,因此可以提供更好的方法来构造、组合以及重用结构. Jsonnet 引入了一种自定义的语言来帮助执行结构操作,另一方面就是 ytt 构建在类似 python (Starlark) 的语言之上,我们认为更大的社区会更熟悉这种语言.

我们还相信,使用 ytt 从普通的 yaml 过度到模板化 yaml 是非常容易和自然的.

ytt vs Dhall

Dhall 语言是一种配置语言,可以输出 yaml 和 json,它的优点之一是能够提供”封闭”并且安全的脚本环境,甚至可以抵御恶意模板. ytt 可通过在模板上下文中公开小 API 来实现相同的目标(并且建立在 Starlark 社区的伟大工作之上). 例如无法进行网络调用,无法读取文件系统,目前甚至无法获取时间.

ytt vs Kustomize (and CF BOSH ops files)

配置定制工具的独特之处在于他们不支持模板,而是建立在”基本”配置之上的, ytt 通过”叠加”功能提供了自己的配置定制化.与其他工具不同, ytt 中的叠加操作(删除、替换、合并)模拟了基本配置的结构.例如在 Kustomize 中,要删除一个特定的映射键,就必须使用和正常结构截然不同的 json 补丁语法.另一方面是 ytt 使用了能够注释 yaml 结构的能力,因此它可以标记应该删除的映射键.总而言之,我们认为 ytt 的方法是更加优越的.

以下是一些更加详细的区别:

ytt overlays(覆盖)

  • 它们不是 kubernetes 特有的,因此涵盖了 kustomize 无法处理的各种类型配置.
  • 以一种一致的风格覆盖所有 CURD 操作,而 kustomize 需要不同的语法来进行不同类型的修改(SMP vs jsonPath,等等).
  • 不关心原生物种,crd或其他东西,因为他们是通用的.

ytt 不仅仅是一个覆盖工具,它支持叠加和模板.我们看到配置编写分为两类:配置作者和配置使用者.模板可以更好的支持配置作者,而配置使用者通常需要的不仅仅是模板的输入.overlays 提供了其余部分.拥有一个跨模板和overlays 能力一致的工具是非常强大的.

ytt 对于缺少映射键等问题更加明确(避免了许多不必要的早期拼写错误)

ytt 允许定义变量

ytt 具有从各种输入(包括命令行参数、环境变量以及文件)将数据注入到 overlays 的能力

ytt vs Orchestration Tools (Pulumi / HELM)

像 Pulumi 和 HELM 这样的编排工具已经将配置管理和工作流管理结合到同一个工具中了.这有利有弊, ytt 专门设计为只关注配置管理.不过对于 yaml 内容的输出可以与 Helm、Pulumi以及其他工具一起使用.

ytt vs plain Ruby/Python/etc

ytt 的主要优势:

提供了对结构(映射、列表等)进行操作的简便方法.当然也可以使用常规语言进行数据操作.然而这不是该语言优化的目的,特别是当数据嵌套非常多的时候,会导致非常冗余以及可读性较差的代码.

提供了一种简便而且安全的方式来执行模板,而不用担心模板代码可能是恶意的内容.用户可以 Dockerize(Docker化/容器化) 常规语言模板的执行,但这会带来相当严重的依赖.

提供了一种简单的方法来自定义任何部分的配置来做覆盖操作,如果没有参数化所有内容或引入额外的工具(例如 Bosh ops文件),使用常规语言是不可能做到这一点的.

最后

在我看来其实可以加多两个对比:

ytt vs cue

对于 cue 来说它的一大杀器就是可以基于 k8s yaml资源来生成 cue,然后可以做修改生成的 cue 来生成一些其他用途的 k8s yaml语言.

目前来看 ytt 也是拥有类似的能力,并且 ytt 的整体技术栈提供更多应用相关的能力,例如:

  • 可以安装、升级以及删除k8s资源操作的 kapp
  • 负责 kubernetes 持续交付以及包管理的能力的 kapp-controller

还有其他负责相对应能力的工具,这里只是简单介绍其中的两个.而这些能力对于 cue 来说都是不具备的.

ytt vs 蚂蚁金服KCL

从设计理念上来看其实 ytt 和 KCL 才可能是同一层次的,都是希望让 yaml 配置可编程化,拥有更多的可扩展性以及可重用性.

最后的说明

本文内容来自官方说明 ytt-vs-x,后续有可能会进行更新.

微信公众号

扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。

wechat-qrcode