KCL:声明式的云原生配置策略语言

为 Kubernetes 领域模型抽象应用层模型 - 使用 KCL 配置语言 & Konfig 配置库 Kusion 配置语言( KCL )是一个开源的基于约束的记录及函数语言。KCL 通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。在 KCL 中, 推荐通过配置库的方式统一管理所有的配置清单和模型库,即不仅存放抽象模型本身的 KCL 定义,还存放各种类型的配置清单,比如应用的运维配置、策略配置等。 阅读详情

楔子: 以蚂蚁集团典型的建站场景为例,在接入 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 只需添加少量的配置参数就可以定制一个 App。

appConfiguration = sofa.SofaAppConfiguration {
    resource: resource.Resource {
        cpu: "4"
        memory: "8Gi"
        disk: "50Gi"
    }
    overQuota: True
}

通过声明式语法描述必要的参数(其他的参数全部采用默认配置),可以极大简化普通用户的配置代码。

2.1.2 顺序无关语法

有别于命令式编程,KCL 推崇的是更适合于配置定义的声明式语法。以斐波那契数列为例,可以把一组声明式的定义看作一个方程组,方程式的编写顺序本质上不影响方程组的求解,而计算属性依赖并“求解”的过程由 KCL 解释器完成,这样可以避免大量命令式拼装过程及顺序判断代码。

schema Fib:
    n1: int = n - 1
    n2: int = n1 - 1
    n: int
    value: int


    if n <= 1:
        value = 1
    elif n == 2:
        value = 1
    else:
        value = (Fib {n: n1}).value + (Fib {n: n2}).value


fib8 = (Fib {n: 8}).value  # 21

代码中 Fib 定义的成员 n、n1 和 n2 有一定的依赖关系,但是和它们书写的顺序并无关系。KCL 语言引擎会根据声明式代码中的依赖关系自动计算出正确的执行顺序,同时对类似循环引用等异常状态告警。

2.1.3 同名配置合并

当整个业务和开发维护团队都变得复杂时,配置代码的编写和维护也将变得复杂化:同一份配置参数可能散落在多个团队的多个模块中,同时一个完整的应用配置则需要合并这些散落在不同地方的相同和不同配置参数才可以生效,而相同的配置参数可能因为不同团队的修改而产生冲突。通过人工方式同步这些同名配置和合并不同的配置都是一个极大的挑战。

比如 Konfig 大库中应用配置模型分为 base 和各环境 stack 配置,要求程序运行时按照某一 merge 策略合并为一份应用配置,相当于要求大库前端配置能够自动合并,即能够分开多次定义并且合并,然后实例化生成相应的唯一前端配置。

借助 KCL 语言的能力和 Konfig 的最佳实践,可通过将基线配置和环境配置自动合并简化配置的编写。比如对于标准 SOFA 应用 opsfree,其基线配置和环境配置分别维护,最终交由平台工具进行配置合并和检查。KCL 语言通过自动化合并同名配置实现简化团队协同开发的设计目标。

比如 base 配置收集的通用的配置:

appConfiguration = sofa.SofaAppConfiguration {
    mainContainer: container.Main {
        readinessProbe: probe_tpl.defaultSofaReadinessProbe
    }
    resource: res_tpl.medium
    releaseStrategy: "percent"
}

然后再预发环境在 base 配置的基础之上针对某些参数进行微调:

appConfiguration = sofa.SofaAppConfiguration {
    resource: resource.Resource {
        cpu: "4"
        memory: "8Gi"
        disk: "50Gi"
    }
    overQuota: True
}

合并的 pre 配置实际是一份 SofaAppConfiguration 配置(相当于如下等效代码,环境配置的优先级默认高于基线配置)

appConfiguration = sofa.SofaAppConfiguration {
    mainContainer: container.Main {
        readinessProbe: probe_tpl.defaultSofaReadinessProbe
    }
    resource: resource.Resource {
        cpu: "4"
        memory: "8Gi"
        disk: "50Gi"
    }
    overQuota: True
    releaseStrategy: "percent"
}

目前的同名配置虽然只针对应用的主包配置有效,但已经带来了可观察的收益。

2.2 稳定压倒一切

越是基础的组件对稳定性要求越高,复用次数越多的稳定性带来的收益也更好。因为稳定性是基础设施领域一个必备的要求,不仅仅要求逻辑正确,而且需要降低错误出现的几率。

2.2.1 静态类型和强不可变性

很多配置语言采用运行时动态检查类型。动态类型最大的缺点只能检查正在被执行属性的类型,这非常不利于开发阶段提前发现类型的错误。静态类型不仅仅可以提前分析大部分的类型错误,还可以降低后端运行时的动态类型检查的性能损耗。

除了静态类型,KCL 还通过 final 关键字禁止某些重要属性被修改。静态类型再结合属性的强不可变性,可以为配置代码提供更强的稳定性保障。

schema CafeDeployment:
    final apiVersion: str = "apps.cafe.cloud.alipay.com/v1alpha1"
    final kind: str = 123  # 类型错误


schema ContainerPort:
    containerPort: int = 8080
    protocol: "TCP" | "UDP" | "SCTP" = "TCP"
    ext? : str = None

比如对于 CafeDeployment 中的 apiVersion 信息是一种常量类型的配置参数,final 为这类配置提供保障:

代码中 apiVersion 和 kind 属性都被 final 保护禁止被修改。但是 kind 因为属性类型初始值不同而隐含一个错误,通过静态类型检查很容易在开发阶段发现错误并改正。

2.2.2运行时类型和逻辑 check 验证

KCL 的 schema 不仅仅是带类型的结构体,也可以用于在运行时校验存量的无类型的 JSON 和 YAML 数据。此外 schema 的 check 块可以编写语义检查的代码,在运行时实例化 schema 时会自动进行校验。同时,基于 schema 的继承和 mixin 可以产生跟多关联的 check 规则。

比如以下的例子展示 check 的常见用法:

schema sample:
    foo: str
    bar: int
    fooList: [str]


    check:
        bar > 0 # minimum, also support the exclusive case
        bar < 100, "message" # maximum, also support the exclusive case
        len(fooList) > 0 # min length, also support exclusive case
        len(fooList) < 100 # max length, also support exclusive case
        regex.match(foo, "^The.*Foo$") # regex match
        isunique(fooList) # unique
        bar in range(100) # range
        bar in [2, 4, 6, 8] # enum
        multiplyof(bar, 2) # multipleOf

check 中每个语句都是一个可以产生 bool 结果的表达式和可选的错误信息组成(每个普通的 bool 表达式其实是 assert 语句的简化而来)。通过内置的语法和函数可以实现在运行时对属性值的逻辑验证。

2.2.3 内置测试支持

单元测试是提升代码质量的有效手段。KCL 基于已有的 schema 语法结构,配合一个内置 kcl-test 命令提供灵活的单元测试框架(结合 testing 包可指定面值类型的命令行参数)。

内置测试工具

schema TestPerson:
    a = Person{}
    assert a.name == 'kcl'


schema TestPerson_age:
    a = Person{}
    assert a.age == 1

kcl-test 命令不仅仅执行单元测试,还会统计每个测试执行的时间,而且可以通过正则表达式参数选择执行指定的测试。此外通过 kcl-test ./... 可以递归执行子目录的单元测试,同时支持集成测试和 Plugin 测试。

2.3 高效是永恒的追求

KCL 代码不仅仅通过声明式的风格简化编程,同时通过模块支持、mixin 特性、内置的 lint 和 fmt 工具、以及 IDE 插件提供高效的开发体验。

2.3.1 schema 中好用的语法

schema 是 KCL 编写配置程序的核心语法结构,其中几乎每个特性均是针对具体的业务场景提效而设计。比如在定义和实例化深层次嵌套的配置参数时,均可以直接指定属性的路径定义和初始化。

schema A:
    a: b: c: int
    a: b: d: str = 'abc'


A {
    a.b.c: 5
}

同时为了安全,对于每个属性默认都是非空的字段,在实例化时会自动进行检查。

schema 不仅仅是一个独立的带类型注解的配置对象,我们也可以通过继承的方式来扩展已有的 schema:

schema Person:
    firstName: str
    lastName: str


# schema Scholar inherits schema Person
schema Scholar(Person):
    fullName: str = firstName + '_' + lastName
    subject: str


JohnDoe = Scholar {
    firstName: "John",
    lastName: "Doe",
    subject: "CS"
}

代码中 Scholar 从 Person 继承,然后又扩展了一些属性。作为子类的 Scholar 可以直接访问父类中定义的 firstName 等属性信息。

继承是 OOP 编程中基础的代码复用手段,但同时也有多继承导致的菱形继承的技术问题。KCL 语言刻意简化了继承的语法,只保留了单继承的语法。同时 schema 可以通过 mixin 特性混入复用相同的代码片段,对于不同的能力配套,我们通过 mixin 机制编写,并通过 mixin 声明的方式“混入”到不同的结构体中。

比如通过在 Person 中混入 FullnameMixin 可以给 schema 增加新的属性或逻辑(包括 check 代码块):

schema FullnameProtocol:
    firstName : str = "default"
    lastName : str


mixin FullnameMixin for FullnameProtocol:
    fullName : str = "${firstName} ${lastName}"


schema relax Person:
    mixin [FullnameMixin]
    firstName : str = "default"
    lastName : str

通过 KCL 的语言能力,平台侧同学可以通过单继承的方式扩展结构体,通过 mixin 机制定义结构体内属性的依赖关系及值内容,通过结构体内顺序无关的编写方式完成声明式的结构体定义,此外还支持如逻辑判断、默认值等常用功能。

2.3.2 doc、fmt、lint 和外围的 LSP 工具

在编程领域代码虽然是最核心的部分,但是代码对应的文档和配套的工具也是和编程效率高度相关的部分。KCL 配置策略语言设计哲学并不局限于语言本身,还包括文档、代码格式化工具、代码风格评估工具和 IDE 的支持等。

KCL 通过 kcl-doc 支持从配置代码直接提取产生文档,自动化的文档不仅仅减少了手工维护的成本,也降低的学习和沟通成本。kcl-fmt 则很方便将当前目录下的全部代码(包含嵌套的子目录)格式化为唯一的一种风格,而相同格式的代码同样降低的沟通和代码评审的成本。

kcl-lint 工具则是通过将一些内置的风险监测策略对 KCL 代码平行评估,方便用户根据评估结果优化代码的风格。

2.4 工程化的解决方案

任何语言想要在工程中实际应用,不仅仅需要很好的设计,还需要为升级、扩展和集成等常规的场景提供完整的解决方案。

2.4.1 多维度接口

KCL 语言设计通过在不同的抽象层次为普通用户(KCL 命令行)、KCL 语言定制者(Go-API、Python-API)、KCL 库扩展者(Plugin)和 IDE 开发者(LSP 服务)均提供了几乎等价的功能界面,从而提供了最大的灵活度。

2.4.2 千人千面的配置 DB

KCL 是面向配置的编程语言,而配置的核心是结构化的数据。因此,我们可以将完整 KCL 代码看做是一种配置数据库。通过 KCL 的配置参数的查询和更新(override/-O 命令)可以和对应的配置属性路径,可以实现对属性参数的查询、临时修改和存盘修改。

将代码化的配置作为 DB 的唯一源,不仅仅可以集成 DB 领域成熟的查询和分析手段,而且可以通过配置代码视角调整配置代码的逻辑结构。特别是在自动化运维实践中,通过程序自动生成的配置代码修改的 PullRequest 可以方便引入开发人员进行代码评审,很好地达到人机通过不同界面配合运维。

2.4.3 版本平滑升级

随着业务和代码的演化,相关模块的 API 也会慢慢腐化。KCL 语言设计通过严格的依赖版本管理,然后结合语言内置的语法和检查工具保障 API 平滑的升级和过渡,再配合代码集成测试和评审流程提升代码安全。KCL 语言通过 @deprecated 特性在代码出现腐化早期给出提示,同时为用户的过渡升级留出一定的时间窗口,甚至等到 API 彻底腐烂前通过报错的方式强制要求同步升级相关的代码。

比如在某次升级中,Name 属性被 fullName 替代了,则可以通过 @deprecated 特性标志:

schema Person:
    @deprecated(version="1.1.0", reason="use fullName instead", strict=True)
    name: str
    ... # Omitted contents


person = Person {
    # report an error on configing a deprecated attribute
    name: "name"
}

这样在实例化 Person 时,Name 属性的初始化语句将会及时收到报错信息。

2.4.4 内置模块、KCL 模块、插件模块

KCL 是面向配置的编程语言,通过内置模块、KCL 模块和插件模块提供工程化的扩展能力。

用户代码中不用导入直接使用 builtin 的函数(比如用 len 计算列表的长度、通过 typeof 获取值的类型等),而对于字符串等基础类型也提供了一些内置方法(比如转化字符串的大小写等方法)。

对于相对复杂的通用工作则通过标志库提供,比如通过 import 导入 math 库就可以使用相关的数学函数,可以通过导入 regex 库使用正则表达式库。而针对 KCL 代码也可以组织为模块,比如 Konfig 大库中将基础设施和各种标准的应用抽象为模块供上层用户使用。

此外还可以通过 Plugin 机制,采用 Python 为 KCL 开发插件,比如目前有 meta 插件可以通过网络查询中心配置信息,app-context 插件则可以用于获取当前应用的上下文信息从而简化代码的编写。

03

KCL语言的实现原理

3.1 整体架构

KCL 虽然作为一个专用于云原生配置和策略定义的语言,但是保持大多数过程式和函数式编程语言的相似实现架构,其内部整体架构组成也是经典的编译器 “三段式” 架构。下面是 KCL 实现的架构图:

主要有以下几个关键模块:

  • 解析器 Parser:解析器分析 KCL 源代码产生 AST(抽象语法树)。

  • 编译器 Compiler:对 AST 进行多次遍历,对 AST 进行语义检查(比如进行类型检查、无效代码检查)并对 AST 进行优化(合并常量表达式等),最终产生虚拟机可以执行的字节码。

  • 虚拟机 Virtual Machine (VM):执行 Compiler 产生的字节码,计算产生相应的配置结果,并将配置结果序列化为 YAML/JSON 进行输出。

整体架构分为三段式的好处是可以把针对 KCL 源语言的前端和针对目标机器的后端组合起来,这种创建编译器组合的方法可以大大减少工作量。

比如目前的 KCL 字节码定义和后端虚拟机采用自研实现,KCL 虚拟机主要用于计算产生配置结果并序列化为 YAML/JSON 进行输出。

如果遇到在其他特殊使用 KCL 的场景比如在浏览器中执行 KCL,则可以重写一个适配 WASM 的后端,就可轻易将 KCL 移植到浏览器中使用,但是 KCL 本身的语法和语义不需要发生任何变化,编译器前端代码也无需任何改动。

3.2 Go 和 Python 通信原理

为了更好地释放 KCL 配置策略语言的能力以及遍于上层自动化产品集成(比如著名的编译器后端 LLVM 就因其 API 设计良好,开发人员可以利用其 API 快速地构建自己的编程语言),KCLVM 目前提供了 Python 和 Go 两种语言的 API,使得用户可以使用相应的 API 快速地构建语言外围工具,语言自动化查询修改工具等提升语言的自动化能力,并且进一步可以基于此构建服务化能力,帮助更多的用户构建自己云原生配置代码化应用或者快速接入基础设施。

KCLVM 主体采用 Python 代码实现,而很多的云原生应用以 Go 程序构建,因此为了更好地满足云原生应用用户诉求。KCLVM 首先基于 CGo 和 CPython 构建了 Go 程序和 Python 程序通信媒介,基于此设计了 Python 函数到 Go 函数的 RPC 调用,调用参数以 JSON 形式存储,使得 KCLVM-Python 编译器的能力平滑地过度到 Go 代码中,通过 Go 一行 import 调用即可操作 KCL 代码。

补充:在服务化实践的过程中,基于 CGO 调用 Python 的方案也遇到了一些问题:首先是 Go + CGO + Python 导致交叉编译困难,对 ACI 的自动化测试和打包产生了挑战;其次是 CGO 之后的 Python 不支持多语言多线程并发,无法利用多核的性能;最后即使通过 CGO 将 Python 虚拟机编译到了 Go 程序中,依然还是需要安装 Python 的标准库和第三方库。

3.3 协同配置原理

当有了一个简单易用并能够保证稳定性的配置语言后,另一个面临的问题是如何使用配置代码化的方式提升协同能力。基于此,KCL 配置可分为用户侧和平台侧配置两类,最终的配置内容由各自用户侧和平台侧的配置内容共同决定,因此存在两个方面的协同问题:

  • 平台侧配置与用户侧配置之间的协同;

  • 用户侧配置之间的协同。

针对上述协同问题,KCL 在技术侧提出了顺序无关语法,同名配置合并等抽象模型来满足不同的协同配置场景。

以上图为例,首先 KCL 代码在编译过程中形成两张图(用户不同配置直接的引用和从属关系一般形式一张有向无环图),分别对应结构体内部声明代码及结构体使用声明代码。编译过程可以简单分为三步:

  • 首先定义平台侧的结构体并形成结构体内部声明代码图;

  • 其次声明并合并不同用户侧配置代码图;

  • 最后将用户侧配置代码图计算的结果代入平台侧结构体内部声明代码图求解,最终得到完整配置图定义。

通过这样简单的计算过程,可以在编译时完成大部分代换运算,最终运行时仅进行少量计算即可得到最终的解。同时在编译合并图过程中仍然能够执行类型检查和值的检查,区别是类型检查是做泛化、取偏序上确界(检查某个变量的值是否满足既定类型或者既定类型的子类型),值检查是做特化、取偏序下确界(比如将两个字典合并为一个字典)

04

对未来的展望

KCL 语言目前依然处于一个高速发展的阶段,目前已经有一些应用开始试用。我们希望通过 KCL 语言为 Kusion 技术栈提供更强的能力,在运维、可信、云原生架构演进方面起到积极的作用。同时对于一些特殊的非标应用提供灵活的扩展和集成方案,比如我们正在考虑如何让后端支持 WebAssembly 平台,从而支持更多的集成方案。

在合适的时间我们希望能够开放 KCL 的全部代码,为云原生代码化的快速落地贡献绵薄之力。

05

本周推荐文章

蚂蚁集团万级规模 K8s 集群 etcd 高可用建设之路

2021-07-29

我们做出了一个分布式注册中心

2021-07-27

开启云原生 MOSN 新篇章 — 融合 Envoy 和 GoLang 生态

2021-07-06

MOSN 子项目 Layotto:开启服务网格+应用运行时新篇章

2021-06-21

2 万字长文!声明式配置技术概述 软件不是一成不变的,每天有成千上万的配置更新,并且配置本身也在逐渐演进,对规模化效率有较高的诉求。文本进行了声明式配置技术概述,KCL概念以及核心设计,以及与其他配置语言的对比。 阅读详情

相关推荐

SquareLine Studio汉化版安装激活全攻略:LVGL嵌入式UI设计从入门到出代码

嵌入式GUI开发中,LVGL作为轻量级开源图形库,广泛应用于STM32、ESP32等MCU平台。可视化设计器通过拖拽生成LVGL代码,大幅提升UI开发效率。SquareLine Studio正是这类工具的代表,支持界面设计、事件绑定与代码导出。其安装、汉化与激活是初学者常见门槛,尤其涉及LVGL版本匹配、字体配置及FreeRTOS移植等关键环节。本文围绕汉化版安装、一个月免费激活码使用及最小可用流程展开,帮助开发者快速上手LVGL界面设计,规避常见环境与集成问题。

weixin_29189987的博客 419

探索KCL:一种强大的知识计算语言

是一个开源项目,由[kcl-lang](https://link.gitcode.com/i/b7600705d786f6d09fe7cfa2e05370a3)团队开发。它是一种专为知识计算和推理设计的语言,旨在简化处理大规模复杂数据、知识图谱和逻辑推理的任务。借助KCL,开发者可以更高效地构建智能应用,如问答系统、推荐引擎和自然语言处理系统。 ## 技术分析 1. **简洁的语法**: ...

gitblog_00084的博客 801

线性代数知识点整理

线性代数基础知识点摘要整理

cuguanren的博客 3万+

[用一个国产自研的编程语言能做什么?(系列文章 1)] KCL - 让 Kubernetes 资源清单管理更容易

[用一个国产自研的编程语言能做什么?(系列文章 1)] KCL - 让 Kubernetes 资源清单管理更容易

dugudugudugu的博客 1020

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

Android 9.0 延时开机动画解决首次开机黑屏和去掉android正在启动的提示框

在9.0的系统产品rom定制化开发中,在一些产品中会出现在首次开机的时候,由于在开机动画播放完以后会出现几秒短暂的黑屏情况,然后进入默认Launcher,这在产品体验上 也是感觉到有点差,所以会要求在去掉这个首次开机黑屏的效果,和在启动过程中的 android is starting这个提示框的这些效果优化,接下来就分析下相关功能, 然后实现这个功能的开发

安卓兼职framework和app工程师的博客 3245

埋头苦干,曙光初现 —— KusionStack & KCL 的 2023 年终总结来啦!

HAPPY NEW YEAR元旦将至Dec.2023.12KusionStack 与 KCL 团队预祝大家新年快乐!新项目在过去的一年中,KusionStack 大家庭里又多了两个新项目,分别是Operating与Controller Mesh:KusionStack Operating 致力于提供满足 K8s 标准的云原生运维、链路可观测、资源可洞察等能力,支持对 Pod 进行增量配置和...

金融级分布式架构 314

ZYNQ BRAM实现PS与PL数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过BRAM模块,也就是Block RAM实现此要求。本章通过Zynq的GP Master接口读写PL端的BRAM,实现与PL的交互。在本实验中加入了自定义的FPGA程序,并利用AXI4总线进行配置,通知其何时读写BRAM。以下为本实验原理图,CPU通过AXI BRAM Controller读取BRAM数据,CPU仅配置自定义的PL BRAM Controller 的寄存器,不通过它读写数据。

baidu_34971492的博客 2276

KCL革命性配置语言:10分钟快速入门云原生配置管理

KCL(Kusion Configuration Language)是一款专为云原生场景设计的**声明式配置语言**,正在彻底改变开发者和运维团队处理配置管理的方式。如果您正在寻找一种更简单、更可靠的方法来管理复杂的云原生应用配置,那么KCL就是您需要的终极解决方案。 ## 🤔 什么是KCL?为什么它如此重要? 在当今的云原生环境中,配置管理变得越来越复杂。传统的YAML文件虽然简单,但在处

gitblog_00076的博客 372

YOLO26训练自己的数据集,从代码下载到实例测试 (含YOLO26网络结构图)

在Windows10上配置CUDA环境教程2026年1月14日,YOLO26是最新发布的计算机视觉模型。支持多种任务,包括目标检测、实例分割、图像分类、姿态估计、有向目标检测以及物体跟踪等。以上就是YOLO26训练自己数据集的全部过程啦,欢迎大家在评论区交流~

Limiiiing的博客 6512

零基础学习CANoe Panel(17)—— Panel CAPL Function

CANoe内置了几个CAPLFunction,允许我们在CAPL运行时动态的更改Panel控件的属性,比如打开某个panel,禁用某个控件,更改控件颜色等。

蚂蚁小兵 3516

KCL核心概念解析:Schema、Config、Rule的完美融合

KCL(KCL Programming Language)作为CNCF沙箱项目,是一种专注于配置和策略的编程语言。它通过Schema、Config和Rule三大核心概念的有机结合,为开发者提供了强大的配置管理能力,帮助构建更可靠、更易维护的系统配置。 ## 什么是KCL? KCL是一种开源的配置编程语言,旨在简化复杂系统的配置管理。它结合了声明式编程的简洁性和命令式编程的灵活性,让开发者能够以

gitblog_01101的博客 392

把 MCP Server 直接装进 SAP ABAP:用 Unlimited Display Tools 打通 Agentic SDK 与 SAP ECC / S/4HANA 的最后一公里

摘要:AI与SAP集成的MCP解决方案 企业在AI集成中面临工具链复杂、数据对接繁琐的挑战。Model Context Protocol (MCP)通过标准化工具与数据暴露方式,将集成复杂度从N×M降至N+M。在SAP生态中,MCP Server for SAP直接部署于ABAP层,利用DDIC/CDS视图对接各类Agent SDK,避免中间件风险。 MCP核心包含三类对象: Tools:带元数据的可执行动作 Resources:结构化上下文数据 Prompts:可参数化提示模板 ABAP层实现MCP Se

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 683

KCL:蚂蚁自研的配置策略语言

楔子: 以蚂蚁集团典型的建站场景为例,在接入 Kusion 后,用户侧配置代码减少到 5.5%,用户面对的 4 个平台通过接入统一代码库而消减,在无其他异常的情况下交付时间从 2 天下降到...

光谷码农 929

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

探索 KCL:基于约束的记录及函数语言

在现代软件开发中,配置管理是一个不可或缺的环节,尤其是在云原生和 Kubernetes 配置场景中。KCL(Kusion Configuration Language)作为一款开源的基于约束的记录及函数语言,旨在通过成熟的编程语言技术和实践,提升配置编写的模块化、扩展性和稳定性,简化逻辑编写,并促进自动化和生态工具的集成。本文将深入介绍 KCL 的核心特性、技术优势及其广泛的应用场景。 ## 项...

gitblog_00069的博客 721

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

喜报!CNCF 基金会宣布 KCL 成为沙盒项目!

不同于混合编写范式、混合工程能力的高级通用语言,专用语言的核心逻辑是以收敛的有限的语法、语义集合解决领域问题近乎无限的变化和复杂性,将复杂配置和策略编写思路和方式沉淀到语言特性中。: 对于不同环境的静态管理应用程序和基础设施配置的方式,往往没有标准的方式去管理这些动态的不同环境的配置,采用非标准化的方法比如脚本和胶水代码的拼盘,会导致复杂度呈指数增长,并导致配置漂移。配置场景的编写,致力于围绕配置的模块化、扩展性和稳定性,打造更简单的逻辑编写体验,构建更简单的自动化和生态集成路径。入选沙箱的项目,是被。

优快云资讯 2608

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

万字长文详解声明式配置发展历程

​文本仅用于澄清声明式配置技术概述,KCL概念以及核心设计,以及与其他配置语言的对比。​​如图 9 所示,借助 KCL 语言丰富的特性及等工具,可以将社区中广泛的、设计良好的模型直接集成到 KCL 中(比如 K8s 资源模型 CRD),用户也可以根据自己的业务场景设计、实现自己的 KCL 模型 (库) ,形成一整套领域模型架构交由其他配置终端用户使用。图 9 KCL 复杂配置建模的一般方式基于此,可以像图 10 示出的那样用一个大的Konfig 仓库。

2301_78287784的博客 276

喜报!CNCF 基金会宣布 KCL 成为沙盒项目!

2023 年 9 月 20日,KCL 项目通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成为 CNCF 沙盒项目。这意味着 KCL 得到了云原生开源社区的认可,保障了项目的中立性,有利于开发者、合作伙伴等共同参与项目建设,协作共赢,并为云原生应用交付带来动态配置管理和自动化能力迈出了重要一步!项目地址:https://github.com/kcl-lang/kcl项...

金融级分布式架构 327

云原生运维实践:KCL语言与自动化平台架构设计

基础设施即代码(IaC)是云原生运维的核心实践,通过声明式配置语言将基础设施管理代码化。KCL(Kusion Configuration Language)作为领域专用语言,融合Python的简洁性和TypeScript的类型系统,支持分层配置模式,显著减少重复配置。结合Kubernetes等云原生技术,构建自动化运维平台架构,实现业务逻辑外置、平台核心稳定和快速功能迭代。典型应用场景包括跨云灾备方案和智能弹性扩缩容,通过KCL定义应用拓扑和扩缩容策略,提升运维效率和系统稳定性。云原生运维体系正从工具化向平

weixin_33501543的博客 106

议题介绍|KCD 2023 杭州站「云原生供应链论坛」

KCD 2023活动介绍HANGZHOU关于 KCDKubernetes Community Days(KCD)由云原生计算基金会(CNCF)发起,由全球各国当地的 CNCF 大使、CNCF 员工以及 CNCF 会员单位联合组织。目前 KCD 正在全球各个国家活跃地组织进行中,KCD 聚集了来自云原生领域开源社区的最终用户、贡献者和技术专家,这一系列的活动有助于提高 Kubernetes 社区的活...

金融级分布式架构 333

云原生周刊:K8s 生态系统的五大趋势预测

KubeSphere 已被 Aqara 智能家居、本来生活、东方通信、微宏科技、东软、华云、新浪、三一重工、华夏银行、四川航空、国药集团、微众银行、紫金保险、去哪儿网、中通、中国人民银行、中国银行、中国人保寿险、中国太平保险、中国移动、中国联通、中国电信、天翼云、中移金科、Radore、ZaloPay 等海内外数万家企业采用。详细的升级指南和兼容性信息可在官方文档中找到。此外,文章还引入了零暴露面网络(ZTM)的概念,探讨了其在集群服务暴露中的应用,旨在为读者提供新的思路以优化集群服务的暴露策略。

KubeSphere 2029

中国人有没有自己的编译器和编程语言?

除上述项目外,中国高校(如清华、北大)和企业在形式化验证、AI编译优化等领域也有前沿研究,例如清华大学的 Coq语言形式化验证框架、阿里的 BladeDISC(深度学习编译器)等。但是,作为一个中国人,有时候,就很好奇,这些编程语言都是英文,ABCD、If Else While一大堆,西方洋人那一套,中国人有没有能力,自己推出编程语言和编译器呢?如果没有资金,就用Python,反正一样有numpy、pandas、matplotlib这套组合,一般统计一下数据,画个曲线也够用。

weixin_45585172的博客 1322

Milvus 老友汇|AI、云原生与向量数据库的精彩碰撞回顾!

在 QueryNodeV2 的新设计中,团队重新梳理了代码结构、将复杂的状态改为无状态的设计、移除了 delete 数据的消息队列减少了资源浪费,在后续持续的稳定性测试中,QueryNodeV2 的表现更加优异。基于这一特点,KubeBlocks 的解决方案采用托管向量数据库(如 Milvus)和图数据库(如NebulaGraph)的方式,实现多云和线下部署,在实现快速 day-1 集成的同时,也提供了丰富的 day-2 运维操作。在此情况下,如何构建一个高性能、高可靠、异构的图文向量引擎至关重要。

ZILLIZ 220

CNCF云原生生态版图-分类指南(二)- 资源调配

属于资源调配分类的项目和产品共有 53 个,其中 CNCF 项目有 17 个。3) 基础设施即代码Automation 自动化Declarative Configuration 声明式配置项目CNCF 项目阶段说明KubeEdge已毕业一个开源系统,用于将容器化应用程序编排功能扩展到 Edge4的主机孵化中一个开源的云资源管理工具,主要用于管理云计算环境中的各种资源Akri沙盒用于在边缘计算环境中进行设备管理和资源发现Atlantis沙盒。

qichengzong的博客 1306

GLCC 首届编程夏令营|KusionStack 项目!

CCF GitLink 开源编程夏令营(GitLink Code Camp,简称 GLCC),是在 CCF 中国计算机学会指导下,由 GitLink 社区联合 CCF 开源发展委员会(CCF ODC)共同举办的面向全国高校学生的暑期开源项目实习计划。活动将联合各大开源企业、开源基金会、开源社区及开源领域专家,旨在鼓励高校学生通过参与真实的开源软件开发,感受开源文化,提升自...

光谷码农 433
上一篇: SOFA Weekly | Layotto、SOFABoot 发布新版本、QA 整理
下一篇: 「 直播预告 」走进下一代互联网协议:HTTP3.0
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值