Skip to main content

· 阅读需要 1 分钟

什么是 KCL

KCL 是一个 CNCF 基金会托管的面向云原生场景的配置及策略语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。

将 KCL 配置部署到集群的几种方式

cloud-native-tool-integration

因为 KCL 本身可以输出为 YAML/JSON 文件,因此理论上支持将 YAML/JSON 配置部署到集群的方式,都可以将 KCL 配置部署到集群,通常我们将 KCL 文件放在 Git 或者 Module Registry 中保存方便与不同的角色和团队之间共享配置,但是 KCL 可以做到的远不止这些,这里将可以将 KCL 配置部署到的集群主要分为如下几种情况。

  • 使用 kubectl: 访问 Kubernetes 集群最基本的方式就是使用 Kubectl,我们可以通过 kubectl apply 命令直接将 KCL 生成的 Kubernetes YAML 配置文件部署到集群中。这种方式简单快捷,适用于单个或少量资源的部署
  • 使用 CI/CD 工具: 可以使用 CI/CD 工具(例如 Jenkins、GitLab CI、CircleCI、ArgoCD、FluxCD 等)来实现 GitOps 自动化部署 Kubernetes YAML 配置文件到集群中。通过定义 CI/CD 流程和配置文件,可以实现自动化构建和部署到集群中
  • 使用支持 KRM Function 规范的工具: KRM Function 允许用户使用其他语言包括 KCL 来提升 YAML 模版和逻辑编写能力比如编写条件、循环等,这类工具主要包括 Kustomize, KPT, Crossplane 等,虽然 Helm 并没有原生支持,但是我们可以将 Helm 和 Kustomize 结合使用来实现
  • 使用客户端/运行时自定义抽象配置工具进行部署: 如 KusionStack, KubeVela 等,当然 KCL 允许您自定义您喜欢的应用配置模型。
  • 使用 KCL Operator: 结合 Kubernetes Mutation Webhook 和 Validation Webhook 支持运行时编写配置或策略。+使用配置管理工具: 结合配置管理工具(例如 Puppet、Chef、Ansible 等)来自动化部署 Kubernetes YAML 配置到集群中。这些工具可以通过定义 KCL 模板和变量来实现动态配置部署

KCL 支持多种部署方式和云原生工具集成有以下几个原因:

  • 灵活性:不同的部署方式适用于不同的场景和需求,因此提供多种选择可以使用户根据其特定的情况选择最合适的方式来部署应用程序或配置。
  • 工具生态系统:Kubernetes 是一个生态系统庞大的平台,有许多工具和技术被广泛应用。支持多种部署方式可以为用户提供更多选择,满足其使用习惯和技术偏好。
  • 规范和标准:Kubernetes 社区努力推动标准和规范,例如 OAM, KRM Function 规范和 Helm Charts 等。通过统一的 KRM KCL 规范和 KCL Module 提供多种支持方式,可以满足不同规范和标准的需求。
  • 自动化和集成:一些部署方式可以通过自动化工具和 CI/CD 管道进行集成,以实现自动化的部署流程。因此,提供多种方式可以满足不同自动化和集成的需求。

综上所述,支持多种部署方式可以为用户提供更大的灵活性和选择权,用户可以根据自己的需求和偏好来部署应用程序或配置。

下面是各个部署方式的具体使用方式

使用 Kubectl 工具

https://kcl-lang.io/blog/2023-11-20-search-k8s-module-on-artifacthub

使用 CI/CD 工具

https://kcl-lang.io/blog/2023-07-31-kcl-github-argocd-gitops

使用 KRM Function

https://kcl-lang.io/blog/2023-10-23-cloud-native-supply-chain-krm-kcl-spec

使用自定义抽象配置工具

https://kcl-lang.io/blog/2023-12-15-kubevela-integration

使用 KCL Operator

https://kcl-lang.io/docs/user_docs/guides/working-with-k8s/mutate-manifests/kcl-operator

使用配置管理工具

https://github.com/kcl-lang/kcl/issues/952

· 阅读需要 1 分钟

KusionStack 负责人李大元和云原生策略配置语言 KCL 项目的 Maintainer 宗喆在 2023 年 CNCF KCD 深圳会议的内容回顾,本文章主要是 KCL 语言部分演讲的内容回顾,活动链接: https://community.cncf.io/events/details/cncf-kcd-hangzhou-presents-kcd-shenzhen-2023/

云原生时代,基础设施代码化是开发者体验的核心

在当今快速发展的技术世界中,基础设施代码化(IaC)已成为自动化和管理云资源的关键,IaC 也成为了开发者体验的核心部分,带来了便利和效率的同时,但它也带来了一系列挑战。

intro-iac.png

首先,普通的应用开发者需要面对k8s提供的复杂的基础设施和平台概念,这造成了较高的认知负担,影响了更上层应用开发者的软件交付体验。 同时,对于一些不同的动态环境下的配置管理,目前工业界缺少一套成熟标准的管理办法,往往依赖于一线人员的专业素养,采用非标准化的方法比如脚本和胶水代码的方式进行配置管理,会导致项目变得越来越复杂,难于维护并且引入了配置漂移的风险。 因此,我们迫切需要一种能够减轻开发者认知负担、提供高效动态配置管理,并且通过标准的配置测试与验证手段来保证可靠性的配置管理方式,来确保基础设施既的高效与安全。

KCL 云原生策略配置语言

于是,我们尝试设计了一种新的配置语言 KCL ,通过在语言语法的设计和周边工具的增强来解决上文中提到诸多问题。

intro-kcl.png

KCL 语言针对前面提到的动态配置管理配置可靠性的验证与测试降低开发者认知负担的三个方面出发。提出三个主要的设计理念,MutationValidationAbstraction ,我们也将这三个设计理念作为了 KCL 核心的 slogan 展示在 KCL 官网的首页。

围绕着三个设计理念,KCL 在语言语法上做了一些设计:

  • 要使用 KCL 做动态的配置管理,语言侧就需要提供诸如流程控制,lambda表达式等能够描述程序行为的语法。
  • 要做配置可靠性相关的验证与测试:就要通过强类型系统,assert,check 等语法,赋予这个语言能够检查配置内容的能力,来支持测试和验证过程。
  • 降低开发者认知负担和开发成本:KCL 提供了 Schema 模型对数据结构进行抽象,对于开发者来说屏蔽非必要字段,并且通过包管理机制提供丰富的三方库资源,降低开发者直接编写模型的编写成本。

KCL 语言特性

这个提到的一些语言特性的展示,我在 ppt 中列了一些小的能够反映语言特性的代码片段:

kcl-feature.png

首先,最左面的图中展示的是与通用编程语言相近的流程控制,lambda 表达式的,python 风格的循环表达式。然后,中间的图中展示的是针对验证和测试过程提供的 assert 语句,schema 的 check 块,通过check 中的编写的策略可以对 Schema 中的字段进行检查。最后最右面的图是使用 Schema 定义数据结构,并且实例化配置。并且大家可以看到,在这个例子中,也已经展示出 KCL 的强类型系统对于配置类型的校验功能,如果在使用 Schema 实例化配置的过程中,某个字段类型写错了,在编译阶段,就会排查出错误。最后一张图是使用了k8s 的三方库,创建了一个 nginx 的 pod,一些不必要的字段已经被屏蔽掉了,应用开发人员只需要填充少数字段就可以完成配置的编写。

KCL & KRM & 动态配置管理

为了解决前面提到的三个问题,KCL 提供了提到的一些动态行为,check,assert语句,类型系统,Schema 抽象等等特性。但是,当我们尝试利用上述特性进行配置管理的时候,我们发现,KCL 的语言特性仅仅作用于 KCL 语言本身是不够的。想要解决 IaC 领域的问题,就必须要考虑到存量配置,将存量配置全部推倒用 KCL 重新很明显不是一个合适的方式,也无法实现。 因此,对于存量的一些配置,我们除了在语言机制上下功夫之外,还需要具备与社区生态集成的能力,能够将 KCL 语言特性的作用也发挥在其他的配置语言上, 使得 KCL 能够真正的解决 IaC 领域的问题,在尽可能减少对存量配置的改动下,充分发挥 KCL 语言特性的作用,解决前面提到的动态配置,可靠性校验和降低开发者心智负担的问题。

kcl-krm.png

于是,我们提出了 KCL KRM 规范,基于这个规范,我们可以借助 KCL 语言的能力,对 KRM 中的资源进行动态配置,模型校验和抽象。

KCL 生态集成

基于 KCL & KRM 规范我们开发了一些周边工具来使 KCL 能够更好的与周边工具生态进行集成。

kcl-integration.png

  • 数据结构的导入导出:KCL 提供了如 import/export 工具,支持使用 KCL 从 JsonSchema,Terraform 等导入/导出数据结构,以减少在开发过程中对于数据重复建模的过程,使 KCL 的特性能够更加直接的作用于存量配置。
  • 提供了如 kubectl, kustomize, helm/helmfile 等工具的 KCL 插件,用户可以针对不同的场景选择合适场景的引擎比如 Kubectl, KusionStack, KubeVela 或 Helmfile 等来和 KCL 结合将配置生效到集群。
  • 开发了 KCL Operator 与Kubernetes 集成,在运行时实现配置自动修改,无需重复开发Kubernetes Webhook 编写大量的配置处理逻辑。

KCL 建立在一个完全开放的云原生世界当中,KCL 几乎不与任何编排/引擎工具强绑定在一起,可同时为客户端或者运行时提供 API 抽象、组合和校验的能力。

KCL 周边工具

虽然 KCL 是一个领域语言。KCL 也提供了与通用编程语言语言能力基本等同的的工具链,如格式化,测试、文档、包管理等工具帮助更好地编写、理解和检查编写的配置或策略;通过 VS Code 等 IDE 插件和 Playground 降低配置编写、分享的成本;通过 Rust, Go, 和 Python 多语言 SDK 自动化地管理和执行配置。 对于 IDE 插件,KCL 目前主要提供了 VS Code,IntelliJ 和 NeoVim三种 IDE 插件基于同样的 KCL Language Server 实现了同样的补全、跳转、悬停、代码重构和格式化等能力。

kcl-tools.png

Artifacthub & KCL

我们与 ArtifactHub 进行了集成,将 Artifacthub 作为 KCL 的模型市场,提供了超过 200 + 的 KCL 模型,涵盖配置编辑,校验和模型抽象等多个方面。大家如果有兴趣的话,可以来看看是否有你感兴趣的模型,或者如果您有好的想法想要与大家分享,您也可以将您的 KCL 包贡献在 ArtifactHub 中。

kcl-ah.png

实践案例

接下来一些简单的案例,展示一些 KCL 的使用过程。

kcl-mut.png

首先,如果在集群中安装了 KCL Operator,那么就可以通过左面的配置文件对右面的配置进行 mutation 操作,通过在 source 字段中用 KCL 编写行为代码,动态的为右面的配置文件中增加了 annotation。

kcl-vet.png

然后,这个案例中展示了使用 KCL 提供的配置验证工具 kcl-vet 对 terraform plan 生成的配置内容进行验证。

kcl-abs.png

最后这个案例中,展示了 abstraction 的内容,可以通过直接编写 KCL 程序,或者使用 KCL & KRM 的方式编写配置,然后编译成对应的 Kubernetes manifests。

总结

KCL 语言是一个专注于云原生配置管理的领域语言,它提供了一系列的语言特性,如强类型系统,Schema 抽象,流程控制,lambda 表达式,assert 语句,check 语句等等,来解决云原生配置管理领域的问题,如动态配置管理,配置可靠性的验证与测试,降低开发者认知负担等等。同时,KCL 也提供了一系列的周边工具,如 IDE 插件,ArtifactHub 集成,KCL Operator 等等,来提升开发者的开发体验,降低开发成本。

其他资源

更多其他资源请参考: