
楔子: 以蚂蚁集团典型的建站场景为例,在接入 Kusion 后,用户侧配置代码减少到 5.5%,用户面对的 4 个平台通过接入统一代码库而消减,在无其他异常的情况下交付时间从 2 天下降到 2 小时……
注:本文是柴树杉在 2021 GIAC 大会上分享的内容。
00
你好 GIAC
大家好,我是来自蚂蚁集团的同学,很高兴能在 GIAC 的编程语言新范式板块和大家分享《KCL 配置策略语言》。KCL 语言是蚂蚁内部的 Kusion 解决方案中针对云原生基础设施配置代码化自研的 DSL 语言,目前已经在建站场景等一些场景开始小范围推广试用。
我们先看一下简单的 KCL 代码:
schema GIACInvitation[name: str]:
Name: str = name
Topic: str = "分享主题"
Company?: str = None
Type: str = "分享嘉宾"
Address: str = "深圳"
invitation = GIACInvitation("姓名") {
Topic: "KCL 配置策略语言"
Company: "蚂蚁集团"
}
这个例子代码先通过 schema 定义了一个 GIACInvitation 结构体:该结构体有一个 str 类型的 Name 参数,同时还有一组标注了类型和默认值的属性。然后通过声明式的语法构造了 GIACInvitation 的实例 invitation。
这个例子虽然简单,但是包含了 KCL 最重要的 schema 语言结构。从例子可以看出 KCL 尝试通过声明式的语法、静态类型检查特性来改进配置代码的编写和维护工作。这也是设计 KCL 语言的初衷,我们希望通过编程领域成熟的技术理论来解决云原生领域的配置代码化的问题。
01
KCL 语言的诞生背景
在经典的 Linux/UNIX 操作系统中,我们通过 Shell 和系统内置的各种工具和内核进行交互,同时通过 Shell 脚本来管理更上层的 App。可以说 Shell 语言极大地简化了内核的编程界面,不仅仅提升了操作系统易用性也简化了上层 App 的管理和运维,也提高了生产效率。而 Kubernetes 作为容器管理领域的事实标准,已经成为云计算时代的 Linux/UNIX。类比 UNIX 系统,Kubernetes 目前还缺少一种符合其声明式、开放、共享设计理念的交互语言及工具。

1.1 为何要设计 KCL 语言?
K8s 已经成为云计算的操作系统,但是目前尚缺少功能完备的 Shell 交互界面。目前虽然有很多而且开源方案,但是还没有像 UNIX 的 Shell 那种出现比较成熟的方案,特别是尚无法满足头部互联网企业大规模工程化的要求。云原生技术与企业落地之间存在 Gap 需要填补,这正是云原生工程化要解决的问题,也是设计 KCL 语言的出发点。
1.2 目前是一个好时机
云原生的思路是高度的开放化和民主化,结果就是万物可配置,一切配置都是代码。在配置代码面前人人平等,每个用户都可以通过调整配置代码和基础平台设施进行交互。因此对配置的编写和维护正在成为云计算时代软件工程师的必备的技能和需求。基于对云原生配置代码化需求的日益旺盛,硅谷的诸多头部公司已经对这个方向进行了大规模的实践和验证,这些都给了我们大量可以参考的经验。
因此蚂蚁的 Kusion 项目尝试通过 KCL 配置策略语言正是为了简化云原生技术设施的接入方式设计,其设计目标不仅仅是为了提升蚂蚁基础设施的开放程度及使用效率,同时希望能够优化共享、协同的开发流程,可以说其定位正是云原生时代的 Shell 语言。虽然目前还处于探索和实践阶段,我们通过此文和大家分享下 KCL 语言的设计与实现的一些理念,为云原生的快速到来贡献一点绵薄之力。
1.3 KCL 诞生历史
KCL 语言从 2019 年开始初期的调研和设计工作。到 2020 年 3 月发布 kcl-0.1,基于 Python 定制语法,采用 Go 版本的 Grumpy 和 AntLR 等工具开发。2020 年下半年改用 Python 语言并加快了开发和迭代速度,发布的 kcl-0.2.x 引入了大量语言特性、增加了 Plugin 扩展支持、同时支持 IDEA 插件。2021 年上半年开始统一优化和整合语言特性,发布的 kcl-0.3 优化类型系统、集成单元测试工具、优化执行性能并提供了 Go 等多语言的 API 支持、同时通过 LSP 为 VSCode 提供支持。2021 年下半年开始在建站等常见落地,同时引入静态类型检查和优化性能,完善语言的文档支持。
02
KCL 语言的设计原则
基于蚂蚁践行多年的经典运维中台沉淀的经验和对各种问题利弊的思考,Kusion 项目对如何充分利用云原生技术带来的红利,打造一个开放、透明、声明式、可协同的运维体系进行了探索和思考,提出并实践了基于基础设施代码化的云原生协同开发的模型。而 KCL 语言正是 Kusion 项目为了解决云原生协同开发而设计的声明式的配置编程语言,简单、稳定、高效和工程化是 KCL 语言设计的设计理念。

2.1 简单为王
简单不仅仅可以降低学习和沟通的成本,而且可以减少代码出问题的风险。不论是 UNIX 奉行的 KISS 原则还是 Go 语言推崇的 Less is more 设计理念,简化易用的界面始终是各种成功产品追求的一个目标。同样从简单原则出发,KCL 语言在参考现代编程语言之上只保留了必要的元素,同时通过类型自动推导、引入受限的控制流和 schema 提供了基础灵活的配置定义编写能力,删减语言特性始终是 KCL 语言设计工作的一个重要目标。
2.1.1 声明式语法
声明式编程是和命令式编程并列的一种编程范式,声明式编程只告诉你想要的结果,执行引擎负责执行的过程。声明式编程使用更加简单,可以降低命令式拼装造成的复杂性和副作用,保持配置代码清晰可读,而复杂的执行逻辑已经由 Kubernetes 系统提供支持。
KCL 语言通过简化对 schema 结构体实例化的语法结构对声明式语法提供支持,通过仅提供少量的语句来减少命令过程式编程带来的复杂性。围绕 schema 和配置相关的语法,KCL 希望每种配置需求尽可能通过固定的写法完成,使得配置代码尽可能的统一化。
比如作为 KCL 声明式语法的核心结构 schema 可以采用声明式方式实例化:
schema Name:
firstName: str
lastName: str
schema Person:
name: Name = {
firstName: "John"
lastName: "default"
}
JohnDoe = Person {
name.lastName: "Doe"
}
首先通过 schema 定义了一个 Name 结构,结构包含 2 个字符串类型的必填属性。
然后在 Person 中复用 Name 类型声明一个 Name 属性,并且给 Name 属性设置了默认值以简化用户使用。
最终在定义 JohnDoe 配置定义的时候,只需填写 Name.lastName 一个属性参数即可,其他部分属性均采用默认的参数。
对于一些标准的业务应用,通过将可复用的模型封装为 KCL schema,这样可以为前端用户提供最简单的配置界面。比如基于蚂蚁内部 Konfig 大库中 sofa.SofaAppConfiguration 只需添加少量的配置参数

最低0.47元/天 解锁文章
55

被折叠的 条评论
为什么被折叠?



