暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

云容器弹性伸缩方案调研

码不禁言 2021-03-04
1061

背景

某业务服务大部分时间的请求量较低,但某时间段出现请求的波峰,如下图所示。查看该服务部署在了4台8核16G的机器上,从QPS上看即使峰值时刻也并不算高,而机器其实也处于低负载的状况。从成本角度考虑,这块业务是否可以通过容器化的方式实现弹性伸缩,云上有一些成熟的产品,是否可以直接拿来使用?这是调研的背景。


kubernetes对弹性伸缩的支持
现有容器云产品基本基于kubernetes实现,因此这里先了解下kubernetes对弹性伸缩的支持,而云产品无非在其基础上进行了封装扩展。
1 集群伸缩

如上图所示,kubernetes提供了一个叫做Cluster AutoScaler(简称CA)的子模块来实现集群节点的伸缩,CA根据POD是否处于pending状态来判断是否需要进行扩容,这里需要云厂商提供接口模块来进行集群扩展的判断和节点授权加入操作,一旦新的节点加入集群,挂起的POD就会被调度到新的节点上。

2 POD伸缩
POD的伸缩包括了水平伸缩(Horizontal Pod Autoscaler)和垂直伸缩(Vertical Pod Autoscaler)
2.1 HPA

Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量。除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标 来执行自动扩缩。注意的问题:

  • k8s集群需要安装metrics-server服务,HPA通过Metrics Server接口获得监测数据进行伸缩判断
  • POD需要设置request资源,如:
       containers:
      - name: php-apache
      image: k8s.gcr.io/hpa-example
      ports:
      - containerPort: 80
      resources:
      limits:
      cpu: 500m
      requests:
      cpu: 200m
    • autoscale相关命令

      # 为deployment指定autoscale规则
      kubectl autoscale deployment httptest -n test --cpu-percent=50 --min=1 --max=5
      # 获取hpa
      kubectl get hpa -n test
      # 查看hpa
      kubectl describe hpa httptest -n test
      # 删除hpa
      kubectl delete hpa httptest -n test

      2.2 VPA
      Pod 垂直自动扩缩(Vertical Pod Autoscaler),不同于副本数的伸缩,而是自动收放POD的系统资源,一般用于无法通过水平扩展的工作负载场景,比如MySQL。VPA此处没有做过多的研究,就不做介绍了。

      云产品对容器弹性伸缩的支持调研
      在大致知道了Kubernetes的弹性伸缩方案和原理之后,我们再来调研下现有的云产品对容器弹性伸缩方面的支持。这里主要以腾讯云和阿里云为例。此处的调研主要根据云厂商提供的文档和个人理解整理,可能存在错漏的地方。
      1 腾讯云

      腾讯云提供了“容器服务”(TKE)和“弹性容器服务”(EKS)两种产品,两者最大的区别是是否需要用户购买集群节点,实际的操作通过底层的集群是否指定为伸缩集群来区分。

      • TKE通过节点池的方式支持节点的自动扩容
      • EKS 是一种全托管的 Kubernetes 服务,EKS 以 Pod 的形式交付计算资源
      2 阿里云
      阿里云的容器产品看着比较多,如下所示,主要包括“容器服务ACK”,“Serverless容器服务ASK”和“弹性容器实例ECI”。虽然产品形态比较多,但底层是相同通的,ASK和ACK的关系类似腾讯云的EKS和TKE的范畴,即用户是否关心集群节点。而ECI则关注POD形式的交付,底层是由ASK支撑,购买ASK的同时就包含了ECI。


      总结
      • 云厂商对容器产品的支持主要以两种形态呈现,一种是需要用户指定集群,一种是通过指定伸缩集群来屏蔽底层的节点,而后者属于serverless的概念,使用方的交付往往是POD的形式,该方式也符合serverless根据流量计费的形态。
      • 两种形态都可以支持弹性伸缩,通过相应文档发现集群的伸缩其实都是通过K8s提供的Cluster AutoScaler来实现,而POD方面通过HPA来实现。伸缩的策略可以通过扩展来实现,比如通过Prometheus监控业务数据来判断。
      • 具体的云产品选择个人认为一方面考虑成本,如serverless方式的流量计费方式是否确实更合理,如果更多的服务上容器云,自建集群的资源综合使用成本是否更划算?另一方面看是否有一些定制化的需求,比如新增k8s组件,比如接入istio,在serverless方式下是否能很好支持。

      其他
      阿里云提供了edas产品,实现了无侵入微服务治理,底层支持阿里云k8s集群(ACK/ASK),个人觉得是一个比较有意思的产品,解决了服务治理和部署方面的痛点,非常适合创业团队的产品快速迭代和验证。

      文章转载自码不禁言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论