Kubernetes HPA Controller源码分析

本文深入分析了Kubernetes HPA Controller的源码,包括核心文件horizontal.go和replica_calculator.go,介绍了Controller的初始化、HPA结构、Scale子资源、算法计算desired replicas的过程,以及与API Server交互实现自动扩容缩容的逻辑。重点关注了reconcileAutoscaler函数及其内部的calculateTargetReplicasForMetrics方法。
摘要由CSDN通过智能技术生成

Author: xidianwangtao@gmail.com

源码目录结构分析

HorizontalPodAutoscaler(以下简称HPA)的主要代码如下,主要涉及的文件不多。


cmd/kube-controller-manager/app/autoscaling.go    // HPA Controller的启动代码


/pkg/controller/podautoscaler
.
├── BUILD
├── OWNERS
├── doc.go
├── horizontal.go    // podautoscaler的核心代码,包括其创建和运行的代码
├── horizontal_test.go
├── metrics
│   ├── BUILD
│   ├── metrics_client.go
│   ├── metrics_client_test.go
│   ├── metrics_client_test.go.orig
│   ├── metrics_client_test.go.rej
│   └── utilization.go
├── replica_calculator.go   // ReplicaCaculator的创建,以及根据cpu/metrics计算replicas的方法
└── replica_calculator_test.go

其中,horizontal.go和replica_calculator.go是最核心的文件,他们对应的Structure如下:

  • horizontal.go
    这里写图片描述

  • replica_calculator.go
    这里写图片描述

源码分析

HPA Controller同其他Controller一样,都是在kube-controller-manager启动时完成初始化并启动的,如下代码所示。

cmd/kube-controller-manager/app/controllermanager.go:224

func newControllerInitializers() map[string]InitFunc {
    controllers := map[string]InitFunc{}

    ...

    controllers["horizontalpodautoscaling"] = startHPAController

    ...

    return controllers
}

kube-controller-manager启动时会initial一堆的controllers,对于HPA controller,它的启动就交给startHPAController了。

cmd/kube-controller-manager/app/autoscaling.go:29

func startHPAController(ctx ControllerContext) (bool, error) {

    ...

    // HPA Controller需要集群已经部署Heapster,由Heapster提供监控数据,来进行replicas的计算。
    metricsClient := metrics.NewHeapsterMetricsClient(
        hpaClient,
        metrics.DefaultHeapsterNamespace,
        metrics.DefaultHeapsterScheme,
        metrics.DefaultHeapsterService,
        metrics.DefaultHeapsterPort,
    )

    // 创建ReplicaCaculator,后面会用它来计算desired replicas。
    replicaCalc := podautoscaler.NewReplicaCalculator(metricsClient, hpaClient.Core())

    // 创建HPA Controller,并启动goroutine执行其Run方法,开始工作。
    go podautoscaler.NewHorizontalController(
        hpaClient.Core(),
        hpaClient.Extensions(),
        hpaClient.Autoscaling(),
        replicaCalc,
        ctx.Options.HorizontalPodAutoscalerSyncPeriod.Duration,
    ).Run(ctx.Stop)

    return true, nil
}

首先我们来看看NewHorizontalController创建HPA Controller的代码。

pkg/controller/podautoscaler/horizontal.go:112

func NewHorizontalController(evtNamespacer v1core.EventsGetter, scaleNamespacer unversionedextensions.ScalesGetter, hpaNamespacer unversionedautoscaling.HorizontalPodAutoscalersGetter, replicaCalc *ReplicaCalculator, resyncPeriod time.Duration) *HorizontalController {

    ...

    // 构建HPA Controller
    controller := &HorizontalController{
        replicaCalc:     replicaCalc,
        eventRecorder:   recorder,
        scaleNamespacer: scaleNamespacer,
        hpaNamespacer:   hpaNamespacer,
    }

    // 创建Informer,配置对应的ListWatch Func,及其对应的EventHandler,用来监控HPA Resource的Add和Update事件。newInformer是HPA的核心代码入口。
    store, frameworkController := newInformer(controller, resyncPeriod)
    controller.store = store
    controller.controller = frameworkController

    return controller
}

我们有必要来看看HPA Controller struct的定义:

pkg/controller/podautoscaler/horizontal.go:59

type HorizontalController struct {
    scaleNamespacer unversionedextensions.ScalesGetter
    hpaNamespacer   unversionedautoscaling.HorizontalPodAutoscalersGetter

    replicaCalc   *ReplicaCalculator
    eventRecorder record.EventRecorder

    // A store of HPA objects, populated by the controller.
    store cache.Store
    // Watches changes to all HPA objects.
    controller *cache.Controller
}
  • scaleNamespacer其实是一个ScaleInterface,包括Scale subresource的Get和Update接口。
  • hpaNamespacer是HorizontalPodAutoscalerInterface,包括HorizontalPodAutoscaler的Create, Update, UpdateStatus, Delete, Get, List, Watch等接口。
  • replicaCalc根据Heapster提供的监控数据,计算对应desired replicas。

    pkg/controller/podautoscaler/replica_calculator.go:31
    
    type ReplicaCalculator struct {
        metricsClient metricsclient.MetricsClient
        podsGetter    v1core.PodsGetter
    }
  • store和controller:controller用来watch HPA objects,并更新到store这个cache中。

上面提到了Scale subresource,那是个什么东西?好吧,我们得看看Scale的定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值