ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Kubernetes Cluster Autoscaler 集成 Cluster API 云提供商完整指南

Kubernetes Cluster Autoscaler 集成 Cluster API 云提供商完整指南 Kubernetes Cluster Autoscaler 集成 Cluster API 云提供商完整指南【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscalerCluster Autoscaler 的 Cluster API 云提供商cloud provider基于 Cluster API 为主体结合当前仓库源码clusterapi_autodiscovery.go、clusterapi_utils.go、clusterapi_unstructured.go 等逐项展开读完你可以独立完成启动参数配置、节点组自动发现限定、双集群连接拓扑选型、从零扩容scale from zero注解与 RBAC 落地、GPU/CSI/DRA 等特殊场景配置以及相似节点组均衡的标签排除策略。版本前提Cluster API 云提供商要求Kubernetes v1.16 或更高版本才能运行 v1alpha3 版本的 Cluster API。需要注意的是该版本要求针对的是 Cluster API 管理集群侧 API 的可用性实际使用中请以你部署的 Cluster API 版本当前仓库控制器代码默认以cluster.x-k8s.io组的首选版本工作详见后文自定义资源版本一节为准。启动 Autoscaler启用 Cluster API 云提供商只需在 cluster-autoscaler 二进制启动参数中显式声明cluster-autoscaler --cloud-providerclusterapi该示例只展示了云提供商相关参数实际部署时通常还需要--kubeconfig、--cloud-config、--node-group-auto-discovery以及扩缩容策略等其他命令行参数。完整选项可通过cluster-autoscaler --help查看。从源码角度--cloud-providerclusterapi会走通 clusterapi_provider.go 的构建链路云提供商内部创建machineController见 clusterapi_controller.go该控制器同时持有工作负载集群的 informer监视 Node与管理集群的 dynamic informer监视 Machines、MachineSets、MachineDeployments、MachinePools并以spec.providerID/spec.providerIDList与node.Spec.ProviderID建立双向索引完成Node → Machine → 可伸缩资源的归属映射。配置节点组自动发现必须配置节点组自动发现告诉 autoscaler 到哪些集群中寻找可伸缩的节点组。自动发现参数格式为--node-group-auto-discoveryclusterapi:keyvalue,keyvalue支持三类过滤键可任意组合过滤维度键作用命名空间namespace只匹配指定命名空间内的资源集群名clusterName只匹配属于指定 Cluster 的资源标签任意自定义键只匹配携带指定标签keyvalue的资源示例# 仅匹配 blue 命名空间中的资源 --node-group-auto-discoveryclusterapi:namespaceblue # 仅匹配属于 test1 这个 Cluster 的资源 --node-group-auto-discoveryclusterapi:clusterNametest1 # 仅匹配携带 colorgreen, shapesquare 标签的资源 --node-group-auto-discoveryclusterapi:colorgreen,shapesquare上述条件可以自由混合例如只匹配 staging 命名空间、属于 purple 集群、且带标签ownerjim的资源--node-group-auto-discoveryclusterapi:namespacestaging,clusterNamepurple,ownerjim底层解析逻辑clusterapi_autodiscovery.go配置项先按:分割为发现器类型 参数列表发现器类型必须是clusterapi否则返回ConfigurationError参数列表按,逐项解析为keyvalue对namespace与clusterName为特殊键其余键一律转换为等值Equals标签选择器Requirement每个配置会被编译为一个clusterAPIAutoDiscoveryConfig包含clusterName、namespace、labelSelector在 allowedByAutoDiscoverySpec 中三个条件使用AND语义联合判定命名空间不匹配、集群名不匹配、标签选择器不匹配任一命中即拒绝该资源多个配置之间使用OR语义allowedByAutoDiscoverySpecsclusterapi_controller.go只要任一配置放行即可listResources还会以kind-namespace-name为键去重防止多个配置重复枚举同一资源如果完全不配置自动发现参数则回退到允许所有资源的旧行为值得注意的是namespaceToWatch会取第一个非空命名空间作为 informer 的过滤命名空间见 clusterapi_autodiscovery.go即 informer 层的 watch 范围会按此收窄从而减少管理集群侧的 API 压力。连接管理集群与工作负载集群Cluster API 架构中存在两类集群管理集群management cluster承载 Machine/MachineSet/MachineDeployment/MachinePool 等 CRD 与控制器负责扩缩机器工作负载集群workload cluster承载实际 Node 与 Pod负责提供调度与观测数据。autoscaler 需要同时访问两者通过两个参数指定连接配置[!IMPORTANT]--cloud-config指定挂载的 kubeconfig 卷路径即 KUBECONFIG用于与Cluster API 管理集群通信执行机器的扩缩操作。--kubeconfig指定挂载的 kubeconfig 卷路径用于与Cluster API 工作负载集群通信监视 Node 和 Pod。该参数是否必须显式给出取决于部署拓扑见下方示意图。回退规则若未指定--kubeconfigautoscaler 尝试使用in-cluster 配置服务账户若未指定--cloud-config则回退使用--kubeconfig提供的配置。拓扑一运行在联合集群中使用服务账户凭据管理集群与工作负载集群为同一集群autoscaler 部署在其中----------------- | mgmt / workload | | --------------- | | autoscaler | -----------------管理与工作负载均使用 in-cluster 配置cluster-autoscaler --cloud-providerclusterapi拓扑二运行在工作负载集群中管理集群独立工作负载集群内使用服务账户另为管理集群指定 kubeconfig-------- ------------ | mgmt | | workload | | | cloud-config | ---------- | | |------------- autoscaler | -------- ------------cluster-autoscaler --cloud-providerclusterapi \ --cloud-config/mnt/kubeconfig拓扑三运行在管理集群中工作负载集群独立管理集群内使用服务账户另为工作负载集群指定 kubeconfig。由于--cloud-config缺省时会回退到--kubeconfig此时必须追加--clusterapi-cloud-config-authoritative让 autoscaler 不要用--kubeconfig覆盖管理集群连接------------ ---------- | mgmt | | workload | | ---------- | kubeconfig | | | autoscaler ------------| | ------------ ----------cluster-autoscaler --cloud-providerclusterapi \ --kubeconfig/mnt/kubeconfig \ --clusterapi-cloud-config-authoritative拓扑四运行在任何位置管理集群与工作负载集群使用独立 kubeconfig两个集群均显式指定 kubeconfig最通用的部署形态-------- ------------ ---------- | mgmt | | ? | | workload | | | cloud-config | ---------- | kubeconfig | | | |-------------- autoscaler ------------| | -------- ------------ ----------cluster-autoscaler --cloud-providerclusterapi \ --kubeconfig/mnt/workload.kubeconfig \ --cloud-config/mnt/management.kubeconfig拓扑五运行在任何位置管理集群与工作负载集群共用一份 kubeconfig两集群可访问性一致时只需提供一份 kubeconfig--------------- ------------ | mgmt/workload | | ? | | | kubeconfig | ---------- | | |------------ autoscaler | --------------- ------------cluster-autoscaler --cloud-providerclusterapi \ --kubeconfig/mnt/workload.kubeconfig双客户端实现的源码印证在 clusterapi_controller.go 中machineController同时持有workloadInformerFactorykube informerWatch Node与managementInformerFactorydynamic informerWatch Machine 系列 CRD外加managementClientdynamic client与managementScaleClientscale client用于读写machinedeployments/scale子资源。这正是看 Node/Pod 用工作负载集群、扩缩 Machine 用管理集群职责分离的直接体现。启用自动伸缩min/max 注解要让 Cluster API 管理的节点组进入自动伸缩需要为资源打注解。注解必须添加到MachineSet、MachineDeployment或MachinePool上取决于你使用的 Cluster API 机制注解含义cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size节点组最少节点数autoscaler 不会缩到该值以下。注意除非启用从零扩容见下一节否则不会缩到 0也不会从 0 扩容cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size节点组最多节点数autoscaler 不会扩到该值以上autoscaler 会监控同时包含这两个注解的MachineSet/MachineDeployment/MachinePool。源码中的注解键并非硬编码字符串而是由getCAPIGroup()动态拼接生成clusterapi_utils.go因此CAPI_GROUP环境变量会同步影响注解键详见后文。边界校验逻辑clusterapi_utils.gominSize/maxSize必须能解析为整数strconv.Atoi且满足0 minSize maxSize否则返回errInvalidMinAnnotation/errInvalidMaxAnnotation该资源不会被识别为有效节点组。注意Cluster Autoscaler不强制执行节点组规模。若节点组实际节点数低于 min 或高于 maxautoscaler 不会主动修正。如需强制恢复最小规模可开启--enforce-node-group-min-size标志详见 Cluster Autoscaler FAQ。注意MachinePool支持要求底层基础设施提供商实现了 MachinePool Machines 特性。从源码看控制器会把这些资源的多种状态归一化为标准 providerID 进行追踪clusterapi_controller.gopending-machine-尚无status.nodeRef的未就绪机器、deleting-machine-带删除时间戳的机器、failed-machine-status.phaseFailed且带failureMessage的机器都会被特殊编码确保失败或正在删除的机器不会被计入节点组规模也不会被当作活跃节点参与缩容决策。从零扩容Scale from Zero支持Cluster API 社区通过 Opt-in Autoscaling from Zero enhancement 定义了基础设施提供商可选实现从零扩容能力的机制各提供商可自行支持但并不强制。若你的提供商不支持仍可通过capacity 注解启用该特性。capacity 注解应加在 MachineDeployment 上不使用 MachineDeployment 时加在 MachineSet 上不必两者都加用于告知 autoscaler 该节点组内节点的规格。CPU 与内存注解为最低必需项且应与基础设施实际创建的节点容量一致。注意从零扩容注解会覆盖Cluster API 提供商从基础设施机器模板中提供的容量信息。两者同时存在时注解优先。例如若 MachineDeployment 创建的节点具有 16000m CPU、128G 内存、100Gi 临时磁盘、2 块 NVidia GPU、支持 200 个 maxPods则注解如下apiVersion: cluster.x-k8s.io/v1alpha4 kind: MachineDeployment metadata: annotations: cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: 5 cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: 0 capacity.cluster-autoscaler.kubernetes.io/memory: 128G capacity.cluster-autoscaler.kubernetes.io/cpu: 16 capacity.cluster-autoscaler.kubernetes.io/ephemeral-disk: 100Gi capacity.cluster-autoscaler.kubernetes.io/maxPods: 200 // Device Plugin // Comment out the below annotation if DRA is enabled on your cluster running k8s v1.32.0 or greater capacity.cluster-autoscaler.kubernetes.io/gpu-type: nvidia.com/gpu // Dynamic Resource Allocation (DRA) // Uncomment the below annotation if DRA is enabled on your cluster running k8s v1.32.0 or greater // capacity.cluster-autoscaler.kubernetes.io/dra-driver: gpu.nvidia.com // Common in Device Plugin and DRA capacity.cluster-autoscaler.kubernetes.io/gpu-count: 2全部容量注解键均可在 clusterapi_utils.go 中找到常量定义汇总如下注解键说明解析方式capacity.cluster-autoscaler.kubernetes.io/cpuCPU 容量resource.ParseQuantitycapacity.cluster-autoscaler.kubernetes.io/memory内存容量resource.ParseQuantitycapacity.cluster-autoscaler.kubernetes.io/ephemeral-disk临时磁盘容量resource.ParseQuantitycapacity.cluster-autoscaler.kubernetes.io/maxPods最大 Pod 数整数解析缺省默认110capacity.cluster-autoscaler.kubernetes.io/gpu-typeGPU 类型Device Plugin 路径字符串capacity.cluster-autoscaler.kubernetes.io/dra-driverDRA 驱动DRA 路径k8s v1.32.0字符串capacity.cluster-autoscaler.kubernetes.io/gpu-countGPU 数量两种路径通用整数解析capacity.cluster-autoscaler.kubernetes.io/labels预定义节点标签逗号分隔keyvaluecapacity.cluster-autoscaler.kubernetes.io/taints预定义节点污点逗号分隔keyvalue:Effectcapacity.cluster-autoscaler.kubernetes.io/csi-driver预定义 CSI 驱动与卷上限逗号分隔drivervolume-limit注意maxPods注解缺省时默认值为110该值源自 Kubernetes 大规模集群最佳实践 Considerations for large clusters。注意GPU 相关注解需在gpu-typeDevice Plugin与dra-driverDRA二者中选择其一gpu-count在两种路径下通用。源码中parseGPUType与parseDRADriverclusterapi_utils.go分别读取对应键而parseGPUCount通过parseIntKey读取整数。从零扩容能力的判定CanScaleFromZero()clusterapi_unstructured.go要求节点组能够提供 CPU 与内存容量信息缺省来自注解若提供商支持也可来自基础设施机器模板两者齐备才允许从 0 扩容。从零扩容的 RBAC 变更若你使用 Cluster API 基础设施提供商提供的 opt-in 从零扩容支持需要把基础设施机器模板类型加入 autoscaler 部署所关联 ServiceAccount 的角色权限中必须具备对基础设施机器模板的get、list、watch权限。例如使用 Kubemark 提供商时需要如下权限rules: - apiGroups: - infrastructure.cluster.x-k8s.io resources: - kubemarkmachinetemplates verbs: - get - list - watch对应的源码实现在 getInfrastructureResource控制器会按infrastructureRef指向的 GVR 动态创建 informer 并等待缓存同步再从中读取机器模板的status.capacity等信息。因此权限缺失时读取模板会失败进而无法利用提供商提供的容量数据此时仍可依赖注解。从零扩容节点的预定义标签与污点从零扩容节点的污点可通过两种方式配置按优先级从高到低排列方式一capacity 注解最高优先级capacity.cluster-autoscaler.kubernetes.io/taints注解接受逗号分隔的污点列表始终优先于可伸缩资源 spec 中定义的污点apiVersion: cluster.x-k8s.io/v1alpha4 kind: MachineDeployment metadata: annotations: cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: 5 cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: 0 capacity.cluster-autoscaler.kubernetes.io/memory: 128G capacity.cluster-autoscaler.kubernetes.io/cpu: 16 capacity.cluster-autoscaler.kubernetes.io/labels: key1value1,key2value2 capacity.cluster-autoscaler.kubernetes.io/taints: key1value1:NoSchedule,key2value2:NoExecute方式二可伸缩资源 spec需要 CAPI v1.12 且启用MachineTaintPropagation特性门控启用MachineTaintPropagation特性门控后autoscaler 会直接读取 MachineSet / MachineDeployment / MachinePool 的spec.template.spec.taints。若注解污点与 spec 污点具有相同的 key 与 effect注解值优先apiVersion: cluster.x-k8s.io/v1beta2 kind: MachineDeployment metadata: annotations: cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: 5 cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: 0 capacity.cluster-autoscaler.kubernetes.io/memory: 128G capacity.cluster-autoscaler.kubernetes.io/cpu: 16 # 覆盖下方 spec 中定义的 dedicated 污点值 capacity.cluster-autoscaler.kubernetes.io/taints: dedicatedgpu-override:NoSchedule spec: template: spec: taints: - key: dedicated value: gpu effect: NoSchedule propagation: Always - key: node-setup value: true effect: NoSchedule propagation: Always注意对于标签capacity 注解值与可伸缩 Cluster API 资源传播的标签合并同一标签键在两者中均定义时注解值优先。详见 Cluster API Book 中关于 Metadata propagation 的章节。对于污点注解污点与 spec 污点合并key 与 effect 均相同时注解值优先没有对应注解污点的 spec 污点会被保留。合并与优先级实现的源码依据在 clusterapi_unstructured.go 中Labels()先读取spec.template.spec.metadata.labels经getManagedNodeLabelsFromLabels过滤出 Cluster API 托管标签node-role.kubernetes.io、node-restriction.kubernetes.io、node.cluster.x-k8s.io三个域见 clusterapi_utils.go再与注解标签用JoinStringMaps合并后者覆盖前者Taints()先解析spec.template.spec.taints再处理注解污点遍历已有污点若 key 与 effect 匹配则替换该污点否则追加与文档描述的合并语义完全一致这些逻辑在 clusterapi_nodegroup_test.go 中有对应测试如 spec taints 与 annotation taints 同时定义时注解优先 用例。从零扩容节点的预定义 CSI 驱动信息可选的capacity.cluster-autoscaler.kubernetes.io/csi-driver注解以驱动名卷上限的逗号分隔列表形式告知 autoscaler 从零扩容节点上会安装哪些 CSI 驱动及其卷上限apiVersion: cluster.x-k8s.io/v1alpha4 kind: MachineDeployment metadata: annotations: cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: 5 cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: 0 capacity.cluster-autoscaler.kubernetes.io/memory: 128G capacity.cluster-autoscaler.kubernetes.io/cpu: 16 capacity.cluster-autoscaler.kubernetes.io/csi-driver: ebs.csi.aws.com25,efs.csi.aws.com16注意通过 capacity 注解提供的 CSI 驱动信息指定了从零扩容节点上将安装哪些 CSI 驱动及其各自的卷上限。格式为driver-namevolume-limit多个驱动以逗号分隔。每节点组自动伸缩选项可以在每个节点组MachineDeployment / MachinePool / MachineSet上通过带公共前缀cluster.x-k8s.io/autoscaling-options-的注解覆盖全局命令行参数的默认值apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: annotations: # 覆盖该 MachineDeployment 的 --scale-down-utilization-threshold 全局值 cluster.x-k8s.io/autoscaling-options-scaledownutilizationthreshold: 0.5 # 覆盖该 MachineDeployment 的 --scale-down-gpu-utilization-threshold 全局值 cluster.x-k8s.io/autoscaling-options-scaledowngpuutilizationthreshold: 0.5 # 覆盖该 MachineDeployment 的 --scale-down-unneeded-time 全局值 cluster.x-k8s.io/autoscaling-options-scaledownunneededtime: 10m0s # 覆盖该 MachineDeployment 的 --scale-down-unready-time 全局值 cluster.x-k8s.io/autoscaling-options-scaledownunreadytime: 20m0s # 覆盖该 MachineDeployment 的 --max-node-provision-time 全局值 cluster.x-k8s.io/autoscaling-options-maxnodeprovisiontime: 20m0s # 覆盖该 MachineDeployment 的 --max-node-startup-time 全局值 cluster.x-k8s.io/autoscaling-options-maxnodestartuptime: 20m0s其解析实现位于 autoscalingOptions遍历注解凡键以getNodeGroupAutoscalingOptionsKeyPrefix()即CAPI_GROUP/autoscaling-options-开头的取出前缀后的资源名作为 key注解值统一转为小写后放入返回的 options 映射供核心 autoscaler 在该节点组上按选项生效。单架构集群的 CPU 架构感知非 amd64 的单架构集群若使用从零扩容应设置环境变量CAPI_SCALE_ZERO_DEFAULT_ARCH指定节点组模板默认采用的节点架构。若不设置默认值为amd64此时节点组模板的架构可能与实际节点不符——尤其是当触发扩容的工作负载使用节点亲和node affinity谓词检查节点架构时会导致扩出来的模板无法匹配调度要求。源码对应实现为 GetDefaultScaleFromZeroArchitecture从环境变量读取架构字符串经SystemArchitectureFromString映射为amd64/arm64/ppc64le/s390xclusterapi_utils.go无法识别时回退到amd64并输出错误日志。指定自定义资源组默认情况下Cluster API 云提供商消费的所有 Kubernetes 资源均使用cluster.x-k8s.io组版本动态获取。在测试或原型等场景下可通过环境变量CAPI_GROUP更换资源组。设置CAPI_GROUP会连带改变以下键最小/最大节点数注解键Node 上的 machine 注解键group/machine机器删除注解键group/delete-machine集群名标签group/cluster-name。例如设置CAPI_GROUPtest.k8s.io后项目默认键变更后键最小规模注解cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-sizetest.k8s.io/cluster-api-autoscaler-node-group-min-sizeNode 上的 machine 注解cluster.x-k8s.io/machinetest.k8s.io/machine机器删除注解cluster.x-k8s.io/delete-machinetest.k8s.io/delete-machine集群名标签cluster.x-k8s.io/cluster-nametest.k8s.io/cluster-name源码中getCAPIGroup()clusterapi_controller.go读取环境变量缺省返回cluster.x-k8s.io其余注解键、标签键全部经由getNodeGroupMinSizeAnnotationKey/getMachineAnnotationKey/getMachineDeleteAnnotationKey/getClusterNameAnnotationKey/getClusterNameLabel等函数以该组名动态拼装clusterapi_utils.go因此组名变化时这些键会自动同步。指定自定义资源版本默认情况下autoscaler 通过 discovery 客户端查询 Cluster API 组的首选版本preferred version。例如cluster.x-k8s.io组同时存在v1alpha1与v1beta1版本的 MachineDeployments 时autoscaler 会选择v1beta1。某些场景调试、或部署了多个 API 版本需要锁定特定版本下可设置环境变量CAPI_VERSION强制指定版本。与CAPI_GROUP不同CAPI_VERSION没有默认值不设置时行为即上述自动选择首选版本。实现细节clusterapi_controller.gogetCAPIGroupPreferredVersion优先返回CAPI_VERSION环境变量否则调用getAPIGroupPreferredVersion遍历ServerGroups()结果返回目标组的PreferredVersion。控制器随后用该组/版本构造schema.GroupVersionResource并通过groupVersionHasResource探测 MachineDeployment、MachinePool 资源在该组版本下是否可用不可用时优雅降级仅监控 Machine/MachineSet。示例部署清单与权限说明仓库提供了可直接部署的示例 manifest它会创建运行 autoscaler 的 Deployment。通过envsubst传入命名空间、镜像与标签变量后即可应用export AUTOSCALER_NSkube-system export AUTOSCALER_IMAGEregistry.k8s.io/autoscaling/cluster-autoscaler:v1.29.0 envsubst examples/deployment.yaml | kubectl apply -f-该清单的核心结构包括Deployment容器 args 仅含--cloud-providerclusterapi默认使用 in-cluster 配置对应上文拓扑一并带node-role.kubernetes.io/control-plane的 NoSchedule 容忍便于部署到控制平面节点ServiceAccount 两个ClusterRoleBindingcluster-autoscaler-workloadClusterRole面向工作负载集群涵盖 Nodeget/list/update/watch、Pod、PVC/PV、Service、pods/eviction缩容驱逐、PDB、CSI 相关资源csinodes/storageclasses/csidrivers/csistoragecapacities/volumeattachments、Lease选主、以及resource.k8s.io下的 resourceslices/deviceclasses/resourceclaimsDRA 支持cluster-autoscaler-managementClusterRole面向管理集群对cluster.x-k8s.io组的machinedeployments含machinedeployments/scale子资源、machines、machinesets、machinepools具备 get/list/update/watch/patch 权限。权限说明cluster-autoscaler-management角色访问 Cluster API 可伸缩资源时被限定为ClusterRole这在某些环境如多租户环境中并非理想选择。此类场景下建议将其收敛为映射到特定命名空间的Role。与 ClusterClass 和 Managed Topologies 配合使用 ClusterClass 与 Managed Topologies 的用户需要注意Cluster Topology 控制器会依据spec.topology.workers.machineDeployments[].replicas字段设置 MachineDeployment 的副本数。为了使用 Cluster Autoscaler该字段必须留空不设置apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: my-cluster namespace: default spec: clusterNetwork: services: cidrBlocks: [10.128.0.0/12] pods: cidrBlocks: [192.168.0.0/16] serviceDomain: cluster.local topology: class: quick-start version: v1.24.0 controlPlane: replicas: 1 workers: machineDeployments: - class: default-worker name: linux ## replicas field is not set. ## replicas: 1Cluster 定义中不设置replicas字段后即可按前文启用自动伸缩一节的方式为对应 MachineDeployment 添加注解来启用自动伸缩。GPU 实例注意事项与其他云提供商一致如果提供 GPU 资源的设备插件device plugin需要一定时间才能把 GPU 资源通告给集群可能导致 Cluster Autoscaler 不必要的多次扩容。为避免此问题可在 GPU 节点上配置kubelet通过--node-labels标志在节点加入集群前打上标签。CAPI 云提供商使用的标签格式为cluster-api/acceleratorgpu-typegpu-type可以是任意值。特别重要如果你使用--gpu-total标志限制集群中的 GPU 资源总数那么gpu-type值必须与命令行标志和节点标签中的取值保持一致。配置错误可能导致 autoscaler 创建过多 GPU 资源。例如使用命令行标志--gpu-totalgfx-hardware:1:2将gfx-hardware资源限制为最少 1、最多 2则 kubelet 节点标签应为--node-labelscluster-api/acceleratorgfx-hardware从源码结构看GPU 相关能力贯穿两条链路Device Plugin 路径依赖capacity.../gpu-type注解配合cluster-api/accelerator节点标签DRA 路径k8s v1.32.0则通过capacity.../dra-driver注解声明驱动二者与gpu-count注解共同决定从零扩容时的 GPU 容量建模。相似节点组均衡注意事项--balance-similar-node-groups标志启用的均衡相似节点组功能非常强大且广受欢迎启用后Cluster Autoscaler 会以均衡的方式在相似节点组间分摊新节点的创建。在 Cluster API 中节点组直接对应与节点关联的可伸缩资源通常是 MachineDeployment 与 MachineSet。要被判定为相似这些可伸缩资源创建出的节点必须具备相同的容量、标签与污点。为辅助判定可配合--balancing-ignore-label与--balancing-label标志。关于均衡相似节点组及可用选项的完整讨论见 Cluster Autoscaler FAQ。重要由于 Cluster API 可对接众多云提供商务必配置均衡忽略标签把节点上用于承载区域zonal信息的提供商专属标签排除掉。Cluster API 实现不预设任何需要忽略的标签除公认的 Kubernetes 标准标签外因此用户必须显式配置忽略那些节点间有差异、但不影响节点行为或大小的标签例如两个 MachineDeployment 除部署区域外完全一致的情形。Cluster API 社区决定不在 Cluster Autoscaler 中携带云提供商专属标签以降低提供商之间标签冲突的可能性同时社区一致推荐以--balancing-ignore-label标志作为首选部署方式减少新增/更新提供商时对 Cluster Autoscaler 的维护负担。下表列出部分常见云提供商用于标记节点区域/可用区信息的标签供在这些基础设施上部署的用户参考云提供商需要忽略的标签说明Alibaba Cloudtopology.diskplugin.csi.alibabacloud.com/zoneAlibaba Cloud CSI 驱动用作 PV 节点亲和的目标AWSalpha.eksctl.io/instance-ideksctl用于标识实例AWSalpha.eksctl.io/nodegroup-nameeksctl用于标识节点组名AWSeks.amazonaws.com/nodegroupEKS 用于标识节点组AWSk8s.amazonaws.com/eniConfigAWS CNI 用于自定义网络AWSlifecycleAWS 用于标识 Spot 实例AWStopology.ebs.csi.aws.com/zoneAWS EBS CSI 驱动用作 PV 节点亲和的目标Azuretopology.disk.csi.azure.com/zoneAzure Disk CSI 驱动用作拓扑键Azureagentpool旧版标签用于标识节点所属的 Azure 节点池Azurekubernetes.azure.com/agentpoolAKS 用于标识节点所属的节点池GCEtopology.gke.io/zone用于标识节点所在区域IBM Cloudibm-cloud.kubernetes.io/worker-idIBM Cloud Cloud Controller Manager 用于标识节点IBM Cloudvpc-block-csi-driver-labelsIBM Cloud CSI 驱动用作 PV 节点亲和的目标IBM Cloudibm-cloud.kubernetes.io/vpc-instance-idIBM Cloud 使用 VPC 时用于标识实例关键源码索引如需深入阅读实现以下文件覆盖本文全部主题clusterapi_autodiscovery.go自动发现配置解析与过滤含对应测试 clusterapi_autodiscovery_test.goclusterapi_controller.go双集群 informer、节点组枚举、providerID 状态归一化、机器模板读取clusterapi_utils.gocapacity 注解常量、min/max 校验、CAPI_GROUP/CAPI_VERSION/CAPI_SCALE_ZERO_DEFAULT_ARCH 处理、动态注解键生成clusterapi_unstructured.goLabels/Taints 合并优先级、容量建模、从零扩容能力判定clusterapi_nodegroup.go 与 clusterapi_nodegroup_test.go节点组对象实现与注解优先级、CSI 驱动的测试用例examples/deployment.yaml可直接envsubst后应用的完整部署清单。【免费下载链接】autoscalerAutoscaling components for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/au/autoscaler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表