上的部署与实现原理指南)
Kubernetes Cluster Autoscaler 在百度云BaiduCloud/CCE上的部署与实现原理指南【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler导读本文基于autoscaler仓库中 cluster-autoscaler/cloudprovider/baiducloud/README.md系统讲解如何让 Kubernetes Cluster Autoscaler下称 CA以Deployment形态运行在百度云 CCE 集群中对指定的节点组Autoscaling GroupASG执行自动扩缩容。读完本文你将掌握百度云 CA 的版本前提、单 ASG 与多 ASG 两种部署清单的完整用法、关键启动参数的语义与调优方式以及该云提供商从 Kubernetes 节点到百度云 CCE API 的底层调用链与设计限制。一、BaiduCloud 云提供商概览Cluster Autoscaler 通过云提供商Cloud Provider插件机制对接不同基础设施。在百度云上该插件以baiducloud为提供商名称注册负责将 Kubernetes 集群内的节点与百度云 CCE 的节点组ASG关联起来从而实现扩容Scale Up当集群存在因资源不足而无法调度的 Pod 时CA 调用百度云 CCE 接口为指定节点组增加工作节点缩容Scale Down当节点利用率长期低下且 Pod 可安全迁移时CA 将节点从集群与云侧节点组中一并移除。从源码看该插件的入口在 baiducloud_cloud_provider.go其中ProviderName baiducloud并在init()中通过builder.RegisterCloudProvider完成注册对应的路由文件 router_baiducloud.go 通过//go:build baiducloud构建标签在编译时以空导入方式把该插件链接进 CA 主程序。二、版本前提按照原文档说明Cluster Autoscaler 必须运行在Kubernetes v1.8.6 或更高版本的集群上。这是部署百度云版 CA 的最低版本门槛请在使用前确认集群版本满足该要求。示例清单中使用的 CA 镜像为hub.baidubce.com/jpaas-public/cluster-autoscaler:v1.0.0来自百度云镜像仓库实际部署时可替换为你构建或获取的对应版本镜像。三、部署前的准备工作云配置文件与 kubeconfig示例 Deployment 通过两个 hostPath 卷向 CA 容器注入两样关键配置见 cluster-autoscaler-one-asg.yaml挂载路径卷来源用途/etc/kubernetes/cloud.config宿主机/etc/kubernetes/cloud.config百度云云配置认证信息、集群信息等对应启动参数--cloud-config/root/.kube/config宿主机/root/.kube/config访问 Kubernetes API 的 kubeconfig对应启动参数--kubeconfig3.1 CloudConfig 字段说明云配置文件是一份 JSON结构定义在 baiducloud_cloud_config.go 的CloudConfig中{ ClusterId: CCE 集群 ID, ClusterName: 集群名称, AccessKeyID: 百度云 AK, SecretAccessKey: 百度云 SK, Region: bj, VpcId: VPC ID, MasterId: Master 节点 ID, Endpoint: CCE 服务地址, NodeIP: 节点 IP, Debug: false }字段语义与校验规则如下MasterIdMaster 节点 ID必填缺失时报Cloud config must have a Master IDClusterIdCCE 集群 ID必填缺失时报Cloud config must have a ClusterID后续所有 CCE API 调用都要携带该 IDEndpointCCE 服务端点必填缺失时报Cloud config must have a Endpoint。在 baiducloud_manager.go 中实际请求端点会被拼接为cfg.Endpoint /internal-apiAccessKeyID / SecretAccessKey百度云 API 访问凭据用于构造 BCE 签名客户端Region地域如bj、gz、su、bd、hk等。SDK 层 cce/client.go 内置了各区域的默认 BCC 端点映射表仅在Endpoint未显式给出时用作兜底Debug置为true时manager 会调用cceClient.SetDebug(true)输出更详细的请求调试日志见 baiducloud_manager.go 的CreateBaiducloudManager。3.2 客户端初始化细节CreateBaiducloudManager会基于上述配置构造百度云 CCE SDK 客户端几个值得注意的实现点见 baiducloud_manager.go请求超时固定为20 * time.SecondHTTP 头UserAgent统一加前缀cce-k8s:并附上 ClusterIDmanager 启动后会启动一个每小时执行一次的协程通过regenerateCache()刷新实例 → ASG映射缓存见 baiducloud_auto_scaling_groups.go以保证节点归属判断的时效性。四、部署规范单 ASG 与多 ASG原文档给出的两种部署方式如下可直接使用仓库内的示例清单。4.1 单 ASG 部署适用场景集群只需管理一个节点组例如名为k8s-worker-asg-1、最小 1 台、最大 10 台。kubectl apply -f cluster-autoscaler/cloudprovider/baiducloud/examples/cluster-autoscaler-one-asg.yaml清单 cluster-autoscaler-one-asg.yaml 一次性创建了名为cluster-autoscaler的 ServiceAccountnamespacekube-systemClusterRole / Role 及对应的 ClusterRoleBinding / RoleBinding授予 CA 操作节点、Pod、ConfigMap、PodDisruptionBudget 等资源所需的 RBAC 权限其中 Role 仅限kube-system命名空间下的 ConfigMap 操作用于读写cluster-autoscaler-status等状态对象一个apps/v1Deploymentreplicas: 1。Deployment 中的核心启动命令command: - ./cluster-autoscaler - --v4 - --stderrthresholdinfo - --cloud-providerbaiducloud - --skip-nodes-with-local-storagefalse - --nodes1:10:k8s-worker-asg-1 - --cloud-config/etc/kubernetes/cloud.config - --kubeconfig/root/.kube/config--nodes1:10:k8s-worker-asg-1即节点组规格Node Group Spec格式为minNodes:maxNodes:asgName表示该 ASG 的最小/最大节点数分别为 1 和 10。该字符串会由 CA 的dynamic.SpecFromString解析再经 baiducloud_cloud_provider.go 的buildAsgFromSpec构造成内部的Asg对象并注册进 manager 的 ASG 注册表见RegisterAsg。4.2 多 ASG 部署适用场景集群由多个节点组组成例如k8s-worker-asg-11~10 台与k8s-worker-asg-21~10 台。kubectl apply -f cluster-autoscaler/cloudprovider/baiducloud/examples/cluster-autoscaler-multiple-asgs.yamlcluster-autoscaler-multiple-asgs.yaml 与单 ASG 版本的唯一区别在于 Deployment 中同时声明了两个节点组command: - ./cluster-autoscaler - --v4 - --stderrthresholdinfo - --cloud-providerbaiducloud - --skip-nodes-with-local-storagefalse - --nodes1:10:k8s-worker-asg-1 - --nodes1:10:k8s-worker-asg-2 - --cloud-config/etc/kubernetes/cloud.config - --kubeconfig/root/.kube/config也就是说多 ASG 只需重复传递--nodes参数即可RBAC 部分两个清单完全一致。4.3 从源码看节点组的发现方式baiducloud_cloud_provider.go 的BuildBaiducloudCloudProvider揭示了百度云插件**只支持静态发现Static Discovery**这一重要约束当通过--nodes指定了节点组规格时走buildStaticallyDiscoveringProvider路径逐个注册 ASG若使用自动发现Auto Discovery机制会直接返回错误only support static discovery scaling group in baiducloud for now若两者都未指定则报node group specs must be specified。另外静态注册阶段对 ASG 数量有硬性上限超过 200 个 ASG 会直接构建失败not support ASGs number 200。规划大规模集群时需留意该限制。五、常见注意事项与 Gotchas原文档重点提示了两个默认行为及其覆盖方式5.1 不终止 kube-system 命名空间的 Pod默认情况下CA不会终止运行着 kube-system 命名空间下 Pod 的节点这是 CA 的通用保护机制避免缩容干扰系统组件。如需关闭该保护例如节点上仅存有可容忍短暂中断的系统 Pod而你又希望允许缩容可以传入--skip-nodes-with-system-podsfalse5.2 缩容冷却时间默认情况下CA 在两次缩容操作之间会等待 10 分钟以防止频繁抖动。可通过--scale-down-delay调整例如缩短到 5 分钟--scale-down-delay5m该参数接受 Go duration 格式如5m、30s在压测或演示场景下常用较小值生产环境则建议保持或加大默认值以降低操作频率。5.3 其他部署建议源自示例清单示例清单还演示了如下实践可一并参考--skip-nodes-with-local-storagefalse允许缩容带有本地存储local storage的节点默认示例显式关闭了对本地存储节点的跳过保护--v4与--stderrthresholdinfo将日志级别提升到 4 并让 info 及以上日志输出到 stderr便于排查 ASG 状态统计与 API 调用细节容器资源建议requests/limits均为cpu: 100m、memory: 300Mi作为控制平面组件而言足够轻量。六、扩缩容背后的实现链路为帮助读者理解 CA 在百度云上的工作方式以下结合源码梳理扩容 / 缩容 / 节点归属判定三条关键路径。6.1 扩容IncreaseSize → ScaleUpClusterWithGroupID当 CA 判定需要扩容时会调用Asg.IncreaseSize(delta)见 baiducloud_cloud_provider.go。其逻辑为校验delta必须为正数通过GetAsgSize查询当前 ASG 节点数若当前大小 delta MaxSize拒绝扩容并报错size increase too large否则调用baiducloudManager.ScaleUpCluster(delta, asg.Name)。ScaleUpCluster见 baiducloud_manager.go构造cce.ScaleUpClusterWithGroupIDArgs{ClusterID, Num, GroupID}并调用 SDK。SDK 侧见 cce/cluster.go向v1/cluster/group/scaling_up端点发送POST请求携带groupId、clusterUuid、num三个查询参数即向指定节点组追加 N 台节点。6.2 缩容DeleteNodes → ScaleDownCluster缩容路径为Asg.DeleteNodes(nodes)流程更为严谨先查当前 ASG 大小若已到MinSize则拒绝删除并返回min size reached, nodes will not be deleted对每个待删节点从其Spec.ProviderID格式形如cce://instanceId中解析出实例 ID通过asg.Belongs(instanceId)校验该实例确实属于当前 ASG防止误删校验全部通过后调用baiducloudManager.ScaleDownCluster(nodeID)。ScaleDownCluster构造cce.ScaleDownClusterArgs{ClusterID, NodeInfos}SDK 向v1/cluster端点发送带scalingDown标记的POST请求见 cce/cluster.go由百度云侧完成实例的释放与移除。6.3 节点归属判定NodeGroupForNode 与实例缓存CA 需要知道某个 Kubernetes 节点属于哪个 ASG以便决策。NodeGroupForNode的实现见 baiducloud_cloud_provider.go将node.Spec.ProviderID按//拆分取后半段作为实例 ID形如cce://i-xxxx中的i-xxxx调用manager.GetAsgForInstance(instanceID)查询归属返回该 ASG若实例不属于任何受管 ASG 则返回nil。缓存层baiducloud_auto_scaling_groups.go维护了一张instanceToAsg映射并在找不到归属时把实例记入instancesNotInManagedAsg避免对百度云 API 的重复无效调用。ASG 大小统计GetAsgSize只将状态为RUNNING、CREATING或状态为空的实例计入有效节点数DELETING与异常状态实例会被排除——这正是节点正在创建中也会被计为目标容量这一行为的来源。6.4 扩容模拟TemplateNodeInfoCA 在扩容前会做空节点模拟以预估新节点形态。Asg.TemplateNodeInfo见 baiducloud_cloud_provider.go通过getAsgTemplate调用 SDK 的DescribeGroupGET/v1/cluster/group见 cce/cluster.go获取节点组规格CPU、内存、GPU 数量、临时存储、标签等再由buildNodeFromTemplate构造一个包含容量、Allocatable、就绪状态与 kube-proxy 的模拟 Node 对象供调度模拟器使用。这里也能看到百度云对 GPU 节点的支持方式GPU 数量会写入gpu.ResourceNvidiaGPU容量节点标签前缀为baidu/nvidia_nameGPULabel常量可用的 GPU 类型包括nTeslaV100、nTeslaP40、nTeslaP4、nTeslaV100-16、nTeslaV100-32见 baiducloud_cloud_provider.go。七、单元测试与可验证性仓库为百度云插件提供了较完整的单元测试可用来验证上述行为baiducloud_cloud_provider_test.go验证 provider 构建、Name()返回baiducloud、NodeGroups()正确解析1:10:k8s-worker-asg-1规格min1、max10、Idk8s-worker-asg-1、GPU 标签为baidu/nvidia_name以及Cleanup/Refresh不报错测试中使用的资源限制为 cores 1~10、memory 10000000~100000000毫字节baiducloud_manager_test.go验证RegisterAsg与buildNodeFromTemplate包括由模板生成的节点名称以 ASG 名称为前缀。这些测试无需真实云环境即可运行是理解插件行为边界的最佳入口。八、限制与注意事项汇总综合原文档与源码部署百度云版 CA 前请重点确认以下边界Kubernetes 版本须为 v1.8.6 及以上百度云插件仅支持静态发现--nodes显式声明节点组不支持自动发现模式受管 ASG 数量上限为 200 个默认不缩容含 kube-system Pod 的节点需显式传--skip-nodes-with-system-podsfalse覆盖两次缩容默认间隔 10 分钟可用--scale-down-delay调整云配置中的MasterId、ClusterId、Endpoint为必填项节点 ProviderID 须符合cce://instanceId格式否则归属判定会失败。九、维护者百度云插件由以下成员维护Hongbin Maohello2maoTi Zhoutizhou86延伸阅读插件入口与节点组实现baiducloud_cloud_provider.go云配置与 managerbaiducloud_cloud_config.go、baiducloud_manager.goASG 缓存注册表baiducloud_auto_scaling_groups.go百度云 CCE SDK 客户端baiducloud-sdk-go/cce/client.go、baiducloud-sdk-go/cce/cluster.go部署清单cluster-autoscaler-one-asg.yaml、cluster-autoscaler-multiple-asgs.yaml构建标签路由router_baiducloud.go【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考