- 云原生
- 微服务
- 运维
- DevOps
【免费下载链接】meshery
Meshery, the cloud native manager
本篇技术指南以 Meshery 设计目录(Design Catalog)中的 HorizontalPodAutoscaler 扩缩容设计为核心,讲解 HPA 在 Kubernetes 工作负载自动弹性伸缩中的工作原理、该设计的组件与关系构成,以及如何通过mesheryctl design import将设计导入 Meshery 并部署到集群。读完本文,你将掌握 HPA 水平扩缩容的核心机制、Meshery 设计文件的 YAML 结构,以及一套可复制的实操导入流程。
设计概览:Catalog 中的 HPA 扩缩容模式
Meshery 的设计目录(Design Catalog)按使用场景划分为 deployment、observability、resiliency、scaling、security、traffic-management、troubleshooting、workloads 等多个类别。本文关注的 HorizontalPodAutoscaler 设计位于 scaling 类别,对应的目录页为 1fa80124-d38d-41d1-a768-0fcb7cdae31e.md,其配套的可部署设计文件为 design.yml,元数据包描述位于 artifacthub-pkg.yml。
该设计的关键元信息如下:
| 字段 | 值 |
|---|---|
| 设计名称(name) | HorizontalPodAutoscaler |
| 目录类型(type) | scaling(扩缩容) |
| 兼容性(compatibility) | kubernetes |
| 发布版本(publishedVersion) | 0.0.1 |
| 设计 ID(patternId) | 1fa80124-d38d-41d1-a768-0fcb7cdae31e |
| 创建时间 | 2024-03-12T13:09:43Z |
HPA 核心机制:什么是水平扩缩容
设计文档的 patternInfo 给出了对 HorizontalPodAutoscaler(简称 HPA)的权威定义:HPA 会自动更新工作负载资源(如 Deployment 或 StatefulSet),目标是根据需求自动伸缩工作负载的规模。
理解 HPA 的关键在于区分两种扩缩容方式:
- 水平扩缩容(Horizontal scaling):对负载增加做出的响应是部署更多 Pod。即通过增加副本数来分摊流量压力,这是 HPA 采用的模式。
- 垂直扩缩容(Vertical scaling):对 Kubernetes 而言,意味着给工作负载中已经运行的 Pod 分配更多资源(例如内存或 CPU)。它不增加副本数,而是提升单个 Pod 的资源配额。
HPA 的完整工作循环包含三个步骤:
- 扩容:当负载上升、当前副本数不足以满足需求时,HPA 计算所需副本数并更新工作负载资源。
- 维持:在负载波动但仍在目标区间内时,HPA 保持副本数稳定。
- 缩容:当负载下降,且当前 Pod 数量高于配置的最小值(minReplicas)时,HPA 指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减副本,将 Pod 数量回落到合理水平。
从仓库中的 Kubernetes 模型定义看,HorizontalPodAutoscaler属于 Kubernetes 模型(kubernetes model)下的标准组件,与autoscalingAPI 组对应,设计兼容性声明为kubernetes即指该模式适用于标准 Kubernetes 集群,无需额外安装服务网格或专用扩展组件。
设计文件结构解析:design.yml 的组件与关系
实际的 design.yml 是一份符合designs.meshery.io/v1beta1schema 的 Meshery 设计文件。它由两部分组成:components(组件列表)与relationships(组件间关系),并记录了设计 ID、名称与版本(该文件内标注的版本为0.0.129,与目录页的发布版本0.0.1分别对应内部迭代与目录发布口径)。
组件构成
设计中共包含三个组件:
Namespace(名为
nginxscale):来自kubernetes模型(model 版本v1.32.0-alpha.3,kind 为Namespace),命名空间被设置为nginxscale,是 HPA 及目标工作负载的部署空间。该组件的source_uri指向git://github.com/kubernetes/kubernetes/master/api/openapi-spec/v3,说明其定义由 Kubernetes 官方 OpenAPI 规范生成,isNamespaced: true表明这是一个命名空间级资源。Generic Node(注释节点):来自
meshery-core模型,kind 为GenericNode,isAnnotation: true,属于设计画布中的通用节点,用于承载说明文本或分组语义。Node Group Inventory Wallet(注释节点):同样来自
meshery-core模型,kind 为NodeGroupInventoryWallet,其configuration.metadata.namespace被设置为nginxscale,genealogy: "parent"表明它充当父级分组节点。
关系定义
设计文件中声明了三类关系,schema 版本为relationships.meshery.io/v1alpha3:
- hierarchical / parent(inventory 子类型):建立从 Inventory Wallet 节点到 Namespace 的层级归属关系,父节点的命名空间配置会通过
patch策略(patchStrategy: replace)应用到子组件上——即所有被纳入该分组的组件都会被自动注入nginxscale命名空间。 - hierarchical / sibling(matchlabels 子类型):基于
configuration.metadata.labels的匹配关系,声明 Generic Node 与 Inventory Wallet 之间的同级关联,标签匹配一致时二者互为兄弟节点。
这些关系体现了 Meshery 设计模型中"组件 + 关系"的声明式组织方式:关系由引擎在部署时求值,将nginxscale命名空间与标签语义自动补全到相关组件上,从而让设计画布上的元素与实际 Kubernetes 资源一一对应。
实操:通过 mesheryctl 导入并应用设计
目录页与 artifacthub-pkg.yml 中都明确给出了安装方式:mesheryctl design import -f。这一命令由 mesheryctl 的 design 子命令组提供,其实现位于 mesheryctl/internal/cli/root/design/import.go。
命令语法与示例
根据 import 命令的Use、Long与Example定义,其完整用法为:
mesheryctl design import -f [file/URL] -s [source-type] -n [name]常见示例:
mesheryctl design import -f design.tar mesheryctl design import -f design.yml -n design-name mesheryctl design import -f design.yml -s "Kubernetes Manifest" -n design-name参数说明:
-f, --file:必填。本地文件路径或远程 URL。YAML 与 TGZ(仅 Helm)格式被接受;若导入的是 Meshery Design OCI 文件,OCI 格式同样受支持。若提供远程 URL,必须是可直接下载的直链(例如指向仓库 raw 文件的链接)。-s, --source-type:可选。声明源类型(如Kubernetes Manifest),由服务端校验合法取值。-n, --name:可选。为导入的设计指定名称。
导入后的设计文件即成为可复用、可共享的 Meshery 设计(Design),可在 Meshery UI 的画布中继续编辑,并与集群进行部署、验证与生命周期管理。
底层调用链
从源码可见,importCmd在参数校验阶段强制要求-f参数非空(否则返回ErrDesignFileNotProvided)。实际导入流程为:
- 读取 mesheryctl 配置文件(
config.GetMesheryCtl(viper.GetViper())),获得 Meshery 服务地址; - 构造服务端导入接口地址
GET /api/pattern/import(mctlCfg.GetBaseMesheryURL() + "/api/pattern/import"); - 将本地文件或远程 URL 内容提交到该接口,由服务端完成解析、模型映射与设计入库。
这意味着design import本质上是把"本地或远程的设计文件"安全地托管到 Meshery 实例,再由 Meshery 引擎负责后续的部署与扩缩容管理。
使用注意事项与最佳实践
目录页的 patternCaveats 明确给出了一条关键提示:按需修改 deployments 与 names。
在导入并应用此设计前,建议检查以下事项:
- 命名空间调整:设计中的命名空间被固定为
nginxscale。若你的目标工作负载位于其他命名空间,需要在导入后修改 Namespace 组件的configuration.metadata.namespace,并确保相关 Pod 的metadata.labels与设计中的 matchlabels 关系匹配,否则 HPA 可能无法正确匹配到目标工作负载。 - 目标工作负载对齐:该设计聚焦于 HPA 的扩缩容语义(自动更新 Deployment/StatefulSet 等工作负载资源的副本数)。实际使用时需将 HPA 绑定到具体工作负载,并配置
minReplicas(最小副本数)、maxReplicas(最大副本数)以及触发扩缩容的指标(如 CPU/内存利用率或自定义指标)。 - 结合资源请求(Resource Requests)使用:HPA 的经典实践是结合 Pod 资源请求(resource requests)一起配置。仓库 scaling 类别下的 Pod Resource Request 设计 专门讲解为 Pod 指定最小 CPU 与内存需求,为 HPA 提供稳定的指标基线;二者配合可同时保障"资源分配合理"与"按需自动伸缩"。
- 缩容下限保护:根据 HPA 的语义,负载下降时只有在当前 Pod 数高于配置的最小副本数时才会缩容,因此务必为关键业务设置合理的
minReplicas,避免流量低谷期副本被过度回收。
小结
HorizontalPodAutoscaler 是 Kubernetes 弹性伸缩的基础能力:水平扩缩容通过增减 Pod 副本应对负载变化,垂直扩缩容则调整既有 Pod 的资源配额。Meshery 将其封装为 scaling 目录下的标准化设计,通过 design.yml 以组件 + 关系的形式描述部署拓扑(nginxscale命名空间及其关联组件),并提供mesheryctl design import -f一条命令即可导入 Meshery 使用。结合命名空间、标签与资源请求的按需调整,这套模式可以直接复用于生产环境的自动扩缩容场景。
如需进一步探索,可查看同目录下的其他扩缩容设计,例如 Redis_using_configmap(基于 ConfigMap 动态管理配置)与 Pod Resource Request(资源请求调优),以及 mesheryctl design import 的完整实现。
- 云原生
- 微服务
- 运维
- DevOps
【免费下载链接】meshery
Meshery, the cloud native manager
相关推荐
Kubernetes HorizontalPodAutoscaler 实战演练:自动扩缩应用实例
Kubernetes HorizontalPodAutoscaler 实战演练:自动扩缩应用实例 引言:为什么需要自动扩缩? 在现代云原生应用中,流量波动是常态
文档教程云原生Feast Operator 实战:在 Kubernetes 上为 Feature Server 配置高可用与水平自动扩缩容
Feast Operator 实战:在 Kubernetes 上为 Feature Server 配置高可用与水平自动扩缩容 作为 AI/ML 特征平台走向生产
MLOps后端数据工程Fission水平Pod自动扩缩器:Kubernetes HPA配置实战
Fission水平Pod自动扩缩器:Kubernetes HPA配置实战 你还在手动调整函数Pod数量应对流量波动吗?当业务高峰期来临时,函数实例不足导致响应延
云原生后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考