Skip to main content

· 阅读需要 1 分钟

内容转载整理自 Crossplane 官网博客原文:https://blog.crossplane.io/function-kcl

内容简介

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

自 Crossplane v1.14 中的组合函数 Beta 版发布以来,使用 Crossplane 构建云原生平台的可能体验范围一直在迅速扩大。KCL 团队在第一时间进行跟进并主动构建了一个可重用的函数,整个 Crossplane 生态系统现在可以利用 KCL 提供的高水平经验和能力来构建自己的云原生平台

同时 Crossplane 宣布 KCL 函数成为第一个发布到 Upbound 市场的第三方函数组件,地址为 https://marketplace.upbound.io/providers/crossplane-contrib/function-kcl 。源代码可以在 https://github.com/crossplane-contrib/function-kcl 找到,欢迎贡献和反馈。

您可以通过使用以下一行命令安装 function-kcl 并开始在整个 Crossplane 控制平面中使用:

crossplane xpkg install function xpkg.upbound.io/crossplane-contrib/function-kcl:v0.2.0

Crossplane 团队和社区感谢 KCL 团队的这笔巨大捐赠,以及对不断发展的 Functions for Crossplane 生态系统的巨大补充

crossplane-announcing

Crossplane 及其组合模型允许开发人员创建更高级别的抽象,这些抽象可以封装和组合跨不同提供商和服务的多种类型的云资源。使用组合函数来渲染这些抽象可以有效增强各种提供者资源的模板功能,同时减少所需的 YAML 代码量。

将 KCL 与 Crossplane 组合函数结合起来有几个好处:

  • 简化复杂配置:KCL 提供了比一般 DSL 更简洁的语法和结构,降低了配置的复杂性。与 Crossplane 的复合资源结合时,您可以创建更直观且易于理解的具有循环和条件功能的配置模板对接到不同的云平台,从而简化资源的定义和维护,而不是编写重复的 YAML 模版。
  • 可重用性和模块化:KCL 通过 OCI Registry 支持模块化和代码重用,这意味着您可以创建可重用的配置组件。与 Crossplane 结合,可以促进复合资源的模块化,提高配置的重用性,并减少错误。
  • 自动化和策略支持:您可以使用 KCL 的强大功能来编写策略和约束,这些策略和约束与 Crossplane 的声明性资源管理相结合,且可以自动实施,从而确保云环境中的合规性,进一步提升效率和稳定性。

快速开始

有两种将 KCL 和 Crossplane 结合使用的方式

  • 一种是使用 KCL 编写 Crossplane 组合函数并安装到集群使用,仍然采用 YAML 来定义 App Team 所需的 Schema 和输入,使用 KCL 撰写渲染逻辑到 Crossplane Managed Resource 的逻辑以对接不同的云平台或者 Kubernetes 集群。需要注意的是:这种方式既可以将 KCL 函数安装到集群中使用,也可以使用 crossplane beta render 命令直接在客户端完成 Managed Resource 的渲染。

crossplane-kcl-func

  • 另外一种是使用 KCL 完全在客户端提供面向应用开发者的抽象并生成 Crossplane 托管资源下发到集群,提供 Kubernetes 的统一可编程接入层,具体使用 KCL Schema 规定 App Team 所需的 Schema 输入,并撰写渲染到 Crossplane Managed Resource 的逻辑以对接不同的云平台或者 Kubernetes 集群

kcl-on-crossplane

两种方法的具体操作方式可以查看 Crossplane 官方博客内容:https://blog.crossplane.io/function-kcl

crossplane-kcl-blog

此外,这两种方式都需要 Registry 来协助完成工作。它们之间的最终选择可能取决于您的操作习惯和环境成本。无论选择哪种方法,我们都建议在 Git 中维护 KCL 代码,以便更好地实施 GitOps 并获得更好的 IDE 体验和可重用模块,例如使用 Crossplane AWS Module: https://github.com/kcl-lang/modules/tree/main/crossplane-provider-aws

小结

现在 function-kcl 项目已捐赠给 Crossplane 社区,我们鼓励整个社区对其进行测试,并尝试使用 KCL(Crossplane Functions 提供的最新高级语言体验)构建云原生控制平面。我们非常欢迎社区在GitHub 上的存储库中提供贡献和反馈。让我们知道您的想法!https://github.com/crossplane-contrib/function-kcl

更多其他资源请参考:

· 阅读需要 1 分钟

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

本栏目将会双周更新 KCL 语言社区最新动态,包括功能、官网更新和最新的社区动态等,帮助大家更好地了解 KCL 社区!

KCL 官网:https://kcl-lang.io

内容概述

感谢所有贡献者过去一段时间 (2024.02.02 - 2024.02.22) 的杰出工作,以下是重点内容概述

📦 模型更新

  • JSON Schema 库发布 0.0.4 版本,修复类型定义错误, 可以执行如下命令更新或添加依赖
kcl mod add jsonschema:0.0.4

🏄 语言更新

KCL 发布 0.8.0 预览版本,主要包含如下更新

  • 新增 file 系统库用于读取 KCL 模块信息和系统文件,包含 read, glob, workdirmodpath 函数,详见 Issue: https://github.com/kcl-lang/kcl/issues/1049
  • 优化非预期 token 的语法错误提示
  • 去除 Schema 对象内部非预期的内置类型属性通过 print 输出
  • 修复非预期的字典生成表达式中的 key 与循环变量相同时的变量计算
  • 修复 schema 内部诸如 "$if" 的字符串标识符定义找不到的错误

🔧 工具链更新

  • kcl run 支持使用 -H 参数输出以 _ 开头的隐藏字段
  • kcl run 支持直接运行远端 Git 仓库代码
  • kcl mod 新增 kcl mod graph 子命令输出模块依赖图
  • kcl fmt 修复 else 块中存在 if 语句时的格式化错误

💻 IDE 更新

  • 优化了内置函数和系统库的补全以及悬停文档提升
  • 修复了配置块内部 if 语句符号不能跳转和补全的问题
  • 增加变量引用错误时的快速修复功能

🎁 API 更新

  • OverrideFile API 新增诸如 a["b"].c 的 path 对配置进行查询和修改

🚀 插件系统更新

除了使用 Python 为 KCL 插件函数,现在支持使用 Go 为 KCL 编写插件函数,使用方式非常简单。

  • 定义插件 (以一个包含 add 函数的 hello 插件作为示例)
package hello_plugin

import (
"kcl-lang.io/kcl-go/pkg/plugin"
)

func init() {
plugin.RegisterPlugin(plugin.Plugin{
Name: "hello",
MethodMap: map[string]plugin.MethodSpec{
"add": {
Body: func(args *plugin.MethodArgs) (*plugin.MethodResult, error) {
v := args.IntArg(0) + args.IntArg(1)
return &plugin.MethodResult{V: v}, nil
},
},
},
})
}
  • 使用插件
package main

import (
"fmt"

"kcl-lang.io/kcl-go/pkg/kcl"
"kcl-lang.io/kcl-go/pkg/native" // Import the native API
_ "kcl-lang.io/kcl-go/pkg/plugin/hello_plugin" // Import the hello plugin
)

func main() {
// Note we use `native.MustRun` here instead of `kcl.MustRun`, because it needs the cgo feature.
yaml := native.MustRun("main.k", kcl.WithCode(code)).GetRawYamlResult()
fmt.Println(yaml)
}

const code = `
import kcl_plugin.hello

name = "kcl"
three = hello.add(1,2) # 3
`

🚢 集成更新

  • 发布 Ansible KCL 模块初始版本,支持基本的运行 KCL 代码功能,其他功能完善中
  • KCL FluxCD Controller 优化 Git Source 功能,OCI Source 功能支持中

特别鸣谢

以下排名不分先后

  • 感谢 @octonawish-akcodes 和 @d4v1d03 对 KCL FAQ 文档和 KCL IDE 功能的持续贡献 🙌
  • 感谢 @octonawish-akcodes 对 Ansible KCL Module 的贡献
  • 感谢 @AkashKumar7902 和 @Vanshikav123 对 KCL 包管理工具功能的贡献 🙌
  • 感谢 @StevenLeiZhang 对 KCL 文档和 KCL 插件的贡献
  • 感谢 @TheChinBot, @Evgeny Shepelyuk, @yonas, @steeling, @vtomilov, @Fdall, @CloudZero357, @bozaro, @starkers, @MrGuoRanDuo 和 @FLAGLORD 等在近段时间使用 KCL 过程中提供的宝贵建议与反馈 🙌

其他资源

预计 2024 年 2 月底会发布 0.8 正式版本,感谢所有 KCL 用户和社区小伙伴在社区中提出的宝贵反馈与建议。后续我们会发布更多 KCL 技术和案例文章,敬请期待! 查看 KCL 社区 加入我们。

更多其他资源请参考: