V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
peefy
V2EX  ›  程序员

一步到位 - 使用 KCL OCI Registry 管理 Kubernetes 配置

  •  1
     
  •   peefy · 328 天前 · 430 次点击
    这是一个创建于 328 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 KCL 和 KPM 简化 Kubernetes 配置管理的使用指南。

    kcl-website.jpg

    什么是 KCL

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

    KPM是 KCL 包管理器。KPM 下载您的 KCL 包的依赖项、编译您的 KCL 包、制作包并将它们上传到 kcl 包注册表。

    为什么使用 KCL?

    KCL 期望通过更现代化的声明式配置语言在 Kubernetes 资源管理解决如下问题:

    • 通过代码抽象等手段屏蔽基础设施和平台的细节,降低研发者负担
    • 编辑校验已有的存量配置或模版
    • 通过配置语言无副作用地管理跨团队的大规模配置数据,提升团队协作效率
      • 生产级高性能编程语言编写代码的方式提升配置的灵活度,比如条件语句、循环、函数、包管理等特性提升配置重用的能力
      • 在代码层面提升配置语义验证的能力,比如字段可选 /必选、类型、范围等配置检查能力
      • 提供配置分块编写、组合和抽象的能力,比如结构定义、结构继承、约束定义等能力
      • 通过多语言 SDKKCL 语言插件等手段提升其自动化集成能力

    如何使用 KPM 管理 Kubernetes 资源

    1. 初始化一个空的 KCL 包

    使用 kpm init 命令创建一个名为 my_package 的 kcl 程序包, 并且在我们创建完成一个名为 my_package 的包后,我们需要通过命令 cd my_package 进入这个包来进行后续的操作。

    kpm init my_package
    

    kpm_init

    kpm 将会在执行kpm init my_package命令的目录下创建两个默认的配置文件 kcl.mod 和 kcl.mod.lock

    - my_package
            |- kcl.mod
            |- kcl.mod.lock
            |- # 你可以直接在这个目录下写你的 kcl 程序。
    

    kcl.mod.lock 是 kpm 用来固定依赖版本的文件,是自动生成的,请不要人工修改这个文件。

    kpm 将会为这个新包创建一个默认的 kcl.mod。如下所示:

    [package]
    name = "my_package"
    edition = "0.0.1"
    version = "0.0.1"
    

    2. 为 KCL 包添加依赖

    然后,您可以通过 kpm add 命令来为您当前的库添加一个外部依赖。

    如下面的命令所示,为当前包添加一个版本号为 1.27.2 并且名为 k8s 的依赖包。

    kpm add k8s:1.27.2
    

    kpm_add_k8s

    kpm 会为您将依赖添加到 kcl.mod 文件中.

    [package]
    name = "my_package"
    edition = "0.0.1"
    version = "0.0.1"
    
    [dependencies]
    k8s = "1.27.2" # The dependency 'k8s' with version '1.27.2'
    

    编写一个程序使用包 konfig 中的内容

    在当前包中创建 main.k

    - my_package
            |- kcl.mod
            |- kcl.mod.lock
            |- main.k # Your KCL program.
    

    并且将下面的内容写入 main.k 文件中。

    # 导入并使用外部依赖 `k8s` 包中的内容。
    import k8s.api.core.v1 as k8core
    
    k8core.Pod {
        metadata.name = "web-app"
        spec.containers = [{
            name = "main-container"
            image = "nginx"
            ports = [{containerPort = 80}]
        }]
    }
    

    3. 运行 KCL 代码

    你可以使用 kpm 编译刚才编写的 main.k 文件, 得到编译后的结果。

    kpm run
    

    输出为

    apiVersion: v1
    kind: Pod
    metadata:
      name: web-app
    spec:
      containers:
        - image: nginx
          name: main-container
          ports:
            - containerPort: 80
    

    kpm_run

    想要了解更多?

    有关详细信息,请参阅 KCL 网站和 KCL Github Repo 。

    my3157
        1
    my3157  
       328 天前
    jsonnet 不好用么?
    peefy
        2
    peefy  
    OP
       327 天前
    @my3157 之前有写过一篇总结: https://kcl-lang.io/blog/2022-declarative-config-overview ,在语言定位、场景和特性上还是有一些差别。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1013 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:20 · PVG 04:20 · LAX 13:20 · JFK 16:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.