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

聊聊 K8s 中的 Sidecar 设计模式 · 第 2 篇

  •  
  •   peefy · 2023-06-30 10:29:09 +08:00 · 1027 次点击
    这是一个创建于 544 天前的主题,其中的信息可能已经有所发展或是发生改变。

    介绍

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

    designpattern.png

    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 定义请 参考。仔细分析可以发现,apiVersion 和 kind 信息都是比较常见的默认配置,我们需要更现代的配置语言来简化。

    2. 使用 KCL 定义 Pod 资源

    KCL 是一门面向云原生领域配置策略语言,详细资料可参考语言官网

    基本的 KCL 配置程序仍然遵循 K=V 的形式,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 包,其中的 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 中
    cat <<EOF > hello/main.k
    import k8s.api.core.v1 as k8core
    
    k8core.Pod {
        metadata.name = "web-app"
        spec.containers = [{
            name = "main-container"
            image = "nginx"
            ports = [{containerPort: 80}]
        }]
    }
    EOF
    
    # 3. 进入到 hello 包内,添加 k8s 依赖,并且运行 hello 包。
    cd hello && kpm add k8s && kpm run
    

    可以得到如下 YAML 输出:

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

    3. 小结

    这一篇文章我们简要介绍了如何通过 KCL 构建出 Pod 配置来获得更灵活、更健壮的配置。后续文章中我们将通过 KCL 来提炼和抽象最佳的 Sidecar 模式实践,包括使用 KCL 对 Sidecar 模型进行抽象以及使用 KCL 对已存在的上游 YAML 配置进行 Sidecar 注入。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4355 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:33 · PVG 13:33 · LAX 21:33 · JFK 00:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.