
KCL是一个 CNCF 基金会托管的基于约束的记录及函数语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。
本栏目将会双周更新 KCL 语言社区最新动态,包括功能、官网更新和最新的社区动态等,帮助大家更好地了解 KCL 社区!
KCL 官网:https://kcl-lang.io
感谢所有贡献者过去两周 (2024 01.19 - 2024.02.01) 的杰出工作,以下是重点内容概述
模型更新
replicas等,可以直接通过一条命令渲染 Kubernetes 资源配置,并且可以在此模型的基础上修改并自定义资源模版kcl run oci://ghcr.io/kcl-lang/podinfo -D replicas=2 语言更新
工具链更新
文档工具更新
CodeQL KCL 工具
IDE 更新
语义高亮
错误修复
API 更新
SDK 更新
更多内容详见:https://github.com/kcl-lang/lib
集成更新
以下排名不分先后
将 KCL 与 Flux 等 GitOps 工具一起使用具有如下好处:
在此示例中,我们使用一个 Python Flask 应用和 Github Actions 作为 CI 示例,使用部署在集群中 Flux KCL Controller 作为 CD 示例,使用 KCL 定义需要部署的 Kubernetes 资源
注意:你可以在此方案中使用任何容器化应用以及不同的 CI 和 CD 系统如 Gitlab CI ,Jenkins CI ,ArgoCD 等
我们将 Python Flask 应用代码和配置代码分成两个仓库,以实现不同角色如开发人员和运维团队的关注点分离
整体工作流程如下:
k3d cluster create 注意:你可以在此方案中使用其他方式创建您自己的 Kubernetes 集群,如 kind, minikube 等。
git clone https://github.com/kcl-lang/flux-kcl-controller.git && cd flux-kcl-controller && make deploy 通过gitrepo.yaml文件,定义GitRepository和KCLRun对象,用来配置监控需要持续交付的 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 git clone https://github.com/kcl-lang/flask-demo.gi/ cd flask-demo flask-demo 仓库提交代码后,Github 会自动构建容器镜像,并将制品推送到 Docker hub 中,会再触发 flask-demo-kcl-manifests 仓库的 Action ,通过 KCL 自动化 API修改部署清单仓库中的镜像地址。现在让我们为 flask-demo 仓库创建一个提交,我们可以看到代码提交后触发业务仓库 Github CI 流程
当业务仓库 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 社区加入我们。
更多其他资源请参考:
1 mightybruce Feb 1, 2024 |