简介: 阿里云专有云容器服务弹性伸缩最佳实际

1.容器服务弹性伸缩简介

本大节将基于应用原理对容器服务弹性伸缩进行简要的形容。
本实际基于K8s的业务集群运行在专有云上,对测试业务进行压力测试,次要基于以下三种产品和能力:

  • 利用阿里云的云企业网专线买通专有云和公共云,实现两朵云上VPC网络互通。
  • 利用K8s(Kubernetes)的HPA能力,实现容器的程度伸缩。
  • 利用K8s的Cluster Autoscaler和阿里云弹性伸缩组ESS能力实现节点的主动伸缩。

当被测试业务指标达到下限时,触发HPA主动扩容业务pod;当业务集群无奈承载更多pod时,触发公共云的ESS服务,在公共云内扩容出ECS并主动增加到专有云的K8s集群。

图1:容器服务弹性伸缩原理图

2.软件环境

本次最佳实际的软件环境要求如下:
应用环境:

  • 容器服务ACK基于专有云V3.10.0版本。
  • 公共云云企业网服务CEN。
  • 公共云弹性伸缩组服务ESS。

配置条件:

  • 应用专有云的容器服务或者在ECS上手动部署麻利PaaS。
  • 开明云专线,买通容器服务所在VPC与公共云上的VPC。
  • 开明公共云弹性伸缩组服务(ESS)。

3.配置领导

3.1配置HPA

本大节将介绍配置HPA的具体步骤。
HPA(Horizontal Pod Autoscaler)是K8s的一种资源对象,可能依据CPU、内存等指标对statefulset、deployment等对象中的pod数量进行动静伸缩,使运行在下面的服务对指标的变动有肯定的自适应能力。
本示例创立了一个反对HPA的nginx利用,创立胜利后,当pod的利用率超过本例中设置的20%利用率时,则会进行程度扩容,低于20%的时候会进行缩容。具体操作步骤如下。

3.1.1若应用自建K8s集群,则通过yaml文件配置HPA

①创立一个nginx利用,必须为利用设置request值,否则HPA不会失效。

apiVersion: app/v1beta2kind: Deploymentspec:  template:    metadata:      creationTimestamp: null      labels:        app: hpa-test    spec:      dnsPolicy: ClusterFirst      terminationGracePeriodSeconds:30      containers:        image: '192.168.**.***:5000/admin/hpa-example:v1'        imagePullPolicy: IfNotPresent        terminationMessagePolicy:File        terminationMessagePath:/dev/termination-log        name: hpa-test        resources:          requests:            cpu: //必须设置request值        securityContext: {}        restartPolicy:Always        schedulerName:default-scheduler  replicas: 1  selector:     matchLabels:        app: hpa-test  revisionHistoryLimit: 10  strategy:     type: RollingUpdate    rollingUpdate:        maxSurge: 25%        maxUnavailable: 25%  progressDeadlineSeconds: 600 

②创立HPA。

apiVersion: autoscaling/v1kind: HorizontalPodAutoscalermetadata:  annotations:autoscaling.alpha.kubernetes.io/conditions:'[{"type":"AbleToScale","status":"True","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"ScaleDownStabilized","message":"recent recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"ValidMetricFound","message":"theHPA was able to successfully calculate a replica count from cpu resource utilization(percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"DesiredWithinRange","message":"thedesired count is within the acceptable range"}]' autoscaling.alpha.kubernetes.io/currentmetrics:'[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'  creationTimestamp: 2020-04-29T06:57:13Z  name: hpa-test  namespace: default  resourceVersion: "3092268"  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/hpa01  uid: a770ca26-89e6-11ea-a7d7-00163e0106e9spec:  maxReplicas: //设置pod数量  minReplicas: 1  scaleTargetRef:    apiVersion: apps/v1beta2    kind: Deployment    name: centos  targetCPUUtilizationPercentage://设置CPU阈值
3.1.2若应用阿里云容器服务,须要在部署利用时抉择配置HPA

图2:阿里云容器服务配置HPA

3.2配置Cluster Autoscaler

本大节将介绍配置Cluster Autoscaler的具体步骤。
节点主动伸缩组件基于K8s资源调度的分配情况进行伸缩判断,节点中资源的调配通过资源申请(Request)进行计算。
当pod因为资源申请(Request)无奈满足并进入期待(Pending)状态时,节点主动伸缩组件会依据弹性伸缩组配置信息中的资源规格以及束缚配置,计算所需的节点数目。
如果能够满足伸缩条件,则会触发伸缩组的节点退出。而当一个节点在弹性伸缩组中且节点上pod的资源申请低于阈值时,节点主动伸缩组件会将节点进行缩容。
因而资源申请(Request)的正确、正当设置,是弹性伸缩的前提条件。

3.2.1配置弹性伸缩组ESS

①创立ESS弹性伸缩组,记录最小实例数和最大实例数。

图3:创立弹性伸缩组并配置-1

图4:创立弹性伸缩组并配置-2

②创立伸缩配置,记录伸缩配置的id。

图5:创立伸缩配置

#!/bin/shyum install -y ntpdate && ntpdate -u ntp1.aliyun.com && curl http:// example.com/public/hybrid/attach_local_node_aliyun.sh | bash -s -- --docker-version 17.06.2-ce-3 --token 9s92co.y2gkocbumal4fz1z --endpoint 192.168.**.***:6443 --cluster-dns 10.254.**.** --region cn-huhehaoteecho "{" > /etc/docker/daemon.jsonecho ""registry-mirrors": [" >> /etc/docker/daemon.jsonecho ""https://registry-vpc.cn-huhehaote.aliyuncs.com"" >> /etc/docker/daemon.jsonecho "]," >> /etc/docker/daemon.jsonecho ""insecure-registries": ["https://192.168.**.***:5000"]" >> /etc/docker/daemon.jsonecho "}" >> /etc/docker/daemon.jsonsystemctl restart docker
3.2.2 K8s集群部署autoscaler
kubectl apply -f ca.yml 

参考ca.yml创立autoscaler,留神批改如下配置与理论环境绝对应。

access-key-id: "TFRB********************"access-key-secret: "bGIy********************W***************"region-id: "Y24t************" 

4.压力测试

本大节将对最佳实际的使用场景进行阐明。

4.1模仿业务拜访

启动busybox镜像,在pod内执行如下命令拜访以上利用的service,能够同时启动多个pod减少业务负载。

while true;do wget  -q -O-  http://hpa-test/index.html;done 

4.2察看HPA

加压前:

图6:加压前指标值

加压后,当CPU值达到阈值后,会触发pod的程度扩容:

图7:加压后指标值

图8:触发pod程度扩容

4.3察看pod

当集群资源有余时,新扩容出的pod处于pending状态,此时将触发cluster autoscaler,主动扩容节点。

图9:触发cluster autoscaler主动扩容节点

作者:刘伟业

阿里云智能混合云PDSA团队高级解决方案工程师

曾就任于新华三云做软件定义数据核心解决方案,负责多个省级云平台的架构设计和落地。现就职于阿里云智能混合云PDSA团队负责容器和云原生产品的方案设计、POC和最佳实际工作。