K8S从懵圈到熟练 – 集群伸缩原理

简介: 阿里云K8S集群的一个重要特性,是集群的节点可以动态的增加或减少。有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用率降低的时候,释放节点以节省费用。 这篇文章,我们讨论阿里云K8S集群扩容与缩容的实现原理。

阿里云K8S集群的一个重要特性,是集群的节点可以动态的增加或减少。有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用率降低的时候,释放节点以节省费用。

这篇文章,我们讨论阿里云K8S集群扩容与缩容的实现原理。理解实现原理,在遇到问题的时候,我们就可以高效地排查并定位原因。我们的讨论基于当前的1.12.6版本。

节点增加原理

阿里云K8S集群可以给集群增加节点的方式有,添加已有节点,集群扩容,和自动伸缩。其中,添加已有节点又可分为手动添加已有节点和自动添加已有节点。节点的增加涉及到的组件有,节点准备,弹性伸缩(ESS),管控,Cluster Autoscaler以及调度器。

a

手动添加已有节点

节点准备,其实就是把一个普通的ECS实例,安装配置成为一个K8S集群节点的过程。这个过程仅靠一条命令就可以完成。这条命令使用curl下载attach_node.sh脚本,然后以openapi token为参数,在ECS上运行。

curl http:///public/pkg/run/attach//attach_node.sh | bash -s -- --openapi-token

这里token是一个对的key,而value是当前集群的基本信息。阿里云K8S集群的管控,在接到手动添加已有节点请求的时候,会生成这个对,并把key作为token返回给用户。

这个token(key)存在的价值,是其可以让attach_node.sh脚本,以匿名身份在ECS上索引到集群的基本信息(value),而这些基本信息,对节点准备至关重要。

总体上来说,节点准备就做两件事情,读和写。读即数据收集,写即节点配置。

b

这里的读写过程,绝大部分都很基础,大家可以通过阅读脚本来了解细节。唯一需要特别说明的是,kubeadm join把节点注册到Master的过程。此过程需要新加节点和集群Master之间建立互信。

一边,新加节点从管控处获取的bootstrap token(与openapi token不同,此token是value的一部分内容),实际上是管控通过可信的途径从集群Master上获取的。新加节点使用这个bootstrap token连接Master,Master则可通过验证这个bootstrap token来建立对新加节点的信任。

另一边,新加节点以匿名身份从Master kube-public命名空间中获取集群cluster-info,cluster-info包括集群CA证书,和使用集群bootstrap token对这个CA做的签名。新加节点使用从管控处获取的bootstrap token,对CA生成b新的签名,然后将此签名与cluster-info内签名做对比,如果两个签名一致,则说明cluster-info和bootstrap token来自同一集群。新加节点因为信任管控,所以建立对Master的信任。

c

自动添加已有节点

自动添加已有节点,不需要人为拷贝黏贴脚本到ECS命令行来完成节点准备的过程。管控使用了ECS userdata的特性,把类似以上节点准备的脚本,写入ECS userdata,然后重启ECS并更换系统盘。当ECS重启之后,会自动执行Userdata里边的脚本,来完成节点添加的过程。这部分内容,大家其实可以通过查看节点userdata来确认。

!/bin/bash

mkdir -p /var/log/acs

curl http:///public/pkg/run/attach/1.12.6-aliyun.1/attach_node.sh | bash -s -- --docker-version --token --endpoint --cluster-dns > /var/log/acs/init.log

这里我们看到,attach_node.sh的参数,与前一节的参数有很大的不同。其实这里的参数,都是前一节value的内容,即管控创建并维护的集群基本信息。自动添加已有节点省略了通过key获取value的过程。

集群扩容

集群扩容与以上添加已有节点不同,此功能针对需要新购节点的情形。集群扩容的实现,在添加已有节点的基础上,引入了弹性伸缩ESS组件。ESS组件负责从无到有的过程,而剩下的过程与添加已有节点类似,即依靠ECS userdata脚本来完成节点准备。下图是管控通过ESS从无到有创建ECS的过程。

d

自动伸缩

前边三种方式是需要人为干预的伸缩方式,而自动伸缩的本质不同,是它可以在业务需求量增加的时候,自动创建ECS实例并加入集群。为了实现自动化,这里引入了另外一个组件Cluster Autoscaler。集群自动伸缩包括两个独立的过程。

e

其中第一个过程,主要用来配置节点的规格属性,包括设置节点的用户数据。这个用户数据和手动添加已有节点的脚本类似,不同的地方在于,其针对自动伸缩这种场景,增加了一些专门的标记。attach_node.sh脚本会根据这些标记,来设置节点的属性。

!/bin/sh

curl http:///public/pkg/run/attach/1.12.6-aliyun.1/attach_node.sh | bash -s -- --openapi-token --ess true --labels k8s.io/cluster-autoscaler=true,workload_type=cpu,k8s.aliyun.com=true

而第二个过程,是实现自动增加节点的关键。这里引入了一个新的组件Autoscaler,它以Pod的形式运行在K8S集群中。理论上来说,我们可以把这个组件当做一个控制器。因为它的作用与控制器类似,基本上还是监听Pod状态,以便在Pod因为节点资源不足而不能被调度的时,去修改ESS的伸缩规则来增加新的节点。

这里有一个知识点,集群调度器衡量资源是否充足的标准,是“预订率”,而不是“使用率”。这两者的差别,类似酒店房价预订率和实际入住率:完全有可能有人预订了酒店,但是并没有实际入住。在开启自动伸缩功能的时候,我们需要设置缩容阈值,就是“预订率”的下线。之所以不需要设置扩容阈值。是因为Autoscaler扩容集群,依靠的是Pod的调度状态:当Pod因为节点资源“预订率”太高无法被调度的时候,Autoscaler就会扩容集群。

节点减少原理

与增加节点不同,集群减少节点的操作只有一个移除节点的入口。但对于用不同方法加入的节点,其各自移除方式略有不同。

首先,通过添加已有节点加入的节点,需要三步去移除:管控通过ECS API清楚ECS userdata;管控通过K8S API从集群中删除节点;管控通过ECS InvokeCommand在ECS上执行kubeadm reset命令清理节点。

其次,通过集群扩容加入的节点,则在上边的基础上,增加了断开ESS和ECS关系的操作。此操作由管控调用ESS API完成。

f

最后,经过Cluster Autoscaler动态增加的节点,则在集群CPU资源“预订率”降低的时候,由Cluster Autoscaler自动移除释放。其触发点是CPU“预订率”,即上图写Metrics的原因。

总结

总体上来说,K8S集群节点的增加与减少,主要涉及四个组件,分别是Cluster Autoscaler,ESS,管控以及节点本身(准备或清理)。根据场景不同,我们需要排查不同的组件。其中Cluster Autoscaler是一个普通的Pod,其日志的获取和其他Pod无异;ESS弹性伸缩有其专门的控制台,我们可以在控制台排查其伸缩配置、伸缩规则等相关子实例日志和状态;而管控的日志,可以通过查看日志功能来查看;最后,对于节点的准备与清理,其实就是排查对应的脚本的执行过程。

以上讲道理居多,希望对大家排查问题有所帮助。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 Linux PHP
CentOS 8 安装图解(一)
CentOS 8 安装图解(一)
3196 0
CentOS 8 安装图解(一)
|
5月前
|
JSON 自然语言处理 前端开发
谷歌深夜发布 Gemini 3.5:多模态能力再升级,开发者该怎么抓住这波机会?
Gemini 3.5 Flash于2026年5月发布,主打原生多模态与实时智能体能力:支持图文音视一体化理解、帧级视频诊断、100万token长上下文,并在编码(76.2%)、Agent任务(83.6%)等实测中超越前代。速度快4倍、成本更低,已免费开放。
|
7月前
|
前端开发 UED 容器
前端组件库Element UI知识点大全(二)
教程来源 https://yyvgt.cn/category/jiulishi.html Element UI栅格系统基于24列,支持Flexbox与CSS Grid双布局,提供响应式断点(xs-lg)、嵌套、对齐控制等功能;配套按钮、表单、表格、弹窗等组件,全面支撑企业级后台界面开发。
|
9月前
|
人工智能 JSON 自然语言处理
Agent Skills 究竟是什么?从玩具到工程化的必经之路
AI应用开发正从“Prompt驱动”迈向“技能驱动”。本文详解Agent Skills标准化实践:以Claude Code Skills为范本,用SKILL.md实现自描述技能;借MCP协议统一多源工具调用,解决兼容与安全难题;结合DeepSeek+OpenAI实战,展现可插拔、可审计、可演进的工业级Agent构建路径。
1595 0
|
10月前
|
存储 缓存 弹性计算
2026年阿里云c7实例(ecs.c7.2xlarge)8核16G 云服务器优惠活动价格及性能测评
2026年阿里云c7实例(ecs.c7.2xlarge)8核16G 云服务器优惠活动价格及性能测评。阿里云c7实例(ecs.c7.2xlarge)8核16G配置,搭配1M-5M可选带宽与40GB ESSD云盘,是面向企业级计算密集型场景的高性能选择。该实例基于第三代神龙云服务器架构,搭载Intel Xeon可扩展处理器,核心优势在于算力强劲、稳定性高且具备企业级安全特性,能精准适配高并发交易、批量计算等对CPU性能要求严苛的业务。以下从价格体系、性能表现、适用场景及选购要点四方面,用通俗语言详细解析。
|
机器学习/深度学习 人工智能 算法
如何像 Manus 交付业务需求-- OneAgent + MCPs 范式
本文探讨了从单一LLM调用到复杂Agent系统的发展历程,重点介绍了OneAgent + MCPs范式。该范式通过结合强大的基础Agent和领域特定的MCP(Microservice Capability Provider)来解决复杂业务需求。文章分析了其在保险科技领域的实践,展示了如何通过Loop框架执行任务,并讨论了当前面临的挑战如to-do质量依赖、状态管理和知识整合深度等问题。同时,提出了包括标准化交互生态、提升系统鲁棒性、优化MCP调用管理及应用强化学习等发展方向。最终展望了这一范式在更多行业落地的潜力,强调了快速搭建领域Agent的重要性,而非追求全知全能的GodAgent模式。
如何像 Manus 交付业务需求-- OneAgent + MCPs 范式
|
9月前
|
人工智能 自然语言处理 监控
2026年零基础部署OpenClaw(Clawdbot)教程及OpenClaw必装Skill+实战案例分享
2026年初,一款名为OpenClaw(原Clawdbot、Moltbot)的AI工具以现象级速度席卷全球科技圈,凭借72小时狂揽60000+GitHub Stars的成绩,如今星标数已突破180000+,不仅让Mac Mini全球卖断货,更带动Cloudflare股价上涨20%。这款被网友亲切称为Molty“小龙虾”的工具,并非普通的聊天机器人,而是真正“长了手的AI助理”——它能通过Telegram、飞书等10+渠道主动执行任务,从网站重建、买车砍价到深夜Bug修复,真正实现“聊天框里办大事”。
2235 4
|
机器学习/深度学习 人工智能 自然语言处理
MCP、LLM与Agent:企业AI实施的新基建设计方案
MCP+LLM+Agent架构通过"大脑-神经网络-手脚"的协同机制,实现从数据贯通到自主执行的智能闭环。本文将深度解析该架构如何将产线排查效率提升5倍、让LLM专业术语识别准确率提升26%,并提供从技术选型到分层落地的实战指南,助力企业打造真正融入业务流的"数字员工"。通过协议标准化、动态规划与自愈执行的三重突破,推动AI从演示场景迈向核心业务深水区。
|
Kubernetes Cloud Native 容器
开放下载!《深入浅出Kubernetes》
一次搞懂6个核心原理吃透基础理论,一次学会6个典型问题的华丽操作
开放下载!《深入浅出Kubernetes》
|
Unix Linux C++
Linux命令size的深入解析
`size`命令在Linux中用于查看目标文件的内存布局,显示代码、数据和BSS段的大小,助力程序优化和资源管理。支持多种输出格式、基数和与其他命令结合使用进行递归分析。常用参数包括设置格式(-A)、基数(-m)、人类可读(-h)和总计(-t)。通过示例展示了如何查看单个或多个文件的大小,并与`find`结合遍历目录。使用时注意文件访问权限和选择合适的输出选项。