Skip to main content

· 阅读需要 1 分钟

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

对云原生、平台工程、语言编译器、语言包管理工具和语言 IDE 感兴趣的小伙伴,我们邀请你申请 KCL 的 2024 春季 Linux 基金会 LFX Mentorship 项目,完成项目有最低 3000 美金的奖励哦!快来申请吧!

LFX Mentorship 项目

我们有三个 Mentorship 项目,内容涵盖包管理工具,语言编译器和语言 IDE 三个方面。

1. 为 KCL 包管理工具添加版本管理支持

KCL 目前的包管理工具(kpm)目前支持上传,下载等分发 KCL 包的功能,不支持 KCL 包的版本管理。在使用 kpm 为 KCL 添加三方库依赖的过程中,kpm 会根据依赖关系自动下载全部的三方库依赖,如果在下载的过程中出现相同包的不同版本,应该根据包版本管理策略提供对应的选择策略,选择合适的版本下载。

在此项目中,你需要为 kpm 增加包版本管理部分的功能,使 kpm 在管理三方库的过程中能够根据依赖情况,选择合适的三方库进行下载,确保编译过程的正常进行。

2. KCL IDE 的快速修复

为 KCL IDE 开发快速修复功能,当 KCL 程序在 IDE 中出现编译错误时,Quick Fix 功能能够根据用户的错误类型,在 KCL 程序错误的位置提供快速的问题修复。

在此项目中,你需要根据 KCL 程序的错误类型,为用户 IDE 开发不同的 Quick Fix 功能,降低用户开发门槛。

3. KCL IDE 自动加载 KCL 三方库。

KCL IDE 作为 KCL 用户最直接的开发界面,要想提供良好的用户体验,除了提供语言的高亮,跳转,补全等基本功能外,还需要保证编译过程的稳定。但是目前 KCL 的 IDE 经常会因为三方库找不到而导致编译错误,目前 KCL 的包管理工具 kpm 已经提供了自动下载和更新三方库的能力,但是仍然需要用户通过命令行的方式更新三方库,这使得用户的开发体验受到影响,因此 KCL IDE 需要与 KCL 的包管理工具 kpm 进行集成,通过 kpm 为 IDE 提供三方库的自动下载更新的能力。

在此项目中,你需要借助 kpm 的能力,实现 IDE 中常见的如:加载 KCL 包自动下载三方库,kcl.mod 变更时自动更新三方库和 Quick Fix 触发三方库自动下载等功能,保证 KCL IDE 在包管理工具的支持下能够提供更加完整流畅的开发体验。

4. 如何申请

在 LFX mentorship 平台上申请你钟意的项目,你可以通过以下链接访问 LFX mentorship 平台。申请从2024年1月29日开始,到2月13日结束。

有任何的问题,欢迎直接到对应的 issue 中获取更多内容或者与我们讨论:

5. 项目时间节点

事件开始日期结束日期
学员申请开放January 29February 13, 5:00 PM PDT
申请审查/录取决定/人力资源文书工作February 13February 27, 5:00 PM PDT
导师计划开始并分配初始工作March 4 (Week 1)
中期学员评估 / 第一笔津贴支付April 10 (Week 6)
最终学员评估到期 / 学员反馈提交到期 / 批准第二笔和最后一笔津贴支付May 22, 5:00 PM PST (Week 12)
学期最后一天May 31

· 阅读需要 1 分钟

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

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

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

内容概述

感谢所有贡献者过去两周 (2024.01.19 - 2024.02.01) 的杰出工作,以下是重点内容概述

📦 模型更新

  • 新增 Podinfo 应用配置模型,支持设置外部动态参数如 replicas 等,可以直接通过一条命令渲染 Kubernetes 资源配置,并且可以在此模型的基础上修改并自定义资源模版
kcl run oci://ghcr.io/kcl-lang/podinfo -D replicas=2

🏄 语言更新

  • 改善编译时对象属性找不到的报错信息
  • 修复 Schema 对象必选属性递归检查错误
  • 提升 Schema 索引签名类型检查健壮性

🔧 工具链更新

  • 文档工具更新

    • 支持在生成的 Markdown 格式文档对多行字符使用 HTML 转义
  • CodeQL KCL 工具

    • 初步支持 CodeQL KCL dbschema 定义以及对 KCL 语法语义进行数据提取,并可通过 CodeQL 进行数据查询对 KCL 代码进行静态分析和扫描,提升代码安全

💻 IDE 更新

  • 语义高亮
    • KCL IDE 优化了语义高亮。
  • 错误修复
    • 修复了字符串后跟注释中补全错误的问题
    • 修复了 Schema 内部属性符号不能跳转的问题

🎁 API 更新

  • 新增语法和语义分析 API 用于对 KCL 代码进行分析
  • 新增构建二进制产物 API 用于缓存编译结果
  • 新增运行二进制产物 API 用于直接运行编译结果,避免重复编译并提升性能
  • 新增代码生成 API 以编程方式实现 KCL 代码生成而不是编写复杂的模版

🚀 SDK 更新

  • KCL Go SDK 更新至 0.7.5 版本
  • KCL Python SDK 更新至 0.7.5 版本
  • KCL Rust SDK 更新至 0.7.5 版本
  • KCL Java SDK 新增语法树、作用域、符号等语法语义结构定义及相关查询 API

更多内容详见: https://github.com/kcl-lang/lib

🚢 集成更新

特别鸣谢

以下排名不分先后

  • 感谢 @octonawish-akcodes 对 KCL 代码清理和 FAQ 文档的持续贡献 🙌
  • 感谢 @satyazzz123 对 KRM KCL 支持读取环境变量功能的贡献 🙌
  • 感谢 @AkashKumar7902 对 KCL 包管理工具功能的贡献 🙌
  • 感谢 @UtkarshUmre 对 KCL linux-arm64 构建 CI 的贡献 🙌
  • 感谢 @steeling, @rozaliev, @CloudZero357, @martingreber, @az, @Art3mK,@AdmiralNemo 和 @Erick 等在近两周使用 KCL 过程中提供的宝贵建议与反馈 🙌

精选更新

Flux KCL 集成

将 KCL 与 Flux 等 GitOps 工具一起使用具有如下好处:

  • 通过 KCL 语言的抽象能力和可编程能力可以帮助我们简化复杂的 Kubernetes 部署配置文件,降低手动编写 YAML 文件的错误率,将配置约束检查控制在编译时,编写即感知错误;同时可以消除多余的配置模版,提升多环境多租户的配置扩展能力,提高配置的可读性和可维护性。
  • KCL 允许开发人员以声明式的方式定义应用程序所需的资源,通过将 KCL 和 Flux 相结合可以帮助我们更好地实现基础设施即代码(IaC),提高部署效率,简化应用程序的配置管理。
  • 使用 Flux,开发人员和运维团队可以通过分别修改应用和配置代码来管理应用程序的部署,Flux Controller 将自动同步对配置的更改,从而实现持续部署并确保一致性。如果出现问题,可以实现快速回滚。

工作流程

在此示例中,我们使用一个 Python Flask 应用和 Github Actions 作为 CI 示例,使用部署在集群中 Flux KCL Controller 作为 CD 示例,使用 KCL 定义需要部署的 Kubernetes 资源

注意:你可以在此方案中使用任何容器化应用以及不同的 CI 和 CD 系统如 Gitlab CI,Jenkins CI,ArgoCD 等

我们将 Python Flask 应用代码和配置代码分成两个仓库,以实现不同角色如开发人员和运维团队的关注点分离

整体工作流程如下:

  1. 从 Github 拉取应用代码
  2. 应用代码开发并提交到提交到 GitHub 存储库
  3. 触发 GitHub Actions 对应用代码进行编译,生成容器镜像,并将容器镜像推送到 Docker Hub 容器注册表
  4. 触发 GitHub Actions 根据 docker.io 容器注册表中容器镜像的版本号并同步更新 KCL 定义的 Kubernetes 清单部署文件
  5. Flux KCL Controller 获取 KCL 定义的 Kubernetes 清单更改并更新部署至 Kubernetes 集群

具体步骤

1. 配置 Kubernetes
  • 安装 K3d 并创建一个集群
k3d cluster create

注意:你可以在此方案中使用其他方式创建您自己的 Kubernetes 集群,如 kind, minikube 等。

  • 安装 Kubectl
  • 安装 Kustomize
2. 安装 Flux KCL Controller

flux-kcl-workflow

git clone https://github.com/kcl-lang/flux-kcl-controller.git && cd flux-kcl-controller && make deploy
3. 配置需要持续交付的 Git 仓库

通过 gitrepo.yaml 文件,定义 GitRepositoryKCLRun 对象,用来配置监控需要持续交付的 Git 仓库以及运行 KCL 配置所需的额外参数

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: kcl-deployment
namespace: default
spec:
interval: 10s # 每隔 10s 检查一次仓库
url: https://github.com/kcl-lang/flask-demo-kcl-manifests.git
ref:
branch: main # 监控 main 分支
---
apiVersion: krm.kcl.dev.fluxcd/v1alpha1
kind: KCLRun
metadata:
name: kcl-git-controller
namespace: default
spec:
sourceRef:
kind: GitRepository
name: kcl-deployment

使用命令 kubectl apply -f gitrepo.yaml 将该对象部署到集群中。

如果您使用的是私有存储库,需要使用私钥凭据配置专用私有存储库访问权限。请参阅这里以获取更多详细信息。

注意:你也可以在此方案中使用 OCIRepository,对文章开头提到的 oci://ghcr.io/kcl-lang/podinfo 配置包进行持续交付,比如下面的配置

apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: OCIRepository
metadata:
name: podinfo
namespace: default
spec:
interval: 5m0s
url: oci://ghcr.io/kcl-lang/podinfo
ref:
tag: latest
---
apiVersion: krm.kcl.dev.fluxcd/v1alpha1
kind: KCLRun
metadata:
name: kcl-git-controller
namespace: default
spec:
sourceRef:
kind: OCIRepository
name: podinfo
4. 提交业务代码
  • 获取代码
git clone https://github.com/kcl-lang/flask-demo.git/
cd flask-demo

flask-demo 仓库提交代码后,Github 会自动构建容器镜像,并将制品推送到 Docker hub 中,会再触发 flask-demo-kcl-manifests 仓库的 Action,通过 KCL 自动化 API 修改部署清单仓库中的镜像地址。现在让我们为 flask-demo 仓库创建一个提交,我们可以看到代码提交后触发业务仓库 Github CI 流程

5. 配置自动更新

当业务仓库 Github CI 流程执行完成后,会自动在存放 KCL 资源配置的仓库触发一个 CI 自动更新配置并提交到 flask-demo-kcl-manifests main 分支,commit 信息如下

  • 我们可以获得部署清单源码进行编译验证
git clone https://github.com/kcl-lang/flask-demo-kcl-manifests.git/
cd flask-demo-kcl-manifests
git checkout main && git pull && kcl

输出 YAML 为

apiVersion: apps/v1
kind: Deployment
metadata:
name: flask_demo
labels:
app: flask_demo
spec:
replicas: 1
selector:
matchLabels:
app: flask_demo
template:
metadata:
labels:
app: flask_demo
spec:
containers:
- name: flask_demo
image: "kcllang/flask_demo:6428cff4309afc8c1c40ad180bb9cfd82546be3e"
ports:
- protocol: TCP
containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: flask_demo
labels:
app: flask_demo
spec:
type: NodePort
selector:
app: flask_demo
ports:
- port: 5000
protocol: TCP
targetPort: 5000

从上述配置可以看出资源的镜像确实自动更新为了新构建的镜像内容。同时 Flux KCL Controller 会自动拉取配置并更新到集群,这样就实现了业务代码提交并部署 Kubernetes 的 e2e 完整自动化流程,每次只需提交业务代码即可,当然可以进一步搭配 Flagger 实现多种部署策略如金丝雀发布、蓝绿发布等。

其他资源

❤️ 感谢所有 KCL 用户和社区小伙伴在社区中提出的宝贵反馈与建议。后续我们会发布更多 KCL 云原生模型和工具集成文章,敬请期待! 查看 KCL 社区 加入我们。

更多其他资源请参考: