Skip to main content

1 post tagged with "KCL"

查看所有标签

· 阅读需要 1 分钟

什么是 KCL

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

什么是 Helmfile

Helmfile 是一个是用于简化和管理 Helm Charts 的声明性规范和工具,Helmfile KCL 插件为 Helmfile 工具提供了额外的功能,使得在使用 Helmfile 时更加便捷和高效,通过 Helmfile KCL 插件您可以

  • 通过无侵入的 Hook 方式在客户端直接编辑或者验证 Helm Chart 配置,将 Kubernetes 配置管理的数据部分和逻辑部分分离,无需 Fork 上游 Chart 修改内部逻辑,比如
    • 修改资源标签/注解, 注入 Sidecar 容器配置
    • 使用 KCL Schema 校验 Kubernetes 资源,定义自己的抽象模型并分享复用
  • 优雅地维护多环境、多租户场景配置,而不是简单地复制粘贴

在本文中,我们将带您快速了解和入门 Helmfile KCL 插件,让您轻松管理您的 Kubernetes Helm Charts。

下面以一个简单示例进行详细说明,使用 Helmfile KCL 插件无需您安装与 KCL 任何相关的组件,只需本机具备 Helmfile 工具的最新版本(v0.156.0+)即可。

使用 Helmfile KCL 插件

1. 工具安装

首先,确保您已经安装了 Helmfile 客户端工具,可以根据下面链接中的文档提示进行安装。

https://github.com/helmfile/helmfile

2. 创建 Helmfile 配置文件

在您的项目根目录中创建一个名为 helmfile.yaml 的文件,并按照 Helmfile 的语法编写配置。在这个文件中,您可以指定要使用的 Helm Charts、配置值和任何其他 Helmfile 支持的功能。此外,您还可以在 helmfile.yaml 中使用 KCL 插件的功能来加载对 Helm Chart 进行原地配置修改和验证

repositories:
- name: prometheus-community
url: https://prometheus-community.github.io/helm-charts

releases:
- name: prom-norbac-ubuntu
namespace: prometheus
chart: prometheus-community/prometheus
set:
- name: rbac.create
value: false
transformers:
# Use KCL Plugin to mutate or validate Kubernetes manifests.
- apiVersion: krm.kcl.dev/v1alpha1
kind: KCLRun
metadata:
name: "set-annotation"
annotations:
config.kubernetes.io/function: |
container:
image: docker.io/kcllang/kustomize-kcl:v0.2.0
spec:
source: |
# 仅通过一行 KCL 代码,就可实现对 workload 配置原地修改
items = [resource | {if resource.kind == "Deployment": metadata.annotations: {"managed-by" = "helmfile-kcl"}} for resource in option("resource_list").items]

在上述配置中,我们引用了 Prometheus Helm Chart, 并通过一行 KCL 代码就可以完成 Prometheus 的所有的 Deployment 资源注入标签 managed-by="helmfile-kcl"。

3. 运行 Helmfile 工具

一切准备就绪后,您可以运行 Helmfile 命令来部署、管理和维护您的 Helm Charts,通过如下命令我们可以将上述配置下发到集群。

helmfile apply

正常情况我们会看到如下面所示的输出

Adding repo prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories...

...

想要更多?

对于上述 helmfile 配置,我们可以将其封装为常用的配置修改逻辑并使用,无需不断重复编写 KCL 代码并到处复制粘贴。此外,我们在 KCL 官方 Registry 已经封装好了许多常用的 Kubernetes 配置编辑和校验代码片段 https://github.com/orgs/kcl-lang/packages

registry

除了支持在配置文件中书写 KCL 代码,我们还支持直接引用 Registry 中的代码片段,如下所示

apiVersion: krm.kcl.dev/v1alpha1
kind: KCLRun
metadata:
name: https-only
annotations:
krm.kcl.dev/version: 0.0.1
krm.kcl.dev/type: validation
documentation: >-
Requires Ingress resources to be HTTPS only. Ingress resources must
include the `kubernetes.io/ingress.allow-http` annotation, set to `false`.
By default a valid TLS {} configuration is required, this can be made
optional by setting the `tlsOptional` parameter to `true`.
More info: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
spec:
# Use the OCI source
source: oci://ghcr.io/kcl-lang/https-only

具体的示例代码在这里

如果您想贡献更多的 KCL 代码库,欢迎联系我们并参阅文档进行贡献 https://kcl-lang.io/zh-CN/docs/user_docs/guides/package-management/share_your_pkg/

小结

本文提供了一个快速入门指南,帮助您在 5 分钟内掌握 Helmfile KCL 插件的基本用法。现在,您可以开始使用这个强大的工具来简化和优化您的 Kubernetes 应用部署流程了!

其他资源

更多其他资源请参考:

· 阅读需要 1 分钟

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

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

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

内容概述

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

  • 🔧 语言及工具链更新
    • KCL 格式化工具更新
      • 支持对有语法错误的代码片段和部分代码片段进行格式化
      • 支持对缩进不对的配置块进行自动校正
    • KCL 文档工具更新
      • 支持导出文档索引页
    • KCL 导入工具更新
      • 支持 Terraform Provider Schema 转换为 KCL Schema
    • KCL 导出工具更新
      • 支持由 KCL Schema 导出 OpenAPI Spec,接入 OpenAPI 生态
    • KCL IDE 更新
      • 支持编译缓存特性,提升部分 IDE 功能性能
      • 丰富 IDE 错误信息,并提供 Import 语句快速修复能力
    • KCL 包管理工具 KPM 更新
      • kpm push 输出信息体验优化,增加推送 KCL 程序包的重复 tag 检查
      • 为 kpm push 和 kpm pkg 增加参数 —vendor 决定是否将 KCL 程序包的三方库打包在一起
    • KCL 语言更新
      • 优化 Schema 语义检查和联合类型检查等错误信息
      • 支持导出配置块的类型输出
  • 🏄 API 更新
    • KCL Schema 模型解析 GetSchemaType API 获取 KCL 包相关信息和 Schema 属性默认值
  • 📰 官网和用例更新

特别鸣谢

以下排名不分先后

精选更新

KCL Import 工具更新

KCL Import 工具在 Protobuf, JsonSchema OpenAPI 模型和 Go 结构体转换为 KCL Schema 的基础上,新增 Terraform Provider Schema 到 KCL Schema 的转换支持,比如对于如下的 Terraform Provider Json (通过 terraform providers schema -json > provider.json 命令获得,详情请参考 https://developer.hashicorp.com/terraform/cli/commands/providers/schema)

{
"format_version": "0.2",
"provider_schemas": {
"registry.terraform.io/aliyun/alicloud": {
"provider": {
"version": 0,
"block": {
"attributes": {},
"block_types": {},
"description_kind": "plain"
}
},
"resource_schemas": {
"alicloud_db_instance": {
"version": 0,
"block": {
"attributes": {
"db_instance_type": {
"type": "string",
"description_kind": "plain",
"computed": true
},
"engine": {
"type": "string",
"description_kind": "plain",
"required": true
},
"security_group_ids": {
"type": [
"set",
"string"
],
"description_kind": "plain",
"optional": true,
"computed": true
},
"security_ips": {
"type": [
"set",
"string"
],
"description_kind": "plain",
"optional": true,
"computed": true
},
"tags": {
"type": [
"map",
"string"
],
"description_kind": "plain",
"optional": true
}
},
"block_types": {},
"description_kind": "plain"
}
},
"alicloud_config_rule": {
"version": 0,
"block": {
"attributes": {
"compliance": {
"type": [
"list",
[
"object",
{
"compliance_type": "string",
"count": "number"
}
]
],
"description_kind": "plain",
"computed": true
},
"resource_types_scope": {
"type": [
"list",
"string"
],
"description_kind": "plain",
"optional": true,
"computed": true
}
}
}
}
},
"data_source_schemas": {}
}
}
}

经过 KCL Import 工具可以输出为如下 KCL 代码

"""
This file was generated by the KCL auto-gen tool. DO NOT EDIT.
Editing this file might prove futile when you re-run the KCL auto-gen generate command.
"""

schema AlicloudConfigRule:
"""
AlicloudConfigRule

Attributes
----------
compliance: [ComplianceObject], optional
resource_types_scope: [str], optional
"""

compliance?: [ComplianceObject]
resource_types_scope?: [str]

schema ComplianceObject:
"""
ComplianceObject

Attributes
----------
compliance_type: str, optional
count: int, optional
"""

compliance_type?: str
count?: int

schema AlicloudDbInstance:
"""
AlicloudDbInstance

Attributes
----------
db_instance_type: str, optional
engine: str, required
security_group_ids: [str], optional
security_ips: [str], optional
tags: {str:str}, optional
"""

db_instance_type?: str
engine: str
security_group_ids?: [str]
security_ips?: [str]
tags?: {str:str}

check:
isunique(security_group_ids)
isunique(security_ips)

KCL Vault 集成

仅需三步,我们就可以使用 Vault 来存储并管理敏感信息并在 KCL 中使用。

首先我们安装并使用 Vault 存储 foobar 信息

vault kv put secret/foo foo=foo
vault kv put secret/bar bar=bar

然后编写如下 KCL 代码 (main.k)

apiVersion = "apps/v1"
kind = "Deployment"
metadata = {
name = "nginx"
labels.app = "nginx"
annotations: {
"secret-store": "vault"
# Valid format:
# "ref+vault://PATH/TO/KV_BACKEND#/KEY"
"foo": "ref+vault://secret/foo#/foo"
"bar": "ref+vault://secret/bar#/bar"
}
}
spec = {
replicas = 3
selector.matchLabels = metadata.labels
template.metadata.labels = metadata.labels
template.spec.containers = [
{
name = metadata.name
image = "${metadata.name}:1.14.2"
ports = [{ containerPort = 80 }]
}
]
}

最后可以通过 Vals 命令行工具获得解密后的配置

kcl main.k | vals eval -f -

更多详情和用例可以参考 https://kcl-lang.io/docs/user_docs/guides/secret-management/vault

社区动态

  • 🎉 恭喜来自华中科技大学的朱俊星同学成功通过 Gitlink 编程夏令营 (GLCC) 中期考核并出色地完成了 KCL Import 工具 Jsonschema 和 Terraform Provider Schema 与 KCL Schema 转换的部分,后续社区将为其授予 KCL 社区 Maintainer 角色
  • 💻 KCL 参加 CNCF 云原生计算基金会应用交付 TAG 社区会议并作项目汇报

其他资源

❤️ 感谢所有 KCL 用户和社区小伙伴在社区中提出的宝贵反馈与建议。后续我们会撰写更多 KCL v0.5.x 新版本功能解读系列文章,敬请期待!

更多其他资源请参考: