- 云原生
- 微服务
- 运维
- DevOps
【免费下载链接】meshery
Meshery, the cloud native manager
本文基于 Meshery 仓库中的 Catalog 设计条目Pod Multi Containers(docs/catalog/resiliency/17c46515-50ef-436c-9383-451e13348ddd.md)及其配套的 design.yml 展开,讲解该设计在 Kubernetes 集群中的组件构成、配置语义与部署方式。读完本文,你将掌握:如何读懂一个 Meshery Catalog 设计文件(Design File)的组件与关系结构,以及如何用
mesheryctl design命令将多容器 Pod 设计导入并部署到真实集群。
一、设计文件:Meshery 中"可复用的部署单元"
在 Meshery 中,"设计"(Design)是一个声明式的可视化与部署单元,它描述了一组 Kubernetes 组件的期望状态以及组件之间的关系(Relationship)。Catalog(目录)是 Meshery 社区共享设计的集合,每个目录条目都通过 frontmatter 元数据描述其名称、类型、兼容性、作者与下载入口。
以本文的主角为例,其 catalog 条目的 frontmatter(见 docs/catalog/resiliency/17c46515-50ef-436c-9383-451e13348ddd.md)包含了以下关键字段:
| 字段 | 值 | 含义 |
|---|---|---|
name | Pod Multi Containers | 设计名称 |
type | resiliency | 目录分类,归属于"弹性/韧性"类目 |
compatibility | kubernetes | 兼容的平台/运行时 |
patternId | 17c46515-50ef-436c-9383-451e13348ddd | 全局唯一标识符 |
patternInfo | 见下文 | 设计用途说明 |
patternCaveats | No caveats | 使用注意事项(本文档声明为无) |
downloadLink | 17c46515-…/design.yml | 设计文件的下载路径 |
其中patternInfo对设计用途的原始描述为:
"Pod Multi Containers" design facilitates the deployment of Kubernetes Pods that consist of multiple containers, each serving a distinct role within a single cohesive unit.
即:该设计用于部署由多个容器组成的 Kubernetes Pod,每个容器在同一个整体单元(Pod)内承担不同的职责。这正是 Kubernetes 多容器 Pod(如 Sidecar、Adapter、Ambassador 等模式)的常见落地形态。catalog 条目的元数据还配套在 docs/data/catalog/17c46515-50ef-436c-9383-451e13348ddd/0.0.1/artifacthub-pkg.yml 中,其中明确给出了安装方式提示mesheryctl design import -f,并注明许可证为 Apache-2.0。
说明:Catalog 条目的 frontmatter 结构遵循 docs/catalog/_defaults.md 定义的模板约定(
layout: item、patternId、patternInfo、downloadLink等字段),这为所有 Catalog 条目提供了统一的元数据规范。
二、design.yml 整体解剖:组件、配置与关系
该设计的实际内容全部承载在 docs/data/catalog/17c46515-50ef-436c-9383-451e13348ddd/0.0.1/design.yml 中,其 schema 版本为designs.meshery.io/v1beta1,设计版本号为0.0.135。文件主要包含两大块:
- components(组件):组成设计的所有资源,每个组件都携带
component(类型声明)、configuration(实际配置)、model(来源模型)、styles(可视化样式)等元数据; - relationships(关系):组件之间的拓扑与配置继承关系,schema 版本为
relationships.meshery.io/v1alpha3。
2.1 组件拓扑一览
该设计共声明了 4 个组件,构成如下的嵌套结构:
Namespace "default"(父级,inventory 关系) └── Pod "pods-multi-container-pod"(父级,alias 关系) ├── Container "container-chm"(annotations 组件,注入 spec.containers[1]) └── Container "container-edt"(annotations 组件,注入 spec.containers[0])其中 Namespace 与 Pod 来自Kubernetes模型(models.meshery.io/v1beta1,版本基于 kubernetes v1.32.0-alpha.3 的 OpenAPI 定义),而两个 Container 组件来自Meshery Core模型(category 为 "Orchestration & Management"),它们被标记为isAnnotation: true,在图形化编辑器中表现为可拖放到 Pod 内的"注释/子组件"。
2.2 Pod 的核心配置:两个各司其职的容器
Pod 组件的configuration是该设计最关键的部分,它直接对应一个标准的 Kubernetes Pod 清单:
{ "metadata": { "annotations": {}, "labels": {}, "namespace": "default" }, "spec": { "containers": [ { "command": ["sleep", "3600"], "image": "busybox", "name": "pods-multi-container-container-1" }, { "command": ["sleep", "3601"], "image": "busybox", "name": "pods-multi-container-container-2" } ] } }要点解读:
- 两个容器共享同一个 Pod 生命周期:它们属于
default命名空间,共用一个网络命名空间、同一个 IP 与存储卷,这正是"单一凝聚单元(single cohesive unit)"的技术本质; - 镜像与命令:示例采用
busybox镜像,分别以sleep 3600和sleep 3601作为启动命令保持容器存活,便于后续验证多容器共存与日志观察。实际生产使用时,只需在 Meshery 的可视化设计器中把镜像、命令替换为真实业务镜像即可; namespace通过关系自动继承:Pod 配置中metadata.namespace的取值来自 Namespace 组件的注入(详见下文关系分析),无需手工重复编写。
三、Relationships:设计如何实现配置自动注入
design.yml 中的 3 条 relationship 揭示了 Meshery 设计系统"配置自动补全"的底层机制——这与 Kubernetes 原生清单的编写方式截然不同,是理解该设计价值的关键。
3.1 Alias 关系:Container → Pod(两对)
两条kind: hierarchical、type: parent、subType: alias的关系,把 Container 子组件的配置"打补丁"到 Pod 的容器数组上:
| 关系 ID | 源(from) | 目标(to) | patch 策略 | mutatorRef |
|---|---|---|---|---|
| 29937222-… | Containercontainer-chm(id deb2ec96-…) | Podpods-multi-container-pod | replace | configuration.spec.containers[1] |
| cb1bdb6c-… | Containercontainer-edt(id 456edab8-…) | Podpods-multi-container-pod | replace | configuration.spec.containers[0] |
其元数据中的通用语义描述为:
A hierarchical inventory relationship in which the configuration of (parent) component is patched with the configuration of other (child) component.
也就是说:当你在可视化画布上把container-chm拖入 Pod 时,Meshery 会根据这条关系将子组件的配置以replace策略写入父组件 Pod 的spec.containers[1];container-edt则写入spec.containers[0]。两个容器由此获得确定的数组下标顺序,从而保证容器在 Pod 中的声明顺序稳定、可预测。
3.2 Inventory 关系:Pod → Namespace
第三条关系(id 649519d8-…)同样是 hierarchical/parent 类型,但subType: inventory,其作用是把 Pod 的metadata.namespace自动补全为 Namespace 组件的 displayName(即default)。这正是上一节 Pod 配置中"namespace": "default"的来源——从源码结构看,用户在画布上只需放置 Namespace 与 Pod,命名空间归属便会自动建立,无需手动填写。
这种"关系驱动配置"的机制,使得 Catalog 中的设计天然具备可移植性:组件配置与关系拓扑分离,导入到不同集群时,Meshery 会依据关系重新计算并生成最终的 Kubernetes 清单。
四、实操一:导入设计(mesheryctl design import)
Catalog 条目在 artifacthub-pkg.yml 中给出的安装方式即为mesheryctl design import -f。该命令的实现位于 mesheryctl/internal/cli/root/design/import.go,支持两种输入形态:
# 方式一:从本地文件导入(文件内容会被读取并上传) mesheryctl design import -f 17c46515-50ef-436c-9383-451e13348ddd/design.yml # 方式二:从远程 URL 导入 mesheryctl design import -f <https://.../design.yml> # 可选:指定源类型与设计名称 mesheryctl design import -f design.yml -s "Kubernetes Manifest" -n my-pod-design从 import.go 的实现可以确认以下行为:
-f是必填参数,未提供时命令直接报错(ErrDesignFileNotProvided);-s(源类型)可选,合法取值为Helm Chart、Kubernetes Manifest、Meshery Design、Docker Compose,未指定时由服务端自动识别;- 未通过
-n指定名称时,默认以文件名(path.Base(file))作为设计名; - 命令最终通过
POST /api/pattern/import接口把文件内容或 URL 交给 Meshery Server 解析入库(import.go),成功后返回设计 ID 与名称。
提示:本设计文件是标准的 Meshery Design(JSON)格式,导入时可显式声明
-s "Meshery Design"以跳过类型探测。
五、实操二:部署设计(mesheryctl design apply)
设计导入后即可部署到集群。mesheryctl design apply(实现见 mesheryctl/internal/cli/root/design/apply.go)支持两种调用方式:
# 方式一:直接 apply 一个设计文件 mesheryctl design apply -f 17c46515-50ef-436c-9383-451e13348ddd/design.yml # 方式二:按名称部署已保存的设计 mesheryctl design apply pod-multi-containers从 apply.go 的实现可以看到:
- 传入设计名时,命令会先调用
GET /api/pattern?populate=pattern_file&search=<名称>检索已保存的设计并取出pattern_file;若存在多个同名设计,会弹出交互式确认; - 传入文件时,若参数不是
https://github.com或https://raw.githubusercontent.com开头的 URL,则按本地文件读取内容; - 最终通过
POST /api/pattern/deploy触发真正的 Kubernetes 部署(apply.go),Meshery 会根据设计中的组件与关系生成最终资源清单下发到集群。
部署完成后,可以验证多容器 Pod 是否就绪:
kubectl get pods -n default kubectl logs -n default pods-multi-container-pod -c pods-multi-container-container-1 kubectl logs -n default pods-multi-container-pod -c pods-multi-container-container-2六、适用场景与注意事项
该 Catalog 条目的patternCaveats声明为"No caveats"(无使用注意项),说明它作为入门级的多容器 Pod 模板可直接使用。结合 Kubernetes 多容器 Pod 的通用实践,它适合作为以下场景的起点:
- Sidecar 模式:一个容器承载主业务,另一个容器承载日志采集、网络代理等辅助职责;
- Adapter / Ambassador 模式:为业务容器附加协议转换或流量代理容器;
- 共享网络与存储的多进程协作:多个容器通过 localhost 通信、共享 EmptyDir 卷。
需要留意的是:示例中的容器仅以busybox+sleep保持存活,并未定义ports、volumeMounts、resources等字段;生产使用时应基于该骨架在 Meshery 可视化编辑器中补充这些配置,并遵循 Kubernetes 官方建议(如多容器场景下合理设置resources与就绪探针)。同时,Catalog 中与本条目同属 resiliency 分类的其余条目(见 docs/catalog/resiliency 目录)也提供了更多可参考的弹性设计模板。
七、参考文件速览
- Catalog 条目元数据:docs/catalog/resiliency/17c46515-50ef-436c-9383-451e13348ddd.md
- 设计文件(组件 + 关系完整定义):docs/data/catalog/17c46515-50ef-436c-9383-451e13348ddd/0.0.1/design.yml
- Catalog 安装元数据:docs/data/catalog/17c46515-50ef-436c-9383-451e13348ddd/0.0.1/artifacthub-pkg.yml
- Catalog 条目模板约定:docs/catalog/_defaults.md
mesheryctl design import实现:mesheryctl/internal/cli/root/design/import.gomesheryctl design apply实现:mesheryctl/internal/cli/root/design/apply.go- 同类 resiliency 设计条目:docs/catalog/resiliency
- 云原生
- 微服务
- 运维
- DevOps
【免费下载链接】meshery
Meshery, the cloud native manager
相关推荐
Meshery Catalog 实战:使用 "Pod Privileged Simple" 设计模式在 Kubernetes 中部署特权容器
Meshery Catalog 实战:使用 "Pod Privileged Simple" 设计模式在 Kubernetes 中部署特权容器 导读 :本文以 M
云原生微服务运维DevOps使用 Meshery 在 Kubernetes 上部署 WordPress 与 MySQL:MeshMap 设计模式实战解析
使用 Meshery 在 Kubernetes 上部署 WordPress 与 MySQL:MeshMap 设计模式实战解析 本篇技术指南基于 Meshery
云原生微服务运维DevOps使用 Meshery 设计模式部署 Nginx Controller:Catalog 条目解析与实战指南
使用 Meshery 设计模式部署 Nginx Controller:Catalog 条目解析与实战指南 Meshery Catalog 中的每个部署类设计(d
云原生微服务运维DevOps
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考