ARTICLE DETAIL

资讯详情

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

Cluster Autoscaler 外部 Expander gRPC 插件(Expander Plugin over gRPC)方案与实战指南

Cluster Autoscaler 外部 Expander gRPC 插件(Expander Plugin over gRPC)方案与实战指南 Cluster Autoscaler 外部 Expander gRPC 插件Expander Plugin over gRPC方案与实战指南【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscalerCluster AutoscalerCA在判定需要扩容时需要从多个节点组Node Group中选出把新节点加到哪里承担这一决策的模块称为Expander。当内置的random、most-pods、least-waste、price、priority等策略无法满足个性化业务需求时过去只能向上游提交改动或 fork 维护自己的实现。本文以仓库中 expander-plugin-grpc.md 提案为核心深入拆解如何通过gRPC TLS将自定义 Expander 做成独立部署的外部插件服务并结合 FAQ.md 与 externalgrpc 云提供商实现 给出接口定义、消息协议、启动参数与落地实践的完整说明。读完本文你将掌握externalgrpc类型 Expander 的架构原理、协议设计与配置启用方法能够独立实现并部署一个自定义扩缩容策略服务。Expander 机制与现状CA 如何决定把节点加到哪里在深入插件方案之前先明确 Expander 在 CA 中的定位。根据 FAQ.md 的 What are Expanders 章节当 CA 检测到存在无法调度的 Pod 而需要扩容时会增大某个节点组的规模集群中只有一个节点组时策略是平凡的但当存在多个节点组时CA 必须决定优先扩哪个——Expander 就是提供这种选组策略的模块。用户通过--expander参数选择策略例如./cluster-autoscaler --expanderrandom当前仓库 FAQ 中记录的内置 Expander 包括Expander行为random随机选择适用于对节点组扩容方式没有特别要求的场景most-pods选择扩容后能调度最多 Pod 的节点组适合配合 nodeSelector 使用注意它不会因为选大节点而减少数量因为可以一次性加多个小节点least-waste默认策略选择扩容后空闲 CPU并列时看内存最少的节点组适合存在高 CPU、高内存等不同规格节点、且只想在有待调度 Pod 需要时才扩容的场景least-nodes选择扩容后使用节点数最少的节点组倾向于用更少的更大节点适合与most-pods链式组合price选择成本最低且机型匹配集群规模的节点组详见 pricing.md 提案priority选择用户配置中优先级最高的节点组从 1.23.0 起CA 支持以逗号分隔传递多个 Expander如--expanderpriority,least-waste前一个 Expander 的输出作为后一个的输入最终仍有多解时随机决定同一 Expander 不允许重复出现。尽管内置策略覆盖面广提案 expander-plugin-grpc.md 指出其根本局限用户一旦需要自定义业务逻辑例如加权随机、自定义竞价现货市场策略等就必须向上游提交改动或 fork CA 并长期维护自己的分支迭代速度慢、维护成本高且这些逻辑往往与社区无关却不得不绑定 CA 的发布节奏。这正是该提案要解决的问题。提案目标向后兼容的可插拔外部 Expander提案的核心思路是给 CA 增加一个外部 Expander选项但不破坏现有任何策略的向后兼容性CA 不再直接编译进所有策略而是允许用户将一个实现了ExpandergRPC 服务的进程部署在集群内CA 在需要做扩容决策时通过 gRPC 调用它。该设计明确声明借鉴了仓库中另一份姊妹提案 plugable-provider-grpc.md可插拔云提供商接口两者思路一脉相承把CA 核心逻辑与外部实现通过 gRPC 解耦。提案给出的动机场景来自 Airbnb希望迭代诸如**加权随机 Expanderweighted random expander、自定义现货市场策略custom spot market strategy**等 CA 之外的定制策略既不想等待上游合入也不想长期维护 fork。总体架构独立 Pod 中的 gRPC Expander 服务如上文架构图所示整套方案的部署形态为CA 侧在原有 CA 容器内附带一个gRPC client当--expander选择外部类型时扩容决策不再走内置策略而是向外部服务发起BestOption()调用外部服务侧一个独立 Pod / 独立 Deployment中运行External Expander Service内部是gRPC server与 CA 分属不同的 Pod独立于 CA 进行发布、升级与扩缩容通信方式两者通过 gRPC 通信并强制要求 TLS保障安全证书由 CA 侧指定 CA bundle 校验服务端证书。该服务必须实现 CA 中 Expander 策略接口的语义——提案指出该接口只有一个方法// Strategy describes an interface for selecting the best option when scaling up type Strategy interface { BestOption(options []Option, nodeInfo map[string]*schedulerframework.NodeInfo) *Option }也就是说外部插件的全部职责就是给定候选扩容方案列表options与节点信息nodeInfo返回最佳的那一个方案*Option。CA 将这一接口语义以 gRPC 形式暴露给外部服务实现。协议定义gRPC Service 与消息结构提案给出了外部 Expander 服务的 protobuf 定义。服务仅暴露一个 RPCsyntax proto3; package clusterautoscaler.expander.v1; import google/protobuf; import k8s.io/autoscaler/cluster-autoscaler/cloudprovider/generated.proto; import k8s.io/api/core/v1/generated.proto; option go_package v1; service Expander { rpc BestOption (BestOptionRequest) returns (BestOptionResponse) {} }一次调用涉及的三个消息定义如下message BestOptionRequest { repeated Option options 1; mapstring, schedulerframework.NodeInfo nodeInfo 2; } message BestOptionResponse { Option option 1; } message Option { k8s.io.autoscaler.cluster-autoscaler.cloudprovider.NodeGroup nodeGroup 1; int32 nodeCount 2; string debug 3; repeated k8s.io.api.core.v1.Pod pod 4; }可以看到Option携带了四类关键信息目标节点组NodeGroup、建议增加的节点数量nodeCount、供排查使用的**调试字符串debug**以及相关的Pod 列表——这与 CA 内置 Expander 决策所需的信息维度保持一致选哪个组、加几个节点、依据是什么。需要说明的是提案中mapstring, schedulerframework.NodeInfo这类字段属于协议示意——protobuf 无法直接传输 Go 内部类型。从仓库中已落地的 externalgrpc.proto 可以看到实际工程中同类问题的通行解法将 Kubernetes 对象序列化为bytes传输。例如该文件 L317-L327 的NodeGroupTemplateNodeInfoResponse定义message NodeGroupTemplateNodeInfoResponse { // nodeBytes is a proto-serialized v1.Node object. // Generated by calling v1.Node#Marshal(). // Convertable to a node by calling v1.Node#Unmarshal(). bytes nodeBytes 2; }即通过v1.Node#Marshal()序列化、v1.Node#Unmarshal()还原PricingPodPriceRequest中的bytes pod_bytes也采用同样手法。实现外部 Expander 服务端时可参照这一模式在nodeInfo与Pod字段上做序列化处理。错误处理与容错回退提案对故障场景有明确的兜底约定如果与 gRPC 服务端的调用出现错误CA 客户端将回退到randomExpander 策略这与现有各内置 Expander 的 fallback 语义保持一致——即外部策略不可用时退化为随机选择保证扩容流程不中断。结合 FAQ.md 中关于多 Expander 链的说明如--expanderpriority,least-waste前一个策略输出多解时交给后一个最终仍多解则随机可以推断该回退行为与最终随机兜底的设计一脉相承任何策略层的失败都不应阻塞 CA 的扩容动作而是安全降级到随机选择避免因单个组件故障导致集群无法扩容。启动参数与启用方式为了与外部 gRPC 服务通信CA 需要新增若干启动参数。提案明确提出的参数包括参数用途--expanderexternalgrpc在 expander 选项中新增的外部类型选中后扩容决策走外部 gRPC 服务--expander-plugin-urlhttps://external-grpc-url/server指定外部 gRPC Expander 服务的地址用于建立连接--external-expander-cert~/path/to/cert指定 CA bundle 文件路径用于校验服务端 TLS 证书其中安全通信是提案的硬性要求必须使用 TLS--external-expander-cert即指向用于校验 gRPC 服务端 TLS 证书的 CA bundle。这与姊妹提案 plugable-provider-grpc.md 中证书在部署 cluster-autoscaler 时挂载进集群的做法一致——实际部署时通常将该证书文件通过 Secret/ConfigMap 挂载到 CA 容器内再以参数引用。值得注意的落地差异从当前仓库 FAQ.md 的 flag 汇总表 可以看到实现落地后相关参数的命名与提案略有调整表中记录为参数说明expander可选值[random, most-pods, least-waste, price, priority, grpc]逗号分隔可链式调用默认least-wastegrpc-expander-certPath to cert used by gRPC server over TLSgRPC 服务端 TLS 校验证书路径grpc-expander-urlURL to reach gRPC expander server外部 gRPC Expander 服务地址即提案中的--expander-plugin-url/--external-expander-cert在落地文档中对应为--grpc-expander-url/--grpc-expander-cert而 expander 取值在 FAQ 表格中写作grpc。如果你基于较新版本部署应以该版本官方 flag 文档为准阅读源码与提案时注意这组命名差异即可。FAQs 同时记录了这些参数可进入 CA 的 flags 体系供./cluster-autoscaler --help或 Helm Chart values 配置。与外部 gRPC Cloud Provider 方案的关联与参考实现理解本提案的另一条主线是它与仓库中已落地的外部 gRPC 云提供商方案的对应关系。姊妹提案 plugable-provider-grpc.md 解决的是云提供商CloudProvider的插件化让用户在不 fork 的前提下将私有云/定制云逻辑做成独立的 gRPC 服务CA 通过--cloud-providerexternalgrpc接入。它围绕CloudProvider与NodeGroup两大接口暴露了NodeGroups、NodeGroupForNode、NodeGroupIncreaseSize、NodeGroupDeleteNodes、NodeGroupTemplateNodeInfo等一系列 RPC而 Expander 插件方案则是把同一套gRPC 插件化思路应用到扩容选组策略这一层——两案共同构成了CA 一切可扩展点均可外置的完整拼图。该云提供商方案在当前仓库中已完整实现可作为 Expander 插件落地的直接参考模板Proto 定义externalgrpc.proto 定义了service CloudProvider及全部消息option go_package cloudprovider/externalgrpc/protos客户端实现externalgrpc_cloud_provider.go、externalgrpc_node_group.go 实现了转发与错误处理注册入口router_externalgrpc.go 将externalgrpc注册进云提供商路由表配置参数externalgrpc README 给出了云配置文件字段——address必填形如host:port、key/cert/cacertmTLS 证书路径可选、grpc_timeout默认 5s。该 README 中还有几条对实现 Expander 插件服务极具借鉴价值的实践建议强烈建议启用 mTLS云提供商场景下无鉴权的明文调用会直接导致节点创建/删除Expander 虽不直接改集群资源但同样属于控制面调用提案要求 TLS 是底线双向 TLS 更佳日志分级--v1记录基础错误、--v5记录每次调用的详细日志便于排查 gRPC 链路问题性能缓存由于 gRPC 引入额外网络开销云端方案对NodeGroupForNode、NodeGroups等高频调用做了缓存直到Refresh()才失效。Expander 的BestOption在每次扩容决策时都会触发若你的策略依赖远端数据同样应考虑缓存与超时控制代码生成proto 变更后运行 update-proto.sh 重新生成 gRPC 桩代码。此外该 README 目录下提供了完整的示例实现 external-grpc-cloud-provider-service一个包装所有 in-tree 云提供商的 gRPC 服务端以及 CA 侧部署清单 cluster-autoscaler.yaml可作为你编写外部 Expander 服务端gRPC server TLS 配置 独立 Deployment Service时直接对照的范本。落地实践要点综合提案与仓库现有实现部署一个外部 gRPC Expander 的推荐路径为实现服务端用你熟悉的语言提案以 Go 为例按前文 proto 实现Expander服务仅需实现BestOption(BestOptionRequest) returns (BestOptionResponse)服务内封装你的业务策略加权随机、成本模型、专用市场策略等返回选中的Option加固传输为服务端配置 TLS 证书生产环境建议双向 TLS并将 CA 校验所需的 CA bundle 以 Secret/ConfigMap 形式挂载进 CA 容器独立部署将服务端打包为镜像以独立 Deployment Service 形式部署在集群中不随 CA 镜像发布可独立迭代升级配置 CA按提案设置--expanderexternalgrpc并传入服务 URL 与证书路径落地命名参考当前版本的--grpc-expander-url/--grpc-expander-cert验证与容错确认外部服务异常时 CA 回退到random策略、扩容流程不被阻塞并利用--v1/--v5日志级别观察 gRPC 调用链。总结Expander Plugin over gRPC 提案 为 Cluster Autoscaler 提供了一条不 fork、不提交上游即可私有化扩缩容策略的插件化路径外部服务仅需实现一个BestOptionRPC通过 TLS 保护的 gRPC 与 CA 通信出错时安全回退到random。它与仓库中已落地的 外部 gRPC 云提供商 构成同一套插件化设计语言后者从 proto 定义、客户端实现到部署清单的完整工程实践正是实现前者的最佳参考样板。对于有定制扩容选组逻辑诉求的团队这套方案在保持向后兼容的同时把策略迭代的自由度完整交还给了用户。【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表