Kubernetes Autoscaler
项目描述
Kubernetes Autoscaler 是一个用于自动调整 Kubernetes 集群大小的工具集合,主要包含以下组件:
- Cluster Autoscaler:根据 Pod 资源需求自动调整集群节点数量
- Vertical Pod Autoscaler:自动调整 Pod 的 CPU 和内存请求量
- Addon Resizer:基于集群节点数量调整 Deployment 的资源请求
项目支持多种云服务提供商,包括 AWS、Azure、GCP 等,并已正式发布 GA 版本。
功能特性
-
智能扩缩容:
- 自动增加节点以容纳无法调度的 Pod
- 自动移除未充分利用的节点
- 支持多种扩缩容策略和算法
-
多组件协作:
- 与 Horizontal Pod Autoscaler 协同工作
- 支持多种资源类型和约束条件
-
灵活配置:
- 可配置扩缩容延迟和阈值
- 支持自定义指标和策略
-
多平台支持:
- 支持主流云服务商
- 提供 Helm charts 简化部署
安装指南
使用 Helm 安装 Cluster Autoscaler
# 添加 Helm 仓库
helm repo add autoscaler https://kubernetes.github.io/autoscaler# 方法1 - 使用自动发现
helm install my-release autoscaler/cluster-autoscaler \--set 'autoDiscovery.clusterName'=<CLUSTER NAME># 方法2 - 手动指定组
helm install my-release autoscaler/cluster-autoscaler \--set "autoscalingGroups[0].name=your-asg-name" \--set "autoscalingGroups[0].maxSize=10" \--set "autoscalingGroups[0].minSize=1"
系统要求
- Kubernetes 1.8+
- Helm 3+
- 云服务商凭证和权限
使用说明
基本使用示例
Addon Resizer 示例配置:
package mainimport ("flag""time""k8s.io/autoscaler/addon-resizer/nanny"
)var (baseCPU = flag.String("cpu", "100m", "基础 CPU 资源需求")cpuPerNode = flag.String("extra-cpu", "10m", "每个节点额外 CPU 量")baseMemory = flag.String("memory", "100Mi", "基础内存资源需求")memoryPerNode = flag.String("extra-memory", "10Mi", "每个节点额外内存量")scaleDownDelay = flag.Duration("scale-down-delay", 10*time.Minute, "缩容延迟时间")
)func main() {flag.Parse()// 初始化并运行 resizer
}
核心代码解析
资源估算器
// Estimator 用于计算推荐和可接受的资源需求范围
type Estimator struct {Resources []ResourceAcceptanceOffset int64 // 可接受范围的百分比偏移RecommendationOffset int64 // 推荐范围的百分比偏移
}// scaleWithNodes 根据节点数量计算资源范围
func (e Estimator) scaleWithNodes(numNodes uint64) *EstimatorResult {return &EstimatorResult{RecommendedRange: nodesAndOffsetToRange(numNodes, e.RecommendationOffset, e.Resources),AcceptableRange: nodesAndOffsetToRange(numNodes, e.AcceptanceOffset, e.Resources),}
}
Kubernetes 客户端
// kubernetesClient 封装了与 Kubernetes API 的交互
type kubernetesClient struct {nodeLister v1lister.NodeListerpodLister v1lister.PodNamespaceListerdeploymentLister v1appslister.DeploymentNamespaceListerdeploymentClient kube_client_apps.DeploymentInterfacenamespace stringdeployment stringpod stringcontainer string
}// NewKubernetesClient 创建新的 Kubernetes 客户端
func NewKubernetesClient(kubeClient kube_client.Interface, namespace, deployment, pod, container string) KubernetesClient {// 初始化各种 Lister 和 Client
}
自动扩缩容核心逻辑
// checkResource 检查资源是否需要调整
func checkResource(estimatorResult *EstimatorResult, actual api.ResourceList, res api.ResourceName) (*api.ResourceList, operation) {val, ok := actual[res]expMinVal, expMinOk := estimatorResult.AcceptableRange.lower[res]expMaxVal, expMaxOk := estimatorResult.AcceptableRange.upper[res]if !ok && !expMinOk && !expMaxOk {return nil, unknown}if val.Cmp(expMinVal) == -1 {return &estimatorResult.RecommendedRange.lower, scaleUp}if val.Cmp(expMaxVal) == 1 {return &estimatorResult.RecommendedRange.upper, scaleDown}return nil, unknown
}
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码