使用 Meshery 在 Kubernetes 上部署 WordPress 与 MySQL:MeshMap 设计模式实战解析
【免费下载链接】mesheryMeshery, the cloud native manager项目地址: https://gitcode.com/GitHub_Trending/me/meshery
本篇技术指南基于 Meshery 开源仓库中的 Catalog 设计模式文档 WordPress and MySQL on Kubernetes 及其配套的 design.yml 模式定义,完整拆解该模式在 Kubernetes 集群上部署 WordPress 应用与 MySQL 数据库的组件构成、配置细节与导入部署流程。读完本文,你将掌握该 Catalog 模式的整体架构、每个 Kubernetes 资源对象的关键配置字段,以及如何通过mesheryctl design import一键将设计导入 Meshery 并交付到目标集群。
一、设计模式概览:这是什么
该 Catalog 条目是 Meshery 生态中的一个部署型(deployment)设计模式,模式 ID 为3546d0d4-ba6e-4c7e-9661-853ade11847f,当前发布版本为0.0.1。其官方描述(patternInfo)明确指出:
该 MeshMap 设计在 Kubernetes 集群上部署一套可扩展、健壮的 WordPress 应用,并以 MySQL 数据库作为后端支撑。设计充分利用 Kubernetes 资源来确保 WordPress 站点的高可用性、高效扩缩容与易管理性。
模式元数据中声明的兼容性组件包括kubernetes、mysql-operator与wordpress-operator,发布者为David Hunter(userId:6126611f-41d6-4206-8504-822a5262d110),创建时间为2024-01-29。文档 Front Matter 同时声明了模式的下载入口(downloadLink: 3546d0d4-ba6e-4c7e-9661-853ade11847f/design.yml),对应的完整设计文件即为 design.yml,而 artifacthub-pkg.yml 则以 ArtifactHub 包清单的形式补充了该模式的安装命令:mesheryctl design import -f。
二、组件清单:一张图看懂资源构成
从design.yml的components数组可以看出,该设计模式并非单一工作负载,而是一套完整的 WordPress + MySQL 拓扑。核心可部署资源(isAnnotation: false)包括:
| 资源类型 | displayName | 说明 |
|---|---|---|
Deployment (apps/v1) | deployment | WordPress 前端 Deployment |
Deployment (apps/v1) | wordpress-mysql | MySQL 后端 Deployment |
Service (v1) | wordpress | WordPress 前端服务(headless ClusterIP) |
Service (v1) | wordpress-mysql | MySQL 后端服务 |
Secret (v1) | mysql-pass | 数据库密码凭据 |
| PersistentVolumeClaim | mysql-pv-claim | MySQL 数据卷声明(20Gi) |
| PersistentVolumeClaim | wp-pv-claim | WordPress 数据卷声明(20Gi) |
PersistentVolume (v1) | wordpress-persistent-storage | WordPress 持久卷 |
PersistentVolume (v1) | mysql-persistent-storage | MySQL 持久卷 |
Namespace (v1) | default | 全部资源所在的命名空间 |
此外,设计中还包含若干meshery-core模型的AnchorNode、NodeGroupInventoryWallet、Container等注解类节点(isAnnotation: true),它们属于 MeshMap 画布用于可视化编组与容器拓扑表达的辅助节点,并非直接下发的 Kubernetes 资源,在阅读 design.yml 时应加以区分。
三、WordPress 前端 Deployment 详解
设计中的 WordPress 工作负载是名为deployment的 Deployment,命名空间为default,携带标签app: wordpress。其核心配置如下(节选自 design.yml 中 id 为6c0d3f0d-5c82-407a-8a03-30b518cccdb0的组件):
{ "component": { "kind": "Deployment", "version": "apps/v1" }, "configuration": { "metadata": { "labels": { "app": "wordpress" }, "namespace": "default" }, "spec": { "selector": { "matchLabels": { "app": "wordpress", "tier": "frontend" } }, "template": { "metadata": { "labels": { "app": "wordpress", "tier": "frontend" } }, "spec": { "containers": [ { "name": "wordpress", "image": "wordpress:6.2.1-apache", "ports": [{ "name": "wordpress", "containerPort": 80, "protocol": "TCP" }], "env": [ { "name": "WORDPRESS_DB_HOST", "value": "wordpress-mysql" }, { "name": "WORDPRESS_DB_USER", "value": "wordpress" }, { "name": "WORDPRESS_DB_PASSWORD", "valueFrom": { "secretKeyRef": { "name": "mysql-pass", "key": "password" } } } ], "volumeMounts": [ { "name": "wordpress-persistent-storage", "mountPath": "/var/www/html" } ] } ], "volumes": [ { "name": "wordpress-persistent-storage", "persistentVolumeClaim": { "claimName": "wp-pv-claim" } } ] } } } } }要点分析:
- 镜像固定为
wordpress:6.2.1-apache,以 Apache 运行并监听 80 端口,与官方 WordPress 容器的环境变量规范一致。 - 数据库连接通过环境变量注入:
WORDPRESS_DB_HOST指向wordpress-mysql(对应后文 MySQL Service 的名称,利用 Kubernetes 集群内 DNS 完成服务发现);WORDPRESS_DB_USER为wordpress;WORDPRESS_DB_PASSWORD不直接写在配置里,而是通过secretKeyRef从名为mysql-pass的 Secret 中读取password键的值,避免明文落盘。 - 站点数据持久化:容器将
/var/www/html(WordPress 的 Web 根目录与上传内容所在)挂载到名为wordpress-persistent-storage的卷,该卷绑定 PVCwp-pv-claim,保证容器重建或滚动更新时站点文件不丢失。
四、MySQL 后端 Deployment 详解
MySQL 工作负载是名为wordpress-mysql的 Deployment,selector 使用tier: mysql标签。其核心配置如下(对应 design.yml 中 id 为def3b3a8-59ea-49eb-96f7-4f3fd5cfc258的组件):
{ "component": { "kind": "Deployment", "version": "apps/v1" }, "configuration": { "metadata": { "labels": { "app": "wordpress" }, "namespace": "default" }, "spec": { "selector": { "matchLabels": { "app": "wordpress", "tier": "mysql" } }, "template": { "metadata": { "labels": { "app": "wordpress", "tier": "mysql" } }, "spec": { "containers": [ { "name": "mysql", "image": "mysql:8.0", "ports": [{ "name": "mysql", "containerPort": 3306, "protocol": "TCP" }], "env": [ { "name": "MYSQL_ROOT_PASSWORD", "valueFrom": { "secretKeyRef": { "name": "mysql-pass", "key": "password", "optional": true } } }, { "name": "MYSQL_DATABASE", "value": "wordpress" }, { "name": "MYSQL_USER", "value": "wordpress" }, { "name": "MYSQL_PASSWORD", "valueFrom": { "secretKeyRef": { "name": "mysql-pass", "key": "password" } } } ], "volumeMounts": [ { "name": "mysql-persistent-storage", "mountPath": "/var/lib/mysql" } ] } ], "volumes": [ { "name": "mysql-persistent-storage", "persistentVolumeClaim": { "claimName": "mysql-pv-claim" } } ] } } } } }要点分析:
- 镜像为
mysql:8.0,监听 3306 端口。首次启动时 MySQL 容器会根据MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD等环境变量自动初始化数据库wordpress与专用账号wordpress,与 WordPress 侧WORDPRESS_DB_USER/WORDPRESS_DB_PASSWORD形成闭环对应。 - root 密码同样取自
mysql-passSecret,且该引用标记为optional: true——这意味着即使 Secret 中缺少该键,容器也能启动,体现了设计上对初始化过程的一定容错。 - 数据卷挂载
/var/lib/mysql,对应 PVCmysql-pv-claim,保证数据库文件持久化,是"重启不丢数据"的关键。 - 从设计文件可见,部分 Pod 形态的组件(如 displayName 为
pod-ako、pod-mec的 Pod)保留了与 Deployment 一致的容器定义,从源码结构看,这些是 MeshMap 画布中 Pod 层级的可视化节点,最终以 Deployment 为实际下发单元。
五、服务发现与网络拓扑
模式通过两个 Service 完成集群内的服务发现与流量路由。
WordPress Service(id:a309c048-143c-470d-bc20-41d766b96ca3)
{ "component": { "kind": "Service", "version": "v1" }, "configuration": { "metadata": { "labels": { "app": "wordpress" }, "namespace": "default" }, "spec": { "clusterIP": "None", "type": "ClusterIP", "allocateLoadBalancerNodePorts": false, "ports": [ { "name": "wordpress", "port": 80, "protocol": "TCP" }, { "name": "wordpress-mysql", "port": 80, "protocol": "TCP" }, { "name": "deployment", "port": 80, "protocol": "TCP" }, { "name": "wordpress-mysql-deployment", "port": 3309, "protocol": "TCP" } ], "selector": { "app": "wordpress", "tier": "frontend" } } } }MySQL Service(id:224b606b-1a71-4f25-8374-093374785235)
{ "component": { "kind": "Service", "version": "v1" }, "configuration": { "metadata": { "labels": { "app": "wordpress" }, "namespace": "default" }, "spec": { "ports": [ { "name": "mysql", "port": 3308, "protocol": "TCP" }, { "name": "wordpress", "port": 3306, "protocol": "TCP" }, { "name": "wordpress-mysql", "port": 3309, "protocol": "TCP" } ], "selector": { "app": "wordpress", "tier": "mysql" } } } }几个值得注意的设计细节:
- 前端 Service 将
clusterIP显式设置为None,即 headless Service,适合有状态服务的稳定端点发现;其 selector 精确匹配tier: frontend的 WordPress Pod。 - 后端 Service 以
tier: mysql为 selector,WordPress 容器通过 DNS 名称wordpress-mysql即可解析到 MySQL Pod——这正是第三节中WORDPRESS_DB_HOST=wordpress-mysql能够工作的网络基础。 - 两个 Service 的 ports 定义中存在多个同名/异名端口条目(如 3306、3308、3309),从配置结构看,这些端口条目更偏向 MeshMap 画布中服务连接的示意性声明,实际生效路由以 selector 与 DNS 解析为准;在生产环境中建议按需精简为单一明确的端口映射。
六、凭据管理:Secret mysql-pass
数据库密码不硬编码在 Deployment 中,而是集中存放在名为mysql-pass的 Secret(id:1521fbc8-cc57-4f6b-8e78-ea1e749a463d)里:
{ "component": { "kind": "Secret", "version": "v1" }, "configuration": { "metadata": { "namespace": "default" }, "data": { "password": "" }, "stringData": { "password": "secretpassword" } } }- 通过
stringData.password声明的明文secretpassword仅存在于设计文件层面,应用时由 Kubernetes 自动以 base64 编码写入data字段。 - WordPress 与 MySQL 两个 Deployment 均通过
secretKeyRef: { name: "mysql-pass", key: "password" }引用同一凭据,实现单一数据源(single source of truth),修改密码只需更新 Secret 一处。 - 需要注意:
secretpassword是设计文档中的演示值,实际使用时应改为强密码,避免直接沿用样例。
七、持久化存储:PV 与 PVC
MySQL 与 WordPress 各自配有一组 20Gi 的持久化存储:
mysql-pv-claim(id:feba8e8e-e245-4274-94db-66bc740a0634):accessModes: [ReadWriteOnce],resources.requests.storage: 20Gi,volumeName: persistent-volume-storage。wp-pv-claim(id:f8ac953d-4fbd-4fd3-8a5a-e971dae66dbe):同样为ReadWriteOnce、20Gi,volumeName: wordpress-persistent-storage。- 配套的 PersistentVolume
wordpress-persistent-storage(ReadWriteOnce)与mysql-persistent-storage(通过claimRef: { name: "mysql-pv-claim" }显式绑定到 MySQL 的 PVC)。
从存储配置可见,该设计假定集群中存在可满足ReadWriteOnce+ 20Gi 需求的存储类或静态 PV;在 kind、minikube 等本地集群中部署时,需要预先提供对应的动态供应能力,否则 PVC 会停留在Pending状态。
八、组件关系(Relationships)与画布语义
design.yml 后半部分的relationships数组记录了组件间的关联语义,用于驱动 MeshMap 画布的连线、依赖与校验。其中主要包含两类:
- hierarchical / parent(层级父子关系):描述"父组件配置被子组件配置补丁覆盖"的语义。例如 Namespace 与各 Pod/Deployment 之间、Pod 与 Deployment 之间(
mutatedRef: [["configuration","spec","template","spec"]]),表明画布上的 Pod 节点配置会并入其父级 Deployment。 - hierarchical / sibling(同层兄弟关系):以
matchlabels为子类型,通过configuration.metadata.labels匹配建立 Service 与 Deployment、PVC 与 PV 之间的对应关系。
这些关系记录(relationships.meshery.io/v1alpha3)的价值在于:当你在 MeshMap 中拖拽、连线或批量修改组件时,平台可依据这些规则自动维护拓扑一致性,这也是该设计模式"可视化可编排"特性的底层支撑。
九、导入与部署:mesheryctl design import
该模式的官方安装方式在 artifacthub-pkg.yml 中声明为:
mesheryctl design import -f-f参数后应跟上设计文件的路径。导入设计文件后,即可在 Meshery 的 Catalog 与设计中心中查看该拓扑,选择已接入的 Kubernetes 集群执行部署。design.yml 的schemaVersion为designs.meshery.io/v1beta1,其中嵌入的 Kubernetes 模型版本为v1.32.0-alpha.3(来源git://github.com/kubernetes/kubernetes/master/api/openapi-spec/v3),模式版本号为0.0.106——这些字段共同定义了设计文件的解析规范与所依赖的组件模型版本。
十、注意事项与最佳实践
文档 Front Matter 中的patternCaveats(注意事项)原样提出了两条部署前提,这也是本模式落地时最容易被忽略的点:
- 确保 Kubernetes 集群拥有足够的资源(CPU、内存与存储)来同时承载 WordPress 与 MySQL 两个 Pod 及其持久卷。MySQL 8.0 与 Apache 版 WordPress 均有最低资源消耗,建议集群至少提供数 GB 内存与足够的磁盘 IO。
- 正确设置资源请求与限制(resource requests/limits),避免因资源竞争导致性能抖动。原始设计文件中未显式声明 requests/limits,因此在使用前建议在 Deployment 的容器配置中补充,例如为 MySQL 设置
requests.memory: 512Mi、limits.memory: 1Gi之类的保守值。
十一、相关仓库资源
- 模式文档(本文主体):docs/catalog/deployment/3546d0d4-ba6e-4c7e-9661-853ade11847f.md
- 完整设计定义(组件与关系):docs/data/catalog/3546d0d4-ba6e-4c7e-9661-853ade11847f/0.0.1/design.yml
- 包清单(安装命令与元数据):docs/data/catalog/3546d0d4-ba6e-4c7e-9661-853ade11847f/0.0.1/artifacthub-pkg.yml
- Catalog 目录默认模板:docs/catalog/_defaults.md
通过本模式,你可以快速获得一套"WordPress 前端 + MySQL 后端 + 双向持久化 + Secret 凭据管理"的标准参考架构,并以此为基础,根据自身集群的存储与算力条件调整资源声明后,再借助 Meshery 的可视化设计能力完成定制与交付。
【免费下载链接】mesheryMeshery, the cloud native manager项目地址: https://gitcode.com/GitHub_Trending/me/meshery
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考