阿里云容器服务Kubernetes主要包含如下两大类弹性组件:调度层弹性组件与资源层弹性组件,如图7-5所示。

图7-5 阿里云Kubernetes集群弹性方案
调度层弹性组件是指所有的弹性动作都是和Pod相关的,与具体的资源情况无关。
1.HPA
HPA是Pod水平伸缩的组件,除了社区支持的Resource Metrics和Custom Metrics,阿里云容器服务Kubernetes还提供了external-metrics-adapter,支持云服务的指标作为弹性伸缩的判断条件,目前已经支持多个产品不同维度的监控指标,例如Ingress的QPS、RT,ARMS中应用的GC次数、慢SQL次数,等等。
2.VPA
VPA是Pod纵向伸缩的组件,主要面向有状态服务的扩容和升级场景。
3.cronHPA
cronHPA是定时伸缩组件,主要面向的是周期性负载,通过资源画像可以预测有规律的负载周期,并通过周期性伸缩,实现资源成本的节约。
4.Resizer
Resizer是集群核心组件的伸缩控制器,可以根据集群的CPU核数、节点的个数,实现线性和梯度两种不同的伸缩,目前主要面对的场景是核心组件的伸缩,例如CoreDNS。
对于资源层弹性组件,弹性的操作都是针对Pod和具体资源关系的。
1.Cluster Autoscaler
Cluster Autoscaler是目前比较成熟的节点伸缩组件,主要应用场景是当Pod资源不足时进行节点的伸缩,并将无法调度的Pod调度到新弹出的节点上。
2.Virtual kubelet autoscaler
Virtual kubelet autoscaler是阿里云容器服务Kubernetes开源的组件,和Cluster Autoscaler的原理类似,当Pod由于资源问题无法调度时,弹出的不是节点,而是将Pod绑定到虚拟节点上,并通过ECI的方式启动Pod。
最后给大家做一个简单的方案演示。如图7-6所示,应用主体是Apiservice,Apiservice会通过Sub-Apiservice调用Database,接入层通过Ingress进行管理。
我们通过PTS模拟上层产生的流量,通过SLS采集接入层的日志,通过ARMS采集应用的性能指标,并通过Alibaba cloud metrics adapster暴露external metrics触发HPA重新计算工作负载的副本,当伸缩的Pod占满集群资源时,触发Virtual kubelet autoscaler生成ECI承载超过集群容量规划的负载。