查看原文
其他

聊聊 K8S 中的 SideCar 设计模式·第 2 篇

小k同学 规模化云原生运维 2023-12-28

在前一篇文章聊聊K8S中的SideCar设计模式·第1篇中,我们介绍了土话说的三蹦子的 SideCar 设计模式。本文尝试用 KCL 和 CUE 这两种现代化的类型安全的配置语言,来展示 Pod 资源的描述,在后续的文章中,我们将以 KCL , CUE 的工具来介绍Sidecar这种模式的实际应用。

1. Pod 的 OpenAPI 定义

先回到最开始最简单的 Nginx 例子,其 YAML 文件几乎是相同的模式:

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

这里的 Pod 数据满足 Kubernetes 规范 中“io.k8s.api.core.v1.Pod” 模型的定义。完整的OpenAPI定义请参考:https://github.com/kubernetes/kubernetes/tree/master/api/openapi-spec。仔细分析可以发现,apiVersion 和 kind 信息都是比较常见的默认配置,我们需要更现代的配置语言来简化。

2. KCL 定义 Pod 资源

KCL(Kusion Configuration Language) 是 Kusion 内置的面相云原生领域配置语言。语言官网:https://kcl-lang.io

基本的 KCL 配置程序和 YAML 比较相似。比如,我们可以用下面的 KCL 代码来重写 Nginx 容器的配置:

import k8s.api.core.v1 as k8core

k8core.Pod {
    metadata.name = "web-app"
    spec.containers = [{
        name = "main-container"
        image = "nginx"
        ports = [{containerPort: 80}]
    }]
}

其中 import 导入了 k8s 包中的 k8s/api/core/v1 包(路径和CUE一样),其中的 Pod 结构定义对应 Pod 模型,其中已经包含了 apiVersionkind 的默认值,因此只需要添加 metadata.namespec.containers 属性(KCL 也针对一些多级嵌套的属性提供了的语法糖)。

我们可以通过 kpm,创建一个 KCL 程序来定义一个Pod 资源。并执行这个程序来得到对应的yaml。

# 1. 初始化一个 kcl 程序包 hello.
kpm init hello

# 2. 编辑 hello 包内的 main.k 文件,
# 将前文中提到的 KCL 配置代码添加到 hello/main.k 中

# 3. 进入到 hello 包内,添加 k8s 依赖,并且运行 hello 包。
cd hello && kpm add k8s && kpm run

通过命令 kpm init hello可以初始化一个空的 kcl 程序包 hello,其中,然后在包中 hello/main.k 添加以上的 KCL 配置代码。

3. CUE 定义 Pod 资源

和 KCL 语言类似,CUE 是 Configure Unify Execute 单词的缩写,是面向配置的统一执行语言。CUE 的 官网 https://cuelang.org/。

下面是和 KCL 等价的 Pod 配置的写法:

package hello

import (
    k8core "k8s.io/api/core/v1"
)

k8core.#Pod & {
    apiVersion: "v1"
    kind:       "Pod"
  metadata: name: "web-app"
    spec: containers: [{
        name: "main-container"
        image: "nginx"
        ports: [{containerPort: 80}]
    }]
}

其中 package 和 import 语义和 Go 语言类似,就是引用 k8s.io/api/core/v1 包中的 Pod 结构定义。然后通过 k8core.#Pod 结合 & 运算符给后面的 {} 赋予类型约束。针对一些多级嵌套的属性,CUE 提供了 spec: containers: 等语法糖。

要执行该配置程序,除了安装CUE命令之外,还需要安装Go语言。然后建立一个 hello 空目录,再目录中新建 main.cue 文件,内容如上。然后在目录对应的命令行中,分别执行以下命令:

# 1. 初始化 CUE 模块
cue mod init

#
 2. 初始化 Go 模块
go mod init hello

#
 3. 获取 Go 包, 其中有 Pod 结构定义
go get k8s.io/api/core/v1

#
 4. 从已经下载到本地的包中的 Go 结构体, 生成对应的 CUE 结构
cue get go k8s.io/api/core/v1

#
 5. 执行 main.cue
cue export main.cue

CUE 借助了 Go 语言的包管理能力,整体执行流程和 KCL 类似。

4. 总结

这一篇文章我们简要介绍了如何通过 KCL、CUE 等不同的方式构建出Pod配置来获得更灵活、更健壮的配置。后续文章中我们将通过 KCL 和 CUE 来提炼和抽象最佳的 SideCar 模式实践



欢迎来玩 KusionStack & KCL ~ 欢迎 star ⭐️

https://github.com/KusionStack/kusion
https://github.com/KusionStack/kcl

https://kusionstack.io

https://kcl-lang.io




继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存