
KCL是一个 CNCF 基金会托管的基于约束的记录及函数语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。
本栏目将会双周更新 KCL 语言社区最新动态,包括功能、官网更新和最新的社区动态等,帮助大家更好地了解 KCL 社区!
KCL 官网:https://kcl-lang.io
感谢所有贡献者过去两周 (2023 12.22 - 2024.01.04) 的杰出工作,以下是重点内容概述
工具链更新
包管理工具更新
-符号的外部包自动转义为 KCL 可以识别的_符号如set-annotation->set_annotationkcl mod add在 Registry 包版本和本地已有包版本不同时引起的空指针错误IDE 更新
语义高亮
补全功能增强
以下排名不分先后
Crossplane 及其 Composite Function 功能被用于解耦 XR ( CompositeResource )和复合资源定义。XR 允许开发者创建更高级别的抽象,这些抽象能够封装和组合来自不同提供商和服务的多种类型云资源。
使用 Crossplane 的 Composite Function 功能来渲染这些抽象能够有效增强各种提供商资源的模板能力,同时减少所需的 YAML 代码量。
将 KCL 与 Crossplane Composite Function 功能结合可以获得如下能力
我们编写一个Network抽象模型,并使用 KCL 代码对其进行渲染得到托管资源VPC和InternetGateway
Function资源会创建一个函数 Pod ,当您创建一个 Crossplane Composition Resource 时,Crossplane 会向这个 Pod 发送请求,询问它要创建什么资源。
通过设置spec.package值为kcllang/crossplane-kcl表示我们这里使用 KCL 函数
kubectl apply -f- << EOF apiVersion: pkg.crossplane.io/v1beta1 kind: Function metadata: name: kcl-function spec: package: kcllang/crossplane-kcl EOF 就像渲染函数一样,在这里我们指定 KCL 如何接受输入Network资源并生成VPC资源和InternetGateway资源。KCL 函数可以引用自 OCI Registry 或者 GitHub 上面的代码,当然也可以直接书写在Composition资源中。
kubectl apply -f- << EOF apiVersion: apiextensions.crossplane.io/v1 kind: Composition metadata: name: xlabels.fn-demo.crossplane.io labels: provider: aws spec: writeConnectionSecretsToNamespace: crossplane-system compositeTypeRef: apiVersion: fn-demo.crossplane.io/v1alpha1 kind: XNetwork mode: Pipeline pipeline: - step: normal functionRef: name: kcl-function input: apiVersion: krm.kcl.dev/v1alpha1 kind: KCLRun metadata: name: basic spec: # Generate new resources target: Resources # OCI, Git or inline source # source: oci://ghcr.io/kcl-lang/crossplane-xnetwork-kcl-function # source: github.com/kcl-lang/modules/crossplane-xnetwork-kcl-function source: | # Get the XR spec fields id = option("params")?.oxr?.spec.id or "" # Render XR to crossplane managed resources network_id_labels = {"networks.meta.fn.crossplane.io/network-id" = id} if id else {} vpc = { apiVersion = "ec2.aws.upbound.io/v1beta1" kind = "VPC" metadata.name = "vpc" metadata.labels = network_id_labels spec.forProvider = { region = "eu-west-1" cidrBlock = "192.168.0.0/16" enableDnsSupport = True enableDnsHostnames = True } } gateway = { apiVersion = "ec2.aws.upbound.io/v1beta1" kind = "InternetGateway" metadata.name = "gateway" metadata.labels = network_id_labels spec.forProvider = { region = "eu-west-1" vpcIdSelector.matchCOntrollerRef= True } } items = [vpc, gateway] EOF 我们使用 Crossplane XRD 为输入资源 Network 定义了一个 Schema ,它有一个名为 id 的字段,表示网络 id 。
kubectl apply -f- << EOF apiVersion: apiextensions.crossplane.io/v1 kind: CompositeResourceDefinition metadata: name: xnetworks.fn-demo.crossplane.io spec: group: fn-demo.crossplane.io names: kind: XNetwork plural: xnetworks claimNames: kind: Network plural: networks versions: - name: v1alpha1 served: true referenceable: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: id: type: string description: ID of this Network that other objects will use to refer to it. required: - id EOF kubectl apply -f- << EOF apiVersion: fn-demo.crossplane.io/v1alpha1 kind: Network metadata: name: network-test-functions namespace: default spec: id: network-test-functions EOF kubectl get VPC -o yaml | grep network-id networks.meta.fn.crossplane.io/network-id: network-test-functions kubectl get InternetGateway -o yaml | grep network-id networks.meta.fn.crossplane.io/network-id: network-test-functions 可以看到我们确实成功生成了VPC和InternetGateway资源,并且它们的字段符合预期 (接受 XR 输入的 id 字段并转换为VPC资源和InternetGateway资源的标签)。
可以看到,上述 KCL 抽象代码常常需要 Crossplane 作为控制平面中介,但是我们仍然可以完全摆脱 Crossplane 控制平面在客户端完成抽象,并直接生成 Crossplane 管理的资源,以减轻集群负担和操作成本的同时并获得更好的配置编写体验。
因为 KCL 模型并不局限于在客户端还是运行时进行使用,因此我们在客户端仅通过一条命令就可以完成上述所有功能:
kcl run oci://ghcr.io/kcl-lang/crossplane-xnetwork-kcl-function -S items -D params='{"oxr": {"spec": {"id": "network-test-functions"}}}' 输出为:
apiVersion: ec2.aws.upbound.io/v1beta1 kind: VPC metadata: name: vpc labels: networks.meta.fn.crossplane.io/network-id: network-test-functions spec: forProvider: region: eu-west-1 cidrBlock: 192.168.0.0/16 enableDnsSupport: true enableDnsHostnames: true --- apiVersion: ec2.aws.upbound.io/v1beta1 kind: InternetGateway metadata: name: gateway labels: networks.meta.fn.crossplane.io/network-id: network-test-functions spec: forProvider: region: eu-west-1 vpcIdSelector: matchControllerRef: true 当然,后续我们会结合crossplane-provider-aws等模型库进一步详细介绍如何获得一个更好的客户端抽象,尽情期待!
此外,可以在这里查看到更多 Crossplane 和 KCL 结合的用例:https://github.com/kcl-lang/crossplane-kcl
感谢所有 KCL 用户和社区小伙伴在社区中提出的宝贵反馈与建议。后续我们会发布更多 KCL 云原生模型和工具集成文章,敬请期待! 查看KCL 社区加入我们。
更多其他资源请参考: