阿里云ACK(容器服务)+ElasticWorkload弹性负载+HPA弹性伸缩实践

背景

阿里云ACK(kubernetes容器服务),高弹性,高稳定性,低成本解决方案。
通过将ECI服务以虚拟节点的方式接入ACK容器集群,将集群中pod应用的固定量调度到现有的ACK容器服务的ECS node节点上,将集群中pod应用的弹性量通过ElasticWorkload组件调度的ECI服务的虚拟节点上。

ACK集群默认架构

以ACK容器服务托管版为例
请添加图片描述

将ECI虚拟节点接入ACK集群后的容器集群架构

请添加图片描述

ECI具有以下几个特点

高弹性:快速秒级扩容,可轻松应对百倍突发流量,同时支持HPA及CronHPA。
低成本:根据流量动态使用资源,按需付费。
高可用:精细化应用伸缩,扩容时保留固定N个副本在ECS上运行,第N+1个以上副本调度到ECI;缩容时优先回收ECI上的Pod副本。
兼容性:支持有状态StatefulSet 、无状态Deployment 、任务Job和定时任务CronJob,并且完全兼容Kubernetes。
免运维:不需要管理集群,也不需要管理工作节点,只需要定义应用、服务和任务。
高并发:支持1000/分钟Pod调度能力

创建ECI实例两种方式

参考文档

指定ECS规格创建ECI实例

参考文档
主要从以下两个方面来优化集群的安全性,稳定性

节点层面

通过设置集群节点弹性伸缩组,来提升ACK容器集群的稳定性,以及高可用性。目的是为了预防集群node节点预留资源不满足pod应用所需资源,从而导致pod应用异常或者集群物理节点被打爆。

具体配置方法

在ACK集群控制台找到我们的k8s集群点击自动伸缩,来创建弹性伸缩组,节点池是基于阿里云ESS弹性伸缩服务,通过事先定义节点实例规格,网络,安全组等再结合容器服务定义的阈值,来实现对节点的弹性伸缩操作
在这里插入图片描述
创建节点池以及定义伸缩组阈值
在这里插入图片描述

POD层面

通过ACK集群使用ElasticWorkload组件+HPA组件来实现对pod层面的弹性伸缩,集群配置完ECI虚拟节点后,可以通过对ElasticWorkload组件配置来实现将pod调度到ECS node节点上还是ECI 虚拟节点上。

具体实现方法如下:

集群安装ack-kubernetes-elastic-workload组件、ACK Virtual Node组件
安装方法:通过阿里云ACK集群的应用市场一键部署或者命令部署安装即可
这两个组件默认都安装在kuber-system名称空间下
在这里插入图片描述
在这里插入图片描述

HPA+ElasticWorkload调度逻辑

通过ElasticWorkload控制Deployment
HPA控制ElasticWorkload请添加图片描述

请添加图片描述
下面通过配置一个应用来实现下具体调度逻辑

ElasticWorkload文件配置如下

[root@k8s-master k8syaml]# cat ew-test-app-demo.yaml 
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: ElasticWorkload
metadata:
  annotations:
  name: ew-test-app-demo
  namespace: vk
spec:
  elasticUnit:
  - labels:
      alibabacloud.com/eci: "true"
    name: virtual-kubelet
  #默认运行在ecs节点上的副本数量
  replicas: 4
  sourceTarget:
    apiVersion: apps/v1
    kind: Deployment
    #运行在ecs节点上的最大副本数量,超过默认副本数的话超出量会被调度到虚拟节点
    max: 4
    min: 4
    name: test-app-demo

hpa文件配置

[root@k8s-master k8syaml]# cat scm-vendor-web-hpa.yaml 
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: test-app-demo
  namespace: vk
spec:
  scaleTargetRef:
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: ElasticWorkload
    name: ew-test-app-demo
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 6400
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 800

HPA CPU,以及内存阈值计算逻辑(针对于request和limit不是1:1的场景)

容器组当前使用量=pod当前使用量*pod数
HPA统计的pod当前使用量为容器组的平均使用量
容器组平均使用量=所有pod使用量之和
我们可以看到下图当前容器的cpu使用量是190m这个是容器组的平均值
当前使用量百分比=pod当前使用量/容器reques值
如下图所示该应用当前使用量是190m

在这里插入图片描述

容器request值为0.05转化为毫核就是50m

在这里插入图片描述

190m/50m=3.8转化为百分比也就是380%(该值为容器组的当前平均使用量)
先把limit单位转化为毫核
(Targets值)容器组总使用量=(limit值/request)*pod数
总Limit值=(4*1000)*4(pod数)=16000mm
总reques值=0.05*1000*4(pod数)=200mm
(Targets值)容器组使用量百分比=16000/200=80(转化为百分比就是8000%)
我们设定该应用cpu使用率大于等于百分之八十触发HPA伸缩动作
(Targets值)阈值(80%)=80*0.8=64(转化为百分比就是6400%)
内存计算公式同理

HPA预估POD副本数逻辑

期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱吃肉@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值