尧图精选

在 VKE 集群中使用 Cluster Autoscaler for Vultr:配置、部署与源码解析

🕒 发布时间:2026/9/16 18:06:35 📁 来源:尧图网络
在 VKE 集群中使用 Cluster Autoscaler for Vultr配置、部署与源码解析【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler本文是 Kubernetes Autoscaler 仓库中 cluster-autoscaler/cloudprovider/vultr/README.md 的深度扩展指南围绕 Vultr Kubernetes EngineVKE上的节点池自动伸缩展开。你将掌握 cloud-config 的字段含义与写法、基于 Secret 的完整部署清单、如何通过 Vultr API 设定每个 Node Pool 的伸缩范围以及该云提供商在仓库中的源码实现脉络最终能够把 Cluster Autoscaler 独立、可控地运行在 VKE 集群中。背景VKE 与 Node Pool 模型Vultr Kubernetes EngineVKE是 Vultr 提供的托管 Kubernetes 服务。VKE 的核心抽象是Node Pool一组同机型Plan的节点集合。用户在创建 VKE 集群时划分 Node Pool每个池内的节点规格一致池的规模节点数量可以随时调整。有三个与伸缩行为直接相关的特性值得注意缩容由 VKE 决定删除谁当缩小 Node Pool 规模时用户无法指定删除某个具体节点VKE 会随机挑选节点删除以达到目标数量——即使某个节点不健康甚至已经被手动删除也在随机选择范围内。节点是可丢弃的disposableNode Pool 内的节点随时可以被删除并重新创建如果有人在 VKE 外部直接删除某个节点Vultr 会在短时间内自动重建它。Node Pool 是自动伸缩的基本单元Cluster Autoscaler 对 VKE 的伸缩操作本质上是把扩容/缩容翻译成调整某个 Node Pool 的目标节点数量具体节点的增删由 VKE 平台完成。工作原理Autoscaler 与 Vultr 的交互链路从源码结构看Vultr 云提供商由 4 个核心文件构成位于 cluster-autoscaler/cloudprovider/vultr/文件职责vultr_cloud_provider.go实现cloudprovider.CloudProvider接口注册vultr提供商负责启动时装配vultr_manager.go解析 cloud-config、管理 Vultr API 客户端、维护 Node Group 缓存vultr_node_group.go实现cloudprovider.NodeGroup接口执行扩容/缩容/删节点govultr/轻量 REST 客户端封装 Vultr API v2 的 Kubernetes 相关端点整体工作流可以概括为注册vultr_cloud_provider.go中的init()通过builder.RegisterCloudProvider(vultr, ...)注册提供商并将vultr设为默认提供商vultr_cloud_provider.go同时 router_vultr.go 以 build tagvultr将该包空导入进路由保证带该 tag 编译时被包含。装配BuildVultr()要求必须通过--cloud-config指定配置文件否则直接klog.Fatalf退出vultr_cloud_provider.go。注意一个关键设计该提供商自动使用 VKE 集群中的所有 Node Pool因此--node-group-auto-discovery与-nodes等节点组发现参数在这里不生效。刷新缓存每个主循环前调用Refresh()其内部通过 Vultr API 拉取集群全部 Node Pool只把开启了auto_scaler的池构建为 Node Group并把 API 返回的min_nodes/max_nodes作为该组的上下限vultr_manager.go。执行伸缩扩容/缩容即调用 Vultr API 的PATCH /v2/kubernetes/clusters/{cluster_id}/node-pools/{pool_id}更新node_quantity见 govultr/nodepools.go删节点则调用DELETE .../node-pools/{pool_id}/nodes/{node_id}govultr/nodepools.go。HTTP 客户端的基地址为https://api.vultr.com/v2User-Agent 为kubernetes/cluster-autoscaler超时 60 秒govultr/vultr_rest_client.go。配置cloud-config 文件详解Vultr 云提供商强制要求提供 cloud-config 配置文件README 明确指出 mandatory。该文件本质是一个 JSON 对象目前支持两个字段字段JSON 键是否必填说明集群 IDcluster_id是VKE 集群的 IDUUID 格式API Tokentoken是Vultr API 密钥字面量写入对应的 Go 结构体定义在 vultr_manager.go// Config is the configuration of the Vultr cloud provider type Config struct { ClusterID string json:cluster_id Token string json:token }newManager在解析 JSON 后会做两项校验token为空或cluster_id为空都会直接返回错误并终止启动vultr_manager.go。随后 token 通过oauth2.StaticTokenSource注入到每次 API 请求的 Authorization 头中。仓库提供了一个可直接参考的 Secret 示例 examples/cluster-autoscaler-secret.yaml完整内容如下--- apiVersion: v1 kind: Secret metadata: name: cluster-autoscaler-cloud-config namespace: kube-system type: Opaque stringData: cloud-config: |- { cluster_id: 6b8b7c8e-7314-4d17-bb0c-fcc9777230fa, token: IAOBTDG35OTGH2UKCC3S6CNMDUPCN3ZNVBASQ }部署时把其中的cluster_id换成你的 VKE 集群 ID、token换成你自己的 API 密钥即可。建议使用自己的凭据管理流程不要把示例密钥用于生产环境。部署把 Autoscaler 跑进 VKE 集群仓库同时给出了完整的部署清单 examples/cluster-autoscaler-deployment.yaml包含 ServiceAccount、ClusterRole、Role、两个 Binding 与 Deployment 五个对象。其关键点如下。命令行参数Deployment 中容器的启动命令examples/cluster-autoscaler-deployment.yaml./cluster-autoscaler --v2 --cloud-providervultr --cloud-config/config/cloud-config--cloud-providervultr指定使用 Vultr 云提供商与ProviderName vultr对应vultr_cloud_provider.go。--cloud-config/config/cloud-config指向挂载的配置文件路径缺失时进程会以klog.Fatalf退出。--v2日志级别排障时可调高以观察 Refresh 过程中打印的 Node Pool 信息如adding node pool: ... min nodes ... max nodes ...见 vultr_manager.go。挂载方式配置文件通过名为cloud-config的卷挂载到/config目录卷来源就是前面创建的 SecretvolumeMounts: - name: cloud-config mountPath: /config readOnly: true volumes: - name: cloud-config secret: secretName: cluster-autoscaler-cloud-config容器同时把宿主机的 CA 证书/etc/ssl/certs/ca-certificates.crt以 hostPath 方式只读挂载到同名路径ssl-certs卷用于与api.vultr.com及 Kubernetes API Server 建立 TLS 连接。资源与 RBACDeployment 声明了cpu: 100m / memory: 300Mi的请求与限制imagePullPolicy: Always并使用registry.k8s.io/autoscaling/cluster-autoscaler:latest镜像。RBAC 部分授予了标准的最小权限集对 nodes 的watch/list/get/update对 pods、services、namespaces 等的只读访问以及创建pods/eviction、操作cluster-autoscaler-statusConfigMap 等权限与通用 Cluster Autoscaler 部署一致。应用方式在集群内执行kubectl apply -f examples/cluster-autoscaler-deployment.yaml先应用 Secret即可把 Autoscaler 以单副本 Deployment 形式部署到kube-system命名空间。通过 Vultr API 控制伸缩范围一个容易混淆的点Autoscaler 是否接管某个 Node Pool、以及该池的最小/最大节点数都不是写在 cloud-config 里的而是通过 Vultr APIKubernetes 相关端点在 VKE 集群/Node Pool 上配置的。cloud-config 只负责告诉 Autoscaler 连哪个集群、用什么凭证。对应的 REST 字段在 govultr/nodepools.go 中定义// NodePool represents a pool of nodes that are grouped by their label and plan type type NodePool struct { ID string json:id DateCreated string json:date_created DateUpdated string json:date_updated Label string json:label Plan string json:plan Status string json:status NodeQuantity int json:node_quantity Tag string json:tag Nodes []Node json:nodes AutoScaler bool json:auto_scaler MinNodes int json:min_nodes MaxNodes int json:max_nodes }其中三个字段直接决定 Autoscaler 的行为auto_scalerbool是否让 Autoscaler 接管该 Node Pool。Refresh()中只有nodePool.AutoScaler true的池才会被构建成 Node Group 并纳入伸缩管理vultr_manager.go为 false 的池会被跳过。min_nodes/max_nodes该池的伸缩下限与上限会被同步为 Node Group 的minSize/maxSize供扩容、缩容时的边界校验使用。Autoscaler 在每次主循环前都会通过Refresh()重新拉取这些配置因此修改 API 上的这些值Autoscaler 会自动感知并即时调整策略无需重启或重新加载配置。扩容与缩容的源码级行为Node Group 的核心实现位于 vultr_node_group.go几个关键方法体现了以 Node Pool 为目标数量的伸缩模型扩容IncreaseSize(delta)要求delta 0计算目标数量nodeQuantity delta若超过MaxSize()则报错随后 PATCH Node Pool 的node_quantity并校验 API 返回的实际数量与目标一致后才更新本地缓存vultr_node_group.go。缩容DecreaseTargetSize(delta)要求delta 0同样校验不低于MinSize()后 PATCHnode_quantityvultr_node_group.go。删除节点DeleteNodes(nodes)优先读取节点上的标签vke.vultr.com/node-id得到节点 ID若标签缺失则回退到Spec.ProviderID去掉vultr://前缀后得到节点 ID前缀定义见 vultr_cloud_provider.go转换函数toProviderID/toNodeID在同文件 L158-L166。每删除一个节点本地NodeQuantity相应减一vultr_node_group.go。目标规模TargetSize()直接返回 Node Pool 的node_quantityvultr_node_group.go。节点归属NodeGroupForNode遍历各 Node Group 的节点列表按 providerID 匹配节点所属池vultr_cloud_provider.go。另外Pricing()、GetAvailableMachineTypes()、NewNodeGroup()、TemplateNodeInfo()等接口在当前实现中均返回ErrNotImplemented说明该提供商不支持节点自动配置Node Autoprovisioning与价格模型伸缩完全基于 VKE 已存在的 Node Pool 进行。开发与构建仓库为该提供商提供了测试覆盖vultr_cloud_provider_test.go、vultr_manager_test.go、vultr_node_group_test.go以及基于 testify mock 的 vultr_mock_test.go——mock 了ListNodePools、UpdateNodePool、DeleteNodePoolInstance三个接口方法用于在单测中模拟 Vultr API 而无需真实集群。自行构建镜像时进入仓库的cluster-autoscaler目录后执行make container该命令会基于GOARCH触发容器内构建并产出镜像见 cluster-autoscaler/Makefile 中container: container-arch-$(GOARCH)与container-arch-%: build-in-docker-arch-% make-image-arch-%的目标链。构建完成后为镜像打上合适的 tag 并推送到你自己的镜像仓库再替换部署清单中的image字段即可。注意事项与限制小结cloud-config 是强制的缺失--cloud-config或文件内容缺少cluster_id/token都会导致进程启动失败。该提供商不使用--nodes/--node-group-auto-discovery等节点组发现参数Node Pool 全部来自 Vultr API 的自动发现。只有 Vultr API 中开启了auto_scaler的 Node Pool 才会被伸缩min/max 也在 API 侧维护改动即时生效。缩容时具体删除哪些节点由 VKE 决定随机选择Autoscaler 只负责把目标数量下调并请求删除特定节点实例。不支持节点自动配置Autoprovisioning与 GPU 标签/价格模型等高级特性当前实现聚焦于对既有 Node Pool 的规模管理这一核心场景。【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →