简介: 阿里云专有云容器服务弹性伸缩最佳实际
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/v1beta2
kind: Deployment
spec:
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/v1
kind: HorizontalPodAutoscaler
metadata:
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-00163e0106e9
spec:
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/sh
yum 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-huhehaote
echo "{" > /etc/docker/daemon.json
echo ""registry-mirrors": [" >> /etc/docker/daemon.json
echo ""https://registry-vpc.cn-huhehaote.aliyuncs.com"" >> /etc/docker/daemon.json
echo "]," >> /etc/docker/daemon.json
echo ""insecure-registries": ["https://192.168.**.***:5000"]" >> /etc/docker/daemon.json
echo "}" >> /etc/docker/daemon.json
systemctl 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 和最佳实际工作。