ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Argo CD UI 资源缩放(Scale Resources)功能详解:在界面中直接调整 Deployment 与 StatefulSet 副本数

Argo CD UI 资源缩放(Scale Resources)功能详解:在界面中直接调整 Deployment 与 StatefulSet 副本数 Argo CD UI 资源缩放Scale Resources功能详解在界面中直接调整 Deployment 与 StatefulSet 副本数【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cdArgo CD 的 Scale Resources 功能允许用户直接在 Web UI 中通过输入框调整 Deployment 和 StatefulSet 的副本Replica数量无需修改 Git 配置或执行 kubectl 命令。本文基于仓库中的官方文档 docs/user-guide/scale_application_resources.md并结合资源自定义脚本Lua actions、服务端 gRPC 接口与前端组件源码完整讲解该功能的操作步骤、适用范围、底层实现与使用限制。功能概述在默认的 GitOps 工作流中应用的实际状态与 Git 中声明的期望状态保持一致副本数的变更通常需要修改清单文件并触发同步。Scale Resources 功能则提供了一条轻量级的调整路径用户可以直接在 Argo CD UI 中打开某个 Deployment 或 StatefulSet 资源通过 Actions 下拉菜单中的 Scale 操作输入目标副本数并确认即可立即对集群中的实时资源执行伸缩。该功能的核心设计目标是增强用户体验尤其对非技术用户友好——他们无需理解配置文件的语法也不需要掌握 kubectl只需要在界面中填写一个数字即可完成扩缩容。在 UI 中执行缩放分步操作指南根据官方文档完整的操作流程如下定位资源在任意 Argo CD 应用的应用详情视图中导航到目标 Deployment 或 StatefulSet 节点。打开操作菜单点击该资源的Actions下拉菜单选择Scale选项。输入副本数此时会弹出一个模态框标题为Enter input parameters for action: scale其中包含一个输入框默认展示当前副本数用户在此修改目标副本数量。确认执行点击OK按钮资源即按输入的值完成缩放。整个交互中模态框的标题与表单字段并非硬编码而是由资源自定义配置Resource Customizations中的动作参数动态驱动这一点将在下文的实现原理部分详细展开。适用范围与重要限制官方文档给出了两条必须遵守的限制说明仅适用于Deployments和StatefulSets。如果使用了 HPAHorizontal Pod Autoscaling水平 Pod 自动伸缩或开启了 Argo CD 自动同步auto-sync通过 Scale 操作修改的副本数会被覆盖。同时必须确保输入值合法非法值例如non-numeric字符、negative负数或超过max integer limit的数值无法被提交。第一条限制在仓库源码中可以得到印证Argo CD 的内置缩放动作分别定义在 resource_customizations/apps/Deployment/actions/ 与 resource_customizations/apps/StatefulSet/actions/ 两个目录下而其他资源类型并未内置 scale 动作。第二条限制则需要结合 GitOps 工作流理解HPA 场景HPA 控制器会周期性根据指标调整副本数人工缩放结果会被 HPA 的下一次调节覆盖自动同步auto-sync场景Argo CD 会在检测到 Git 中的期望状态与实际状态不一致时自动执行同步将副本数回滚到 Git 中声明的值因为 Git 仍然是唯一事实来源source of truth。因此Scale 功能最适合用于不依赖 HPA、且关闭自动同步或已启用自我修复self-heal约束的应用适合临时扩容、压测演练、手工缩容等场景。底层实现原理Lua 资源动作Resource Actions机制UI 上的 Scale 操作并非 Argo CD 服务端写死的逻辑而是建立在通用的Resource Actions资源动作框架之上由 Lua 脚本驱动。整个过程分为动作发现与动作执行两个阶段对应的服务端实现位于 server/application/application.go。动作发现Discovery由 Lua 脚本动态生成可执行动作服务端通过getAvailableActions方法server/application/application.go#L2641获取某个资源可用的动作列表先读取资源的discovery.lua脚本再在 Lua VM 中执行该脚本返回一组动作定义。以 Deployment 为例其发现脚本 resource_customizations/apps/Deployment/actions/discovery.lua 完整定义了一个 Deployment 可用动作local actions {} actions[restart] { [iconClass] fa fa-fw fa-redo } local paused false if obj.spec.paused ~ nil then paused obj.spec.paused end actions[pause] { [disabled] paused, [iconClass] fa fa-fw fa-pause-circle } actions[resume] { [disabled] not(paused), [iconClass] fa fa-fw fa-play-circle } actions[scale] { [iconClass] fa fa-fw fa-plus-circle, [params] { { [name] replicas } }, } return actions其中scale动作声明了图标类fa fa-fw fa-plus-circle并声明了一个名为replicas的输入参数——这正是 UI 模态框里那个输入字段的来源。StatefulSet 的发现脚本 resource_customizations/apps/StatefulSet/actions/discovery.lua 则更简洁只提供restart与scale两个动作StatefulSet 没有paused字段因此不提供 pause/resumelocal actions {} actions[restart] { [iconClass] fa fa-fw fa-redo } actions[scale] { [iconClass] fa fa-fw fa-plus-circle, [params] { { [name] replicas } }, } return actions动作执行ExecutionLua 脚本修改资源对象用户提交副本数后服务端RunResourceActionV2方法server/application/application.go#L2686会根据请求中的应用名、命名空间、资源组/版本/种类、资源名定位实时资源live object从settingsMgr.GetResourceOverrides()获取资源覆盖配置构造 Lua VM通过luaVM.GetResourceAction(liveObj, q.GetAction())读取对应的action.lua脚本通过luaVM.ExecuteResourceAction(liveObj, action.ActionLua, q.GetResourceActionParameters())执行脚本传入用户填写的参数对脚本返回的新对象执行patchResourcePatch 操作将变更应用到集群server/application/application.go#L2771-L2791。以 Deployment 的缩放脚本 resource_customizations/apps/Deployment/actions/scale/action.lua 为例其核心逻辑仅数行local os require(os) local replicas tonumber(actionParams[replicas]) if not replicas then error(invalid number: .. actionParams[replicas], 0) end obj.spec.replicas replicas return objStatefulSet 的缩放脚本 resource_customizations/apps/StatefulSet/actions/scale/action.lua 与上述实现完全一致都是将参数转换为数字后写入obj.spec.replicas并返回修改后的对象。参数校验的两道防线针对官方文档强调的非法值不可提交仓库实现了两层校验前端表单校验前端组件 ui/src/app/applications/components/utils.tsx 中的getResourceActionsMenuItems方法第 579-647 行会根据动作是否声明了params来决定弹窗内容有参数时弹出标题为Enter input parameters for action: ${action.name}的表单渲染名为replicas的文本输入框并在提交时把{name: replicas, value: 用户输入}传给服务端接口runResourceAction。从源码结构看前端还负责将输入回填为默认值并处理表单校验从入口处拦截明显非法的内容。服务端/Lua 校验无论请求来自 UI 还是 APIaction.lua中都会用tonumber将replicas参数转换为数值转换失败如非数字字符、超过 Lua 数值表示范围时抛出invalid number: 原始输入错误服务端随即终止执行并返回错误从不会产生把非数字写进 spec.replicas的后果。由于spec.replicas是整数类型的正数字段任何经过这两道防线的值最终还会被 Kubernetes API Server 自身的 schema 校验兜底。测试用例官方如何验证 Scale 功能仓库为 Scale 动作提供了完整的自动化测试可以直观看到正常缩放与非法输入两条路径的期望行为Deployment 的测试配置 resource_customizations/apps/Deployment/actions/action_test.yaml 中discoveryTests覆盖了 restart/pause/resume/scale 四类动作在不同资源状态下的启用与禁用逻辑actionTests则包含两条 scale 用例输入replicas: 6期望输出文件为testdata/deployment-scaled.yaml输入replicas: not_a_number期望错误信息为invalid number: not_a_number。StatefulSet 的测试配置 resource_customizations/apps/StatefulSet/actions/action_test.yaml 与 Deployment 的测试结构完全对应同样验证了replicas: 6的正常路径和replicas: not_a_number的报错路径。缩放后的期望结果示例可见 resource_customizations/apps/Deployment/actions/testdata/deployment-scaled.yaml其中spec.replicas已从原始值更新为6。这些测试证明Scale 动作对合法数字只做spec.replicas的定点修改、不影响其余字段对非法输入则一定以明确的错误信息失败。通过 CLI 执行缩放进阶用法虽然该功能主打 UI 体验但同一套 Resource Actions 机制也通过 CLI 暴露。相关命令实现在 cmd/argocd/commands/app_actions.go# 列出某个应用下所有资源可用的动作 argocd app actions list APPNAME --kind KIND [--resource-name RESOURCE] [--namespace NAMESPACE] [--group GROUP] # 在匹配的资源上执行指定动作 argocd app actions run APPNAME ACTION --kind KIND [--resource-name RESOURCE] [--namespace NAMESPACE] [--group GROUP]其中run命令最终调用RunResourceActionV2gRPC 接口cmd/argocd/commands/app_actions.go#L199当服务端不支持 V2 时会自动回退到已废弃的RunResourceActioncmd/argocd/commands/app_actions.go#L216-L227该接口在 server/application/application.go#L2664 中标记为 Deprecated。需要说明的是从当前源码注释TODO: add support for parameters看CLI 侧暂未开放参数透传因此通过 CLI 执行 scale 时的参数能力有限完整带参执行仍以 UI 为主要入口。权限控制谁能执行 Scale 操作Resource Actions 的执行受 RBAC 约束。在 server/application/application.go#L2697 中服务端以如下格式构造 RBAC 请求actionRequest : fmt.Sprintf(%s/%s/%s/%s, rbac.ActionAction, q.GetGroup(), q.GetKind(), q.GetAction())即权限对象形如action/group/kind/action。对于 Deployment 的 scale 操作对应的权限字符串为action/apps/Deployment/scale。因此管理员需要在项目的 RBAC 配置例如argocd-rbac-cmConfigMap中为相应角色授予action, apps/Deployment/scale, allow之类的策略用户才能在 UI 中看到并执行 Scale 动作。这是部署该功能时容易遗漏、却至关重要的配置步骤。另外在执行动作前服务端还会对脚本产出的每个资源调用verifyResourcePermitted做二次校验server/application/application.go#L2751-L2764确保动作不会越权修改未被授权的资源。总结Argo CD 的 Scale Resources 功能是一个典型的面向非技术用户的轻量运维入口UI 层通过通用的 Resource Actions 弹窗动态收集参数服务端通过 Lua 脚本执行点对点的spec.replicas修改既有操作上的便捷性又有两层参数校验与 RBAC 权限控制兜底。使用时请牢记两条红线该功能仅覆盖 Deployment 与 StatefulSet在启用 HPA 或自动同步的环境中人工缩放的结果会被自动调节机制覆盖。深入理解其 Lua 动作与 gRPC 链路后你还可以举一反三通过自定义discovery.lua与action.lua为其他资源类型扩展属于自己的动作。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表