第4章 节点伸缩的实现

阿里云K8s集群的节点可以动态增加或减少。集群可以在计算资源不足的情况下扩容,增加新的节点,同时也可以在资源利用率降低的时候,释放节点以节省费用。

4.1 节点增加原理



4.1.1 手动添加已有节点

节点准备,就是把一个普通的ECS实例安装配置程一个K8s集群节点的过程。这个过程仅靠一条命令就可以完成。这条命令使用curl下载attach_node.sh脚本,然后以openapi token为参数,在ECS上运行。

curl http://<address>/public/pkg/run/attach/<version>/attach_node.sh | bash -s -- --openapi-token <token>

这里token是一个<key,value>对的key,而value是当前集群的基本信息。阿里云K8s集群的管控,在接到手动添加已有节点请求的时候,会生成这个<key,value>对,并把key作为token返回给用户。

这个token(key)存在的价值,是其可以让attch_node.sh脚本匿名在ECS上检索到集群的基本信息(value),而这些基本信息对节点准备至关重要。

总体上来说,节点准备就做两件事:读和写。读即数据收集,写即节点配置。节点初始化流程如下图所示。

kubeadm把节点注册到Master的过程,此过程需要新加节点和集群Master之间建立互信。

一方面,新加节点从管控处获取的bootstrap token(与openapi token不同,此token是value的一部分内容),实际上是管控通过可信的途径从集群Master上获取的。新加节点使用这个bootstrap token链接Master,Master则可通过验证这个bootstrap token来建立对新加节点的信任。

另一方面,新加节点以匿名身份从Master kube-public命名空间中获取集群cluster-info,cluster-info包括集群CA(证书授权中心)证书,和使用集群bootstrap token对这个CA做的签名。新加节点使用从管控处获取的bootstrap token,对CA生成新的签名,然后将此签名与cluster-info内签名对比,如果两个签名一致,则说明cluster-info和bootstrap token来自同一集群。新加节点因为信任管控,所以建立对Master的信任。集群节点注册机制如下图所示。


4.1.2 自动添加已有节点

自动添加已有节点,不需要人为把脚本拷贝到ECS命令行来完成节点准备的过程。管控使用了ECS Userdata的特性,把类似以上节点准备的脚本写入ECS Userdata,然后重启ECS并更换系统盘。当ECS重启之后,会自动执行Userdata里边的脚本,来完成节点添加的过程。

#!/bin/bash

mkdir -p /var/log/acs

curl http://<address>/public/pkg/run/attach/1.12.3-aliyun.1/attach_node.sh | bash -s -- --docker-version <version> --token<bootstrap token> --endpoint <apiserver> --cluster-dns <dns> /var/log/acs/init.log

4.1.3 集群扩容

集群扩容的实现,在添加已有节点的基础上引入了ESS组件。ESS组件负责从无到有的过程,而剩下的过程与添加已有节点类似,即依靠ESS Userdata脚本来完成节点准备。下图为集群扩容过程。


4.1.4 自动伸缩

前面几种方式需要人为干预的伸缩方式,而自动伸缩的本质不同,因为它可以在业务需求量增加的时候,自动创建ECS实例并加入集群。为了实现集群的自动化,这里引入另一个组件Cluster Autoscaler,集群自动伸缩包括两个独立的过程,如下图所示。

第一个过程主要用来配置节点的规格属性,包括设置节点的用户数据。这个用户数据和手动添加已有节点的脚本类似,不同的地方在于,其针对自动伸缩这种场景增加了一些专门的标记。attach_node.sh脚本会根据这些标记来设置节点的属性。

#!/bin/bash

curl http://<address>/public/pkg/run/attach/1.12.3-aliyun.1/attach_node.sh| bash -s -- --openapi-token <vtoken> --ess true --labels k8s.io/cluster-autoscaler=true,workload_type=cpu,k8s,aliyun.com=true

notice:集群调度器衡量资源是否充足的标准是“预订率”,而不是“使用率”。在开启自动伸缩功能的时候,需要设置缩容阈值,就是“预订率”的下线。之所以不设置扩容阈值,是因为Autoscaler扩容集群依靠的是Pod的调度状态:当Pod因为节点资源“预订率”太高而无法被调度的时候,Autoscaler就会扩容集群。

4.2 节点减少原理

集群减少节点的操作只有一个移除节点的入口,如下图所示。

1)通过添加已有节点加入的节点,需要三步移除:

管控用过ECS API清除ECS Userdata

管控通过K8s API从集群中删除节点

管控通过ECS InvokeCommand在ECS上执行kubeadm reset命令清理节点

2)通过集群扩容加入的节点,则在前面步骤的基础上增加了断开ESS和ECS关系的操作。此操作由管控调用ESS API完成。

3)通过Cluster Autoscaler动态增加的节点,在集群CPU资源“预订率”降低的时候,由Cluster Autoscaler自动移除释放。其触发点是CPU“预订率”,这也是加上Metrics的原因。

4.3 节点池原理

针对不同的业务需求,阿里云容器服务ACK实际数行已经支持了包括托管版、标准专有版、异构版、弹性裸金属、Windows在内的诸多集群类型,如下图所示。

为了将多样的能力合并到同一个集群中,用户无需创建多个集群,只需要在一个集群中就具有管理多种集群的能力,如下图所示。


面对这样的需求,容器服务K8s需要提供更有层次的节点维度的管理功能,所以设计了节点池的概念,利用节点池可对不同节点类型做分组管理。这样在同一个K8s集群中,就可以通过创建不同类型的节点池来满足不同的业务场景。

4.4 总结

K8s集群节点的增加与减少主要涉及四个组件,分别是Cluster Autoscaler、ESS、管控和节点本身(节点的准备与清理)。

根据场景不同,需要排查不同的组件。

Cluster Autoscaler是一个普通Pod,日志的获取和其他Pod无异。

ESS有专门的控制台,可在控制台排查其伸缩配置、伸缩规则等相关子实例日志和状态。

管控的日志,可通过查看日志功能查看。

节点的准备与清理,就是排查对应的脚本的执行过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容