kubernetes – cluster-autoscaler(CA)实现CloudProvider分析

微信扫一扫,分享到朋友圈

kubernetes – cluster-autoscaler(CA)实现CloudProvider分析

cluster-autoscaler是node级伸缩的一个服务,需要作为Deployment单实例部署。

它做2个申请:

  1. 如果集群有pod因为资源不足而pending,那么它会通过云平台实现的cloud provider插件,申请新建node加入集群。
  2. 如果从云平台申请的node的request使用率太低并且其他node的资源足够容纳这些POD,则会驱逐这些POD并等待一段时间,之后通过cloud provider插件向云平台申请删除node。

大家可以通过云厂商的文档了解这个功能的具体表现:

启动参数

作为一个云厂商,需要关注如下参数:

  • –cloud-config:直接透传给cloud provider的参数,插件自己去对应路径加载自己的配置。
  • –cloud-provider:传对应云厂商的cloud provider标识,这个在集成插件时已联编到CA中。
  • –nodes:可以传多次,每一个表示一个nodeGroup(伸缩组),云厂商的伸缩组一般就是(最小node个数,最大node个数,再附加一下云厂商侧对这个伸缩组的标识),这个字符串格式任意,只要cloud provider能理解就可以。
  • –node-group-auto-discovery:相比较于–node写死伸缩组,这个选项可以配合cloud provider的hook实现自动发现云平台侧配置的伸缩组,免得重启CA来添加–nodes,一般云平台不会做这个。

编译方法

下载代码:https://github.com/kubernetes/autoscaler。

需要把代码下载到${GOPATH}/src/k8s.io/autoscaler/目录下面。

然后进入${GOPATH}/src/k8s.io/autoscaler/cluster-autoscaler,执行make即可得到二进制。

开发思路

首先定义cloud标识,cloudprovider/cloud_provider.go,已经有了这些云厂商:

const (
        // AzureProviderName gets the provider name of azure
        AzureProviderName = "azure"
        // AlicloudProviderName gets the provider name of alicloud
        AlicloudProviderName = "alicloud"
        // AwsProviderName gets the provider name of aws
        AwsProviderName = "aws"
        // BaiducloudProviderName gets the provider name of baiducloud
        BaiducloudProviderName = "baiducloud"
        // DigitalOceanProviderName gets the provider name of digitalocean
        DigitalOceanProviderName = "digitalocean"
        // GceProviderName gets the provider name of gce
        GceProviderName = "gce"
        // MagnumProviderName gets the provider name of magnum
        MagnumProviderName = "magnum"
        // KubemarkProviderName gets the provider name of kubemark
        KubemarkProviderName = "kubemark"
)

我们自己加一个即可,一会要用。

然后要模仿其他厂商,实现2套标准接口:

  • CloudProvider:云厂商插件,主要从云平台侧同步N个NodeGroup(伸缩组,一个机器池子,里面的机器配置一样并且数量有限)的最新状态(比如已经申请了几台,还剩几台)。
  • NodeGroup:具体的1个NodeGroup,表示了云平台侧的一个伸缩组(机器池子),主要用于向云平台对应的伸缩组发起申请Node,删除Node。

以baiducloud的实现为例,摸索一下每个方法的作用。

CloudProvider接口

创建过程

这是创建Baidu Cloud Provider的方法,它返回CloudProvider的具体实现:

func BuildBaiducloud(opts config.AutoscalingOptions, do cloudprovider.NodeGroupDiscoveryOptions, rl *cloudprovider.ResourceLimiter) cloudprovider.CloudProvider

opts是已经解析好的命令行参数,我们关心里面的CloudConfig,也就是访问百度云API的配置文件。

do是关于NodeGroup伸缩组的配置,它可能是–nodes配置的静态伸缩组信息,也可能是auto-discovery自动发现云平台伸缩组:

// NodeGroupDiscoveryOptions contains various options to configure how a cloud provider discovers node groups
type NodeGroupDiscoveryOptions struct {
// NodeGroupSpecs is specified to statically discover node groups listed in it
NodeGroupSpecs []string
// NodeGroupAutoDiscoverySpec is specified for automatically discovering node groups according to the specs
NodeGroupAutoDiscoverySpecs []string
}

从源码看,百度云没有支持自动发现机制。

这个创建方法把N个–node传入的字符串进行解析,其格式是:

minNodes:maxNodes:asgName

插件解析这些字符串,创建了N个NodeGroup接口的具体实现,也就是N个伸缩组,或者说N个机器池子。

每个伸缩组有node的弹性个数范围,还有伸缩组的唯一名字,这些信息在百度云平台控制台都是配置好的。

百度云采用asg这个单词的意思实际就是auto scale group,也就是伸缩组,NodeGroup。

阅读后续内容?

你必须付费加入我的知识星球,为有效知识付费是对作者最好的回报。

二维码见下方 或者 右侧边栏。

挖掘私域流量价值,才能彻底对电商“二选一”Say No!

上一篇

阅文签约作者:对新合约部分条款仍存疑 但能看见阅文诚意

下一篇

你也可能喜欢

kubernetes – cluster-autoscaler(CA)实现CloudProvider分析

长按储存图像,分享给朋友