Autoscaler 简介
Autoscaler 是 Kubernetes 弹性伸缩的一个组件集合,主要包含三个组件:
- Cluster Autoscaler / CA:用于自动调整 Kubernetes 集群大小,以便所有 Pod 都能被调度到 Node 上运行,且没有多余的无负载 Node。GA 版本已随 Kubernetes 1.8 版本发布。
- Vertical Pod Autoscaler / VPA:用于自动调整在 Kubernetes 中运行的 Pod 请求的 CPU 和内存量的一组组件。目前处于 beta 版本,主要由 3 个部分组成:
- Recommender:监控 Pod 的当前和过去的资源消耗,根据监控数据计算推荐的 CPU 和内存建议值。
- Updater:检查 Pod 是否使用 Recommender 推荐的资源建议值,如果 Pod 没有使用推荐值,Updater 会尝试驱逐该 Pod。
- Admission Plugin:在新的 Pod 上设置 Recommender 推荐的资源建议值。
- Addon Resizer:VPA 的简化版,根据集群中 Node 数量修改资源请求。
CA 工作原理
工作流程
CA 顶层工作流程:
- 每 10s 检查集群是否存在无法被调度的 Pod
- 集群中没有足够资源分配给这些 Pod,CA 会触发云厂商 Provider 执行扩容流程
- 云厂商支持新节点加入集群
- Pod 调度至新加入集群的 Node
核心控制循环
CA 是一个 CLI 应用程序。启动时,它会触发无限控制循环逻辑,每 10 秒执行一次。它会检查集群状态,以决定是否执行扩容或缩容操作。
节点扩容
节点缩容
CA Provider
简介
CA Provider 是 autoscaler CA 组件云厂商适配提供的插件。通过实现 CA 暴露的指定接口,提供节点组管理相关的能力。目前各个云厂商主流实现都是通过对接 NodeGroup 到自家的弹性伸缩服务,利用弹性伸缩的丰富能力(例如支持在多个可用区按照优先级、均衡策略扩缩容、支持多实例规格、支持健康检查等能力),更加快速、稳定地支撑 Kubernetes 集群扩缩容需求。
弹性伸缩提供实例托管服务,集群需要扩容时 CA 通知 NodeGroup(一般等同弹性伸缩服务的伸缩组)扩大实例数,伸缩组收到请求后自动创建 ECS 实例,实例完成创建后自动加入到 Kubernetes 集群中(通常通过 cloud-init 实现),最终实现 Kubernetes 集群的扩缩容操作。
接口设计
对接 CA 需要实现两个接口:
- CloudProvider:CA 直接与云提供商交互的接口。主要通过该接口查询集群的 NodeGroup 列表、集群 Node 和 NodeGroup 归属关系等信息。
- NodeGroup:节点组,通过该接口控制节点扩缩容操作。一般一个 NodeGroup 对标弹性伸缩中的一个伸缩组(Auto Scaling Group)。
Provider 设计
各个云厂商的 Provider 设计主要分 3 层:
- API 层:直接与 CA 对接,包括上述需要实现的 Cloud Provider 和 NodeGroup 接口。
- Service 层:实现 Cloud Provider 和 NodeGroup 相关的业务逻辑。
- Persistence 层:各个云提供商提供的服务,CA 里体现为 OpenAPI 调用。目前 Cloud Service 主要包括弹性伸缩、ECS 相关的 OpenAPI;NodeGroup Cache Manager 主要提供 NodeGroup 的缓存服务,同时实现 Service 层部分查询需求。
构建打包
- 获取代码
Fork the repository in the cloud:
- Visit
https://github.com/kubernetes/autoscaler
- Click Fork button (top right) to establish a cloud-based fork. The code must be checked out as a subdirectory of k8s.io, and not github.com.
mkdir -p $GOPATH/src/k8s.io
cd $GOPATH/src/k8s.io
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler
- 构建
最新的 CA 使用 go1.19 版本,可以使用 gvm 切换不同的 Go 版本。
# 编译
cd cluster-autoscaler && make build
# 构建镜像
docker build -t xxx.com/xx/cluster-autoscaler:[tag] -f Dockerfile.amd64 .
# 上传镜像
docker push xxx.com/xxx/cluster-autoscaler:[tag]