聊聊 K8S 中的 SideCar 设计模式·第 2 篇
在前一篇文章聊聊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 模型,其中已经包含了 apiVersion
和 kind
的默认值,因此只需要添加 metadata.name
和 spec.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