拓冰建站拓冰建站
首页 / 资讯中心 / 正文

在火山引擎 Volcengine 上部署 Kubernetes Cluster Autoscaler:凭证配置、ASG 节点组与弹性伸缩实战指南

在火山引擎 Volcengine 上部署 Kubernetes Cluster Autoscaler凭证配置、ASG 节点组与弹性伸缩实战指南【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler火山引擎Volcengine版 Cluster Autoscaler 是 Kubernetes 官方 Autoscaler 仓库中为火山引擎云平台实现的云提供商Cloud Provider扩展它以 Deployment 形式运行在集群内通过与火山引擎「弹性伸缩Auto ScalingAS」服务联动动态调整 Worker 节点数量。本文以 cluster-autoscaler/cloudprovider/volcengine/README.md 为核心完整讲解从权限准备、ASG 手工配置到 CA 部署的每一步并结合仓库源码Provider、Manager、NodeGroup 实现剖析其内部工作原理与功能边界。读完本文你将能够在一套运行于火山引擎的 Kubernetes 集群上独立完成 Cluster Autoscaler 的部署、验证与排障。一、整体架构与工作原理Cluster Autoscaler 的核心逻辑是周期性扫描集群中处于 Pending 状态的 Pod需要扩容以及长时间低利用率的节点可以缩容然后调用云厂商 API 调整底层节点组的期望实例数。在火山引擎实现中这套逻辑被拆解为以下几层Cloud Provider 层volcengine_cloud_provider.go 实现cloudprovider.CloudProvider接口负责节点组枚举、节点归属判定等Manager 层volcengine_manager.go 中的VolcengineManager接口封装所有与火山引擎 API 的交互屏蔽 SDK 细节NodeGroup 层volcengine_auto_scaling_group.go 中的AutoScalingGroup把火山引擎的「弹性伸缩组ASG」映射为 CA 的节点组NodeGroupService 层volcengine_auto_scaling_cloud_service.go 调用火山引擎自动扩缩容 SDK实现SetAsgDesireCapacity、SetAsgTargetSize、RemoveInstances、ListScalingInstancesByGroupId、GetScalingGroupById、GetScalingConfigurationById等底层操作另有 volcengine_ecs_cloud_service.go 负责查询 ECS 实例规格。Provider 的注册入口在 volcengine_cloud_provider.go通过builder.RegisterCloudProvider(ProviderName, ...)注册其中ProviderName volcengine构建路由文件 router_volcengine.go 使用//go:build volcengine构建标签对该包做空白导入从而在带volcengine标签编译的二进制中启用该 Provider。二、权限配置使用火山引擎凭证创建 SecretCluster Autoscaler 需要通过火山引擎 OpenAPI 管理弹性伸缩组因此必须为它提供一组具有 AS 操作权限的 AccessKey。README 给出的做法是把凭证放入 Kubernetes Secret再通过环境变量注入 Deployment。创建cloud-configSecret示例文件apiVersion: v1 kind: Secret metadata: name: cloud-config namespace: kube-system type: Opaque data: access-key: [YOUR_BASE64_AK_ID] secret-key: [YOUR_BASE64_AK_SECRET] region-id: [YOUR_BASE64_REGION_ID]其中access-key火山引擎访问密钥 IDAK需要先 base64 编码secret-key火山引擎访问密钥 SecretSK需要先 base64 编码region-id弹性伸缩组所在的地域 ID如cn-beijing需要先 base64 编码。补充说明仓库示例中还有一个可选字段endpoint对应火山引擎 OpenAPI 的访问端点。从源码看volcengine_cloud_config.go 中定义了REGION_ID、ACCESS_KEY、SECRET_KEY、ENDPOINT四个环境变量名并提供了默认端点open.volcengineapi.com也就是说当 Endpoint 未配置时SDK 会自动回退到该默认地址。若你的网络环境需要走自定义网关可在 Secret 中追加data: endpoint: [YOUR_BASE64_ENDPOINT]凭证权限建议遵循最小化原则仅授予该 AK 管理弹性伸缩组与查询 ECS 实例规格所需的权限。三、手动配置在控制台准备弹性伸缩组Cluster Autoscaler 本身不会创建弹性伸缩组它只负责在既有 ASG 的容量上下限之间调整实例数量。因此需要先到火山引擎「弹性伸缩」控制台完成两步准备工作第 1 步创建弹性伸缩组Auto Scaling Group在火山引擎 AS 控制台创建弹性伸缩组配置项需要保证有效VPC、交换机、安全组、实例规格等均合法关键点将期望实例数Desired Instance Number设为 0。因为节点初始化与加入 Kubernetes 集群由启动脚本完成初始为空集群CA 启动后会根据实际需求自动拉起实例。第 2 步创建伸缩配置Scaling Configuration为伸缩组创建伸缩配置该配置决定了扩容时新节点的规格、镜像、磁盘等在「用户数据User Data」中写入初始化脚本脚本需要完成两件事初始化节点运行环境安装并配置容器运行时、kubelet 等将节点以自动注册的方式加入 Kubernetes 集群例如通过 kubeadm join、云厂商节点注册脚本等。这一设计的意义在于CA 扩容时拉起的每一台新实例都会执行该脚本从而自动成为可调度的 Worker 节点缩容时 CA 会先将节点上的 Pod 驱逐干净再调用 API 删除实例。四、部署 Cluster AutoscalerServiceAccount 与 RBACCA 运行在kube-system命名空间需要读取集群状态、驱逐 Pod、更新节点等权限。README 提供了一套完整的 RBAC 清单示例文件包含五个资源对象直接kubectl apply即可--- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler name: cluster-autoscaler-account namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-autoscaler labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler rules: - apiGroups: [] resources: [events, endpoints] verbs: [create, patch] - apiGroups: [] resources: [pods/eviction] verbs: [create] - apiGroups: [] resources: [pods/status] verbs: [update] - apiGroups: [] resources: [endpoints] resourceNames: [cluster-autoscaler] verbs: [get, update] - apiGroups: [] resources: [nodes] verbs: [watch, list, get, update, delete] - apiGroups: [] resources: - namespaces - pods - services - replicationcontrollers - persistentvolumeclaims - persistentvolumes verbs: [watch, list, get] - apiGroups: [batch, extensions] resources: [jobs] verbs: [watch, list, get, patch] - apiGroups: [ policy ] resources: [ poddisruptionbudgets ] verbs: [ watch, list ] - apiGroups: [apps] resources: [daemonsets, replicasets, statefulsets] verbs: [watch, list, get] - apiGroups: [storage.k8s.io] resources: [storageclasses, csinodes, csidrivers, csistoragecapacities] verbs: [watch, list, get] - apiGroups: [] resources: [configmaps] verbs: [create,list,watch] - apiGroups: [] resources: [configmaps] resourceNames: [cluster-autoscaler-status, cluster-autoscaler-priority-expander] verbs: [delete, get, update] - apiGroups: [coordination.k8s.io] resources: [leases] verbs: [watch, list, get, create, update, patch, delete, deletecollection] - apiGroups: [extensions] resources: [replicasets, daemonsets] verbs: [watch, list, get] --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: cluster-autoscaler namespace: kube-system labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler rules: - apiGroups: [] resources: [configmaps] verbs: [create,list,watch] - apiGroups: [] resources: [configmaps] resourceNames: [cluster-autoscaler-status, cluster-autoscaler-priority-expander] verbs: [delete,get,update,watch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-autoscaler labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-autoscaler subjects: - kind: ServiceAccount name: cluster-autoscaler-account namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: cluster-autoscaler namespace: kube-system labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: cluster-autoscaler subjects: - kind: ServiceAccount name: cluster-autoscaler namespace: kube-system各对象职责说明ServiceAccountCA 进程使用的身份cluster-autoscaler-accountClusterRole ClusterRoleBinding授予集群级权限包括读写 Node、驱逐 Pod、读写 ConfigMapcluster-autoscaler-status状态 ConfigMap 与cluster-autoscaler-priority-expander优先级扩缩容器、管理 Lease选主等Role RoleBinding限定在kube-system命名空间内对状态 ConfigMap 的读写遵循最小权限原则。五、创建 Deployment 并启动 CADeployment 是 CA 的运行载体示例文件--- kind: Deployment apiVersion: apps/v1 metadata: name: cluster-autoscaler namespace: kube-system labels: app: cluster-autoscaler spec: replicas: 1 selector: matchLabels: app: cluster-autoscaler template: metadata: namespace: kube-system labels: app: cluster-autoscaler spec: serviceAccountName: cluster-autoscaler-account containers: - name: cluster-autoscaler image: registry.k8s.io/autoscaling/cluster-autoscaler:latest imagePullPolicy: Always command: - ./cluster-autoscaler - --alsologtostderr - --cloud-config/config/cloud-config - --cloud-providervolcengine - --nodes[min]:[max]:[ASG_ID] - --scale-down-delay-after-add1m0s - --scale-down-unneeded-time1m0s env: - name: ACCESS_KEY valueFrom: secretKeyRef: name: cloud-config key: access-key - name: SECRET_KEY valueFrom: secretKeyRef: name: cloud-config key: secret-key - name: REGION_ID valueFrom: secretKeyRef: name: cloud-config key: region-id5.1 关键启动参数解析参数含义火山引擎场景下的说明--cloud-providervolcengine选择云提供商对应源码中注册的ProviderName volcengine--cloud-config/config/cloud-config云配置文件的挂载路径该参数为必填项源码BuildVolcengine中若为空会直接klog.Fatalf退出见 volcengine_cloud_provider.go--nodes[min]:[max]:[ASG_ID]静态指定节点组格式为最小实例数:最大实例数:弹性伸缩组ID火山引擎目前仅支持静态节点组发现--scale-down-delay-after-add1m0s新增节点后延迟缩容时间避免刚扩容就被缩容示例取 1 分钟--scale-down-unneeded-time1m0s节点被判定为多余后的冷却时间示例取 1 分钟生产环境建议按业务容忍度调大5.2--nodes参数背后的实现机制--nodes参数并不是简单的字符串解析它走的是 CA 的dynamic.SpecFromString机制见 volcengine_cloud_provider.go将[min]:[max]:[ASG_ID]解析为节点组规格调用manager.GetAsgById(ASG_ID)向火山引擎查询该伸缩组的真实信息用查询返回的MinInstanceNumber与MaxInstanceNumber覆盖命令行中的 min/max构造AutoScalingGroup。也就是说ASG 在火山引擎控制台上配置的实例数上下限才是最终生效的边界命令行里的 min/max 更多是用于校验和初始化。同时buildVolcengineProvider要求必须提供静态发现配置——若未指定--nodes会直接报错static discovery configuration must be provided for volcengine cloud providervolcengine_cloud_provider.go。5.3 凭证注入与配置回退链Deployment 通过secretKeyRef将cloud-configSecret 的三个字段注入为ACCESS_KEY、SECRET_KEY、REGION_ID环境变量。从 volcengine_cloud_config.go 的validate()逻辑可以看出完整的凭证解析顺序优先读取--cloud-config指向的配置文件INI 格式由gopkg.in/gcfg.v1解析配置文件中缺失的字段回退读取同名环境变量REGION_ID/ACCESS_KEY/SECRET_KEY/ENDPOINTENDPOINT仍未指定时使用默认值open.volcengineapi.com若最终regionId、accessKey、secretKey、endpoint任一为空校验失败并klog.Fatalf终止启动。因此README 中的 Deployment 即使没有显式挂载cloud-config配置文件仅凭 Secret 注入的环境变量也能完成鉴权——这正是它把 Secret 引用为 env 的原因。六、Auto-Discovery当前版本不支持README 明确说明Auto Discovery is not currently supported in Volcengine.这意味着火山引擎实现不提供按标签自动发现 ASG 的机制其他云厂商常用的--node-group-auto-discovery自动发现方式在火山引擎下不可用每个需要纳入弹性伸缩的伸缩组都必须通过--nodes[min]:[max]:[ASG_ID]显式声明。这一限制与源码一致buildVolcengineProvider中只接受StaticDiscoverySpecified()的静态发现路径。因此新增一个 ASG 节点池时需要同步修改 Deployment 的--nodes参数并滚动更新 CA。七、从源码看扩容与缩容的完整链路7.1 扩容Scale Up当集群出现无法调度的 Pending Pod 时CA 会为每个节点组做模拟调度选择可行的节点组执行扩容AutoScalingGroup.TargetSize()通过manager.GetAsgDesireCapacity获取当前期望容量IncreaseSize(delta)校验delta为正数、扩容后不超过MaxSize()然后调用manager.SetAsgTargetSizeSetAsgTargetSize最终落到 Service 层的SetAsgTargetSize/SetAsgDesireCapacity通过火山引擎 SDK 更新伸缩组期望实例数火山引擎侧按伸缩配置拉起新 ECS 实例执行 User Data 脚本完成节点初始化并加入集群CA 在后续循环中看到新节点注册将其纳入调度Pending Pod 完成调度。扩容模拟还依赖TemplateNodeInfo()它读取伸缩组当前生效的伸缩配置查询实例规格构造一个新节点长什么样的模拟节点CPU、内存、GPU、拓扑标签等用于预判扩容收益实现在 volcengine_auto_scaling_group.go 与 volcengine_manager.go。7.2 缩容Scale Down当节点利用率持续低于阈值超过--scale-down-unneeded-time后CA 会尝试缩容DeleteNodes(nodes)先校验当前期望容量大于MinSize()已到最小容量则拒绝删除逐个校验待删节点确实属于该 ASGbelongs()通过节点ProviderID反查归属见 volcengine_auto_scaling_group.go从节点ProviderID中提取 ECS 实例 ID格式为volcengine://instanceId见 volcengine_cloud_provider.go调用manager.DeleteScalingInstances→ Service 层RemoveInstances将实例从伸缩组移除CA 在删除节点前会先驱逐其上所有 Pod确保工作负载平滑迁移。节点与实例的对应关系建立在ProviderID之上Manager 在列举节点组实例时用getNodeProviderId生成volcengine://instanceId格式的 IDvolcengine_manager.goNodeGroupForNode再反向解析。因此火山引擎节点必须保证 kubelet 的--provider-id以volcengine://为前缀否则 CA 无法识别节点归属也无法进行缩容。八、功能边界与已知限制从源码接口实现情况看当前火山引擎实现有以下边界均可在 volcengine_cloud_provider.go 中确认仅支持静态节点组发现不支持 Auto DiscoveryREADME 明确声明未实现自动节点组创建/删除NewNodeGroup、Create、Delete、Autoprovisioned均返回未实现或不支持Node Autoprovisioning 不可用无定价模型Pricing()返回ErrNotImplemented无法做成本感知的扩容排序GPU 标签未接入GPULabel()返回空字符串GetAvailableGPUTypes为空 map不过TemplateNodeInfo中仍会按伸缩配置尝试设置 NVIDIA GPU 容量见 volcengine_manager.goGPU 实例的规格信息取决于伸缩配置中的实例类型查询结果HasInstance、AtomicIncreaseSize、ForceDeleteNodes、GetOptions等可选接口未实现CA 主循环会按未实现处理并回退到默认行为。九、部署后的验证与运维建议9.1 验证部署# 查看 Pod 是否正常运行 kubectl -n kube-system get pods -l appcluster-autoscaler # 查看启动日志确认节点组注册成功 kubectl -n kube-system logs -l appcluster-autoscaler | grep -i register\|scaling group # 查看 CA 状态 ConfigMap kubectl -n kube-system get configmap cluster-autoscaler-status -o yaml启动成功的日志中应能看到类似addNodeGroup/ 节点组成功注册的输出若日志出现Failed to validate cloud provider configuration或Failed to read cloud provider configuration则说明凭证或--cloud-config路径有问题可参考 volcengine_cloud_provider.go 的启动流程逐项排查。9.2 扩缩容行为验证扩容部署一个副本数超过当前容量的工作负载观察 CA 是否将 ASG 期望实例数调大、新节点是否自动注册并调度缩容将副本数降低后观察节点在--scale-down-unneeded-time之后是否被驱逐并删除最终期望容量是否回落到 ASG 的MinInstanceNumber边界保护将期望容量手动设置到MaxInstanceNumber后再扩容日志中应出现size increase is too large一类的保护性报错对应 volcengine_auto_scaling_group.go 的校验逻辑。9.3 运维注意点火山引擎 ASG 的**伸缩配置尤其是 User Data 初始化脚本**是节点能否成功加入集群的关键修改后建议先在非生产伸缩组验证需要接入新的节点池时修改 Deployment 的--nodes参数追加[min]:[max]:[ASG_ID]多个节点组可以重复传入多个--nodes生产环境建议将--scale-down-delay-after-add与--scale-down-unneeded-time调大如10m避免波动业务导致节点频繁抖动保持镜像版本与集群 Kubernetes 版本兼容registry.k8s.io/autoscaling/cluster-autoscaler镜像按集群版本选择对应 tag 更稳妥。十、相关文件索引用途路径官方部署指南本文核心文档cluster-autoscaler/cloudprovider/volcengine/README.mdSecret 示例cluster-autoscaler/cloudprovider/volcengine/examples/cluster-autoscaler-secret.yamlRBAC 示例cluster-autoscaler/cloudprovider/volcengine/examples/cluster-autoscaler-svcaccount.yamlDeployment 示例cluster-autoscaler/cloudprovider/volcengine/examples/cluster-autoscaler-deployment.yamlProvider 注册与构建cluster-autoscaler/cloudprovider/volcengine/volcengine_cloud_provider.go凭证与配置解析cluster-autoscaler/cloudprovider/volcengine/volcengine_cloud_config.go管理器与 API 封装cluster-autoscaler/cloudprovider/volcengine/volcengine_manager.go节点组实现cluster-autoscaler/cloudprovider/volcengine/volcengine_auto_scaling_group.go弹性伸缩云服务封装cluster-autoscaler/cloudprovider/volcengine/volcengine_auto_scaling_cloud_service.go构建路由启用 Providercluster-autoscaler/cloudprovider/router/router_volcengine.go【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门