当Kubernetes集群应用流量突然增加,导致Pod无法正常调度时,集群的自动扩容就显得尤为关键。Cluster Autoscaler(CA)就像是集群的“智能管家”,它能够自动感知这种情况,并调用云平台的API来扩充节点资源,保证应用持续稳定地提供服务。在这个过程中,有一系列参数会对扩容行为产生影响,合理设置这些参数,能让扩容过程既高效又稳定。接下来,咱们就详细了解一下这些关键参数,通过实际配置示例掌握它们的用法,并谈谈使用过程中的注意事项。

一、常用扩容参数

(一)--nodes

这个参数主要用于设定节点数量的上下限,同时指定对应的Auto Scaling Group(ASG)名称。比如,当你输入--nodes=1:10:my-asg时,就相当于给“智能管家”CA下了明确指令:要保证集群中最少有1个节点,最多可以扩充到10个节点,并且这些节点都来自名为my-asg的资源组。这就好比管理一个团队,你规定团队成员最少不能少于1人,最多10人,而且新成员只能从特定部门(my-asg)选拔。

(二)--scale-down-delay-after-add

新节点加入集群后,为了确保它能稳定运行,不会因为一些短暂的不稳定因素就被误操作,我们可以设置这个参数。例如,当设置为--scale-down-delay-after-add=10m时,意味着新节点上线后,CA会等待10分钟再去评估是否要进行缩容操作。这就像是新员工入职后,给他10分钟时间熟悉环境,再决定后续的人员调配安排,避免出现“刚入职就离职”的情况。在日志中,你可能会看到类似I0912 10:00:00.123456 1 scale_down.go:321] Waiting 10m after adding node node-123 before considering scale down.的记录,这就是CA在执行等待操作的提示。

(三)--scale-down-unneeded-time

它的作用是判断某个节点是否属于“闲置”状态,也就是在一段时间内资源利用率较低,没有被充分利用。假设设置为--scale-down-unneeded-time=10m,如果某个节点连续10分钟都处于空闲状态,CA就会认为这个节点暂时是“多余”的。这就如同办公室里的会议室,如果连续10分钟都没人使用,就可以考虑关闭设备节省资源。日志中可能会出现I0912 10:05:00.456789 1 scale_down.go:345] Node node-456 has been unneeded for over 10m.,表示node-456这个节点已经空闲超过10分钟了。

(四)--scale-down-delay-after-failure

在进行缩容操作时,如果因为某些原因(比如关键Pod无法顺利迁移)导致缩容失败,CA不会立刻再次尝试,而是等待一段时间。当设置--scale-down-delay-after-failure=5m时,CA会在缩容失败后暂停5分钟,再重新尝试缩容。这就好比考试没考好,需要休息5分钟调整状态后再继续努力。在实际运行中,你可能会看到I0912 10:10:00.789012 1 scale_down.go:370] Scale down attempt failed; will retry after 5m delay.这样的日志记录,表明CA在等待5分钟后会重新尝试缩容。

(五)--skip-nodes-with-local-storage

有些节点可能存储了重要的本地数据,如果在缩容时误删这些节点,就会导致数据丢失。将这个参数设置为--skip-nodes-with-local-storage=true,CA在执行缩容操作时,就会跳过那些带有本地存储的节点。这就好比办公室里有人负责保管重要文件,不能轻易让他们离开,以免文件丢失。

(六)--balance-similar-node-groups

启用这个参数后,CA会在相似的节点组之间平衡负载,避免出现某些节点组资源过度使用,而另一些节点组资源闲置的情况。当你输入--balance-similar-node-groups,就相当于告诉CA要合理分配工作,确保不同节点组之间的负载均衡。这类似于公司内部合理分配工作任务,避免某个部门忙得不可开交,而另一个部门却无所事事。

二、配置实例与使用演示

下面以适用于AWS环境的集群伸缩配置为例,详细介绍如何进行部署和验证。

(一)示例配置文件:cluster-autoscaler.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: cluster-autoscaler # 集群伸缩器部署名称 namespace: kube-system # 建议部署在 kube-system 中 labels: app: cluster-autoscaler spec: replicas: 1 # 仅部署一个实例 selector: matchLabels: app: cluster-autoscaler template: metadata: labels: app: cluster-autoscaler spec: serviceAccountName: cluster-autoscaler # 需要拥有调用 AWS API 的权限 containers: - name: cluster-autoscaler image: k8s.gcr.io/cluster-autoscaler:v1.21.0 command: - ./cluster-autoscaler - --cloud-provider=aws # 设置云提供商为 AWS - --nodes=1:10:my-asg # 节点范围:1到10;ASG 名称为 my-asg - --scale-down-delay-after-add=10m # 新节点上线后等待10分钟再进行缩容判断 - --scale-down-unneeded-time=10m # 节点空闲10分钟后可被认定为不需要 - --scale-down-delay-after-failure=5m # 缩容失败后等待5分钟再重试 - --skip-nodes-with-local-storage=true # 遇到本地存储节点则跳过,不进行缩容 - --balance-similar-node-groups # 启用同类节点组平衡机制 resources: limits: cpu: 100m memory: 300Mi requests: cpu: 100m memory: 300Mi 

在这个配置文件中,我们定义了集群伸缩器的基本信息,包括部署名称、命名空间、副本数量等。在容器配置部分,指定了使用的镜像,以及一系列关键的扩容参数。通过这些配置,我们告诉CA要使用AWS云服务,节点数量在1到10之间动态调整,同时设置了新节点等待时间、缩容判断时间、缩容失败重试等待时间等,还启用了跳过本地存储节点和平衡同类节点组的功能。

(二)部署步骤与演示

  1. 保存并部署配置文件:将上述YAML内容保存为cluster-autoscaler.yaml文件,然后在命令行中执行kubectl apply -f cluster-autoscaler.yaml命令。这个命令的作用是将配置文件部署到Kubernetes集群中,正式启用Cluster Autoscaler服务。就像是把一份详细的工作计划交给团队执行,让CA开始按照我们的设定工作。
  2. 查看部署状态:部署完成后,可以通过执行kubectl get pods -n kube-system -l app=cluster-autoscaler命令来查看Pod的状态。如果看到类似cluster-autoscaler-5d4c7f6d88-7kxzb 1/1 Running 0 2m的输出,这表明CA部署成功,Pod正在正常运行。这就好比检查团队成员是否已经开始正常工作,看到这个输出说明CA已经在集群中“上岗”了。
  3. 查看日志验证参数效果:运行kubectl logs -n kube-system deployment/cluster-autoscaler命令查看日志。日志中如果出现I0912 10:00:00.123456 1 scale_down.go:321] Waiting 10m after adding node node-123 before considering scale down.,说明新节点添加后,CA正在按照我们设置的--scale-down-delay-after-add参数等待10分钟再考虑缩容;出现I0912 10:05:00.456789 1 scale_down.go:345] Node node-456 has been unneeded for over 10m.,表明--scale-down-unneeded-time参数生效,node-456节点已经空闲超过10分钟;而I0912 10:10:00.789012 1 scale_down.go:370] Scale down attempt failed; will retry after 5m delay.则说明缩容失败后,CA会根据--scale-down-delay-after-failure参数等待5分钟后重试。通过查看这些日志,我们可以验证各个参数是否按照预期工作。

三、使用过程中的注意事项

(一)合理设置节点范围

--nodes参数的最小值和最大值要根据业务实际需求来设定。如果最小值设置过低,可能在业务高峰期因资源不足导致应用无法正常运行;最大值设置过高,则会造成资源浪费,增加成本。所以,要综合考虑业务的流量变化和资源需求,找到一个合适的平衡点。

(二)防止频繁扩缩容

合理调整--scale-down-delay-after-add--scale-down-delay-after-failure这两个参数很重要。如果新节点上线后等待时间过短,可能会因为节点还未稳定就被误缩容;缩容失败后如果立刻重试,可能会引发一系列问题,影响系统的稳定性。因此,要确保新节点有足够的时间稳定运行,同时在缩容失败后合理等待一段时间再重试。

(三)注意本地存储节点

如果集群中存在使用本地存储的节点,为了避免数据丢失风险,建议将--skip-nodes-with-local-storage设置为true。这样在进行缩容操作时,CA就会自动跳过这些节点,保护存储在本地的重要数据。

(四)观察日志及时调整

部署完成后,要密切关注日志输出。如果发现扩缩容行为不符合预期,比如频繁扩容或者缩容不及时,就要根据日志信息及时调整相关参数。通过不断调整,找到最适合业务的参数配置,让集群能够灵活应对各种情况。

四、总结

通过这篇文章,我们全面了解了Kubernetes集群伸缩过程中的关键参数及其作用,还通过实际的配置示例和使用演示掌握了部署和验证方法,同时也知道了在使用过程中的注意事项。这些参数对于构建一个灵活、稳定的自动扩容机制至关重要,希望大家在实际工作中能够熟练运用这些知识,更加从容地管理Kubernetes集群,确保服务稳定运行,有效利用资源。如果在实践过程中有任何心得或者遇到问题,欢迎在评论区交流分享。