Kubernetes Autoscaler 集群自动扩缩容工具

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 main

import (
  "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            []Resource
  AcceptanceOffset     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.NodeLister
  podLister        v1lister.PodNamespaceLister
  deploymentLister v1appslister.DeploymentNamespaceLister
  deploymentClient kube_client_apps.DeploymentInterface
  namespace        string
  deployment       string
  pod              string
  container        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智能小助手)
公众号二维码

posted @ 2025-08-01 19:11  qife  阅读(6)  评论(0)    收藏  举报