美文网首页js css html
第4章 节点伸缩的实现

第4章 节点伸缩的实现

作者: 漫长的白日梦技术大佬 | 来源:发表于2022-09-08 22:58 被阅读0次

    阿里云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有专门的控制台,可在控制台排查其伸缩配置、伸缩规则等相关子实例日志和状态。

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

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

    相关文章

      网友评论

        本文标题:第4章 节点伸缩的实现

        本文链接:https://www.haomeiwen.com/subject/bwyznrtx.html