首页 智能应对流量变化,容器化集群的弹性攻略

智能应对流量变化,容器化集群的弹性攻略

更新时间: 2024-10-21 17:51:31

手动部署

80

https://www.aliyun.com/solution/tech-solution/ack-hpa

方案概览

通过本教程,您将学习如何在阿里云容器服务上部署的应用,使用应用型负载均衡ALB(Application Load Balancer)七层负载均衡服务,将来自客户端的请求分发至后端容器Pod上,同时利用容器水平伸缩HPA(Horizontal Pod Autoscaler)功能实现弹性伸缩,能够在业务负载急剧飙升时快速扩容多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容以节省资源,无需您人为干预。HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景,例如电商服务、线上教育、金融服务等。

方案架构

本架构采用单地域双可用区部署,将系统部署在2个不同可用区,实现了可用区级故障灾备能力,同时在节点和Pod两个维度开启了弹性伸缩能力,保证了业务的连续性。

image

本方案的技术架构包括以下基础设施和云服务:

  • 1个专有网络VPC和2个交换机:构建云上私有网络。

  • 1个应用型负载均衡ALB:负载均衡服务。

  • 1个容器服务Kubernetes版集群:容器服务平台,提供容器应用管理服务。

  • 1个SLS Project和1个SLS Logstore:提供访问记录的存储服务。

  • 2-3台云服务器ECS:由容器服务Kubernetes版集群创建并部署Nginx服务,作为Web站点。

应用型负载均衡ALB(Application Load Balancer):专门面向七层应用,提供强大的应用层处理能力和丰富的高级转发规则。单ALB实例性能最大可达100万QPS。更多信息,请参见什么是应用型负载均衡ALB

Pod水平自动扩缩HPA(Horizontal Pod Autoscaler):Kubernetes内置组件,提供Pod水平扩缩容能力。

此外阿里云容器服务提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,更多信息,请参见弹性伸缩概述,了解不同方案的适用场景、使用限制等。

默认HPA只支持基于CPU和内存的自动伸缩,并不能满足全部业务场景的运维需求,以IO密集型系统为例,CPU和内存并不是系统的唯一瓶颈。本教程将介绍如何实现基于QPS数据的应用弹性伸缩,更多应用弹性伸缩场景,请参见容器水平伸缩

部署准备

10

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    1. 为节省成本,本方案默认全部选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。

    2. 完成本方案的部署及体验,预计产生费用不超过10元(假设您选择本文示例规格资源,且资源运行时间不超过60分钟。实际情况中可能会因您操作过程中实际使用的流量差异,会导致费用有所变化,请以控制台显示的实际报价以及最终账单为准,如下表格仅供参考)。

      序号

      产品

      规格

      地域

      1

      云服务器 ECS

      ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见ECS选型最佳实践

      本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例,如果您发现目标可用区无推荐规格的实例,可以选择其他可用区或者其他规格的实例。

      华东1(杭州)

      2

      应用型负载均衡ALB

      功能版本:标准版。

      华东1(杭州)

      3

      容器服务Kubernetes版

      集群版本:ACK托管集群Pro版。

      华东1(杭州)

      4

      日志服务SLS

      无规格要求。

      华东1(杭州)

创建专有网络VPC和交换机

您需要创建1个专有网络VPC和2个交换机(建议您在目标地域选择两个不同的可用区,分别创建2个对应可用区的交换机,实现可用区级故障灾备能力)。

  1. 登录专有网络管理控制台

  2. 在顶部菜单栏,选择华东1(杭州)地域。

  3. 在左侧导航栏,单击专有网络

  4. 专有网络页面,单击创建专有网络

  5. 创建专有网络页面,配置1个专有网络和2台交换机。配置交换机时,请确保交换机所属的可用区的ECS、ALB处于可用状态。

    项目

    说明

    示例值

    VPC名称

    建议您在部署过程中新建一个VPC作为本方案的专有网络。部署过程中填写VPC名称即可创建对应名称的VPC。

    长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

    k8s-hpa-vpc

    VPC IPv4网段

    在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见组成部分

    在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段一旦投入使用,调整过程复杂,因此规划十分重要。

    192.168.0.0/16

    Vswitch名称

    建议您在部署过程中在新建的VPC内创建虚拟交换机。部署过程中填写交换机名称即可创建对应名称的虚拟交换机。

    长度为2~128个字符,以英文大小写字母或中文开头,可包含数字、下划线(_)和连字符(-)。

    k8s-hpa-vswitch-1

    k8s-hpa-vswitch-2

    Vswitch可用区

    建议选择排序靠后的可用区,一般此类可用区较新。新的可用区资源更充沛,新规格也会在新的可用区优先上线。

    说明

    请您参见公有云支持的地域和可用区,选择应用型负载均衡ALB产品支持的地域和可用区,否则会导致后续步骤无法操作。

    可用区 J

    可用区 K

    Vswitch IPv4网段

    每台虚拟交换机需要一个IPv4网段。

    192.168.0.0/24

    192.168.1.0/24

创建日志服务SLS

您需要创建1个日志服务SLS Project,用于存储系统访问记录,容器服务也会通过访问记录统计QPS作为HPA弹性伸缩的依据。

  1. 登录日志服务SLS控制台

  2. Project列表,单击创建Project(SLS Logstore后续会由容器服务自动创建,当前步骤无需手动创建SLS Logstore)。

    项目

    说明

    示例值

    所属地域

    选择部署地域。

    华东1(杭州)

    Project名称

    建议您在部署过程中新建一个SLS Project作为本教程的日志服务项目。

    注意:SLS Project名称在阿里云地域内全局唯一,创建后不可修改。

    k8s-hpa-sls-project

配置ACK集群

20

创建ACK集群

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 在集群列表页,点击创建集群

  3. 集群配置

    参数

    描述

    示例值

    集群版本

    容器服务ACK提供多种集群类型,包括ACK托管集群、ACK Serverless集群、ACK Edge集群等,各版本差异请查看容器服务产品简介,本教程使用ACK托管集群Pro版。

    ACK托管版

    集群名称

    集群的名称。长度为1~63个字符,可包含数字、下划线(_)或中划线(-),需以英文大小写字母、中文或数字开头。

    k8s-hpa-cluster

    集群规格

    选择集群规格,本教程使用Pro版。

    Pro版

    地域

    选择集群所在的地域。

    华东1(杭州)

    付费类型

    容器服务Kubernetes版支持按量付费和包年包月两种付费类型,本教程使用按量付费类型。

    按量付费

    Kubernetes 版本

    显示当前ACK支持的Kubernetes版本,建议选择最新版本。

    1.28.9-aliyun.1

    专有网络

    从VPC下拉列表中选择一个VPC。

    选择资源准备步骤中创建的VPC

    交换机

    设置虚拟交换机,为提升系统可用性,建议您至少选择两台交换机。

    选择资源准备步骤中创建的交换机

    安全组

    支持选择自动创建普通安全组自动创建企业级安全组选择已有安全组。有关安全组的详细内容,请参见安全组概述,本教程选择自动创建企业级安全组。

    自动创建企业级安全组

    API server 访问

    您可以设置是否开放使用 EIP 暴露 API Server,为方便后续步骤使用kubectl工具,本教程选择使用 EIP 暴露 API Server

    使用 EIP 暴露 API server

    网络插件

    设置启用的网络插件和插件配置,支持Flannel和Terway网络插件。详细信息,请参见使用Terway网络插件,本教程使用Terway网络插件。

    Terway

    Pod 交换机

    网络插件选择Terway时,您需要为Pod分配IP的虚拟交换机。每个Pod虚拟交换机分别对应一个Worker节点的虚拟交换机,Pod虚拟交换机和Worker节点的虚拟交换机的可用区需保持一致。

    选择资源准备步骤中创建的交换机

  4. 节点池配置

    参数

    描述

    示例值

    节点池名称

    输入自定义的节点池名称。

    k8s-hpa-cluster-nodepool

    容器运行时

    根据集群Kubernetes版本选择容器运行时

    • containerd:推荐使用,支持所有版本的集群。

    • 安全沙箱:支持1.24及以下版本的集群。

    • Docker:支持1.22及以下版本的集群。

    更多信息,请参见如何选择Docker运行时、containerd运行时、或者安全沙箱运行时?

    本教程使用推荐的containerd容器运行时。

    containerd 1.6.28

    实例规格

    根据实例规格或属性选择Worker节点池使用的ECS实例,可通过vCPU、内存、规格族、架构等属性进行筛选。

    节点池扩容时,将从选中的实例规格中扩容。具体扩容到的实例规格取决于节点池扩缩容策略。选择的实例规格越多,节点池成功弹出节点的概率越大。

    由于实例规格不可用或库存不足,导致节点池弹出节点失败时,可以尝试添加更多实例规格。

    本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例。

    ecs.c6.xlarge

    ecs.c7.xlarge

    操作系统

    选择操作系统。

    Alibaba Cloud Linux 3

    登录方式

    目前支持设置密钥设置密码创建后设置,本教程使用设置密码的方式

    设置密码

    系统盘

    您可以选择配置更多系统盘类型,配置与系统盘不同的磁盘类型,提高扩容成功率。创建实例时,系统将根据指定的磁盘类型顺序,选择第一个匹配的磁盘类型用于创建实例。

    • ESSD云盘

    • 40GiB

    • 性能PL0

    期望节点数

    建议创建时至少选择两台节点,创建完成后,可以根据您的实际情况,增减节点。节点太少或者规格太低均会影响集群组件的运行。

    2

    云监控插件

    高级选项(选填)中配置。

    是否安装云监控插件。安装后,可在云监控控制台查看所创建ECS实例的监控信息。

    说明

    该选项仅对节点池新增节点生效,对节点池已有节点无效。已有节点如需安装云监控插件,请通过云监控控制台安装。

    安装插件

    公网 IP

    高级选项(选填)中配置。

    是否为节点分配IPV4地址。如果未选中,不会配公网IP地址,当选择公网IP后,还需配置带宽计费方式带宽峰值

    不分配公网IP

  5. 组件配置

    参数

    描述

    示例值

    Ingress

    设置是否安装Ingress网络组件,本教程使用ALB作为负载均衡器,选择ALB Ingress。

    • ALB Ingress

    • 新建ALB实例

    • 网络类型:公网

    • 虚拟交换机:选择资源准备步骤中创建的交换机

    容器监控

    默认选中使用 Prometheus 监控服务,为容器服务ACK集群提供基础监控和报警。

    本教程不需要使用Prometheus监控服务,不选中容器监控

    日志服务

    设置是否启用日志服务,您可使用已有Project或新建一个Project。

    选择使用已有Project,请选择部署准备步骤中创建的SLS Project

    控制平面组件日志

    设置是否开启控制平面组件日志,您可使用已有Project或新建一个Project。开启后将从ACK控制层收集托管集群控制平面组件日志到您账号中的SLS日志服务的Log Project中。

    选择使用已有Project,请选择部署准备步骤中创建的SLS Project

  6. 确认配置,检查前几个步骤的配置是否正确,如无误可以点击创建集群。请访问容器服务控制台,在左侧导航栏选择集群,进入集群列表页观察集群创建状态。

安装监控插件

为后续ACK集群能够获取应用QPS数据进行弹性伸缩,需要为ACK集群安装监控插件。

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. Helm页面,单击创建。参考如下信息完成基础信息配置。

    参数

    示例值

    应用名

    ack-alibaba-cloud-metrics-adapter

    命名空间

    kube-system

    来源

    默认为应用市场

    Chart

    • 应用场景:选择全部

    • 支持架构:选择amd64

    • 搜索框:搜索ack-alibaba-cloud-metrics-adapter。

    选中ack-alibaba-cloud-metrics-adapter,单击下一步

  4. 参数配置页面,选择Chart 版本,建议您选择最新版本,然后单击确定

配置kubectl工具

CloudShell是阿里云推出的云命令行工具,您可以在任意浏览器上运行CloudShell命令管理阿里云资源。本教程利用CloudShell执行kubectl命令来管理集群。

  1. 开启API Server的公网访问能力。CloudShell仅支持通过公网连接集群,因此集群的API Server必须已开启公网访问能力。在创建ACK集群步骤中,已介绍如何创建集群时开启API Server的公网访问能力,如果您创建集群时未开启该能力,请参考控制集群API Server的公网访问能力了解已有集群如何开启API Server的公网访问能力。

  2. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  3. 在集群列表页面,单击目标集群名称,进入集群详情页。

  4. 在集群详情页,单击通过CloudShell管理集群

    说明

    使用CloudShell时,某些场景会出现挂在存储空间的提示,可以根据您的真实使用场景进行选择,本教程选择暂不创建

    image

  5. 以当前集群的Namespace为例,检查配置是否正确。

    kubectl get namespace

    预期输出:

    NAME              STATUS   AGE
    arms-prom         Active   56m
    default           Active   60m
    kube-node-lease   Active   60m
    kube-public       Active   60m
    kube-system       Active   60m

配置应用

15

创建后端应用

本教程以部署两个Nginx应用为例,演示如何通过配置ALB Ingress,实现相同域名不同URL路径的流量转发。

前端请求

流量转发至

host/coffee

coffee服务

host/tea

tea服务

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

单击使用YAML创建资源

  1. 示例模板:选择自定义

  2. 模板:输入YAML配置文件代码。

YAML配置文件参考

apiVersion: apps/v1
kind: Deployment
metadata:
  name: coffee
spec:
  replicas: 2
  selector:
    matchLabels:
      app: coffee
  template:
    metadata:
      labels:
        app: coffee
    spec:
      containers:
      - name: coffee
        image: icms-default-registry.cn-hangzhou.cr.aliyuncs.com/solution/demos:0.1-hap
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: coffee-svc
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: coffee
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tea
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tea
  template:
    metadata:
      labels:
        app: tea
    spec:
      containers:
      - name: tea
        image: icms-default-registry.cn-hangzhou.cr.aliyuncs.com/solution/demos:0.1-hap
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: tea-svc
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: tea
  1. 配置完成后单击创建,页面将提示创建成功

  2. 检查Deployment和Service创建成功:

    1. 在左侧导航栏,选择工作负载 > 无状态。可查看到名称为coffee和tea的Deployment已存在。

    2. 在左侧导航栏,选择网络 > 服务。可查看到名称为coffee-svc和tea-svc的Service已存在。

创建AlbConfig

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 自定义资源

  3. 选择资源定义,单击使用YAML创建资源

    1. 示例模板:选择自定义

    2. 模板:输入YAML配置文件代码。

    YAML配置文件参考

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: k8s-hpa-alb-config
    spec:
      config:
        name: k8s-hpa-alb
        addressType: Internet
        zoneMappings:
        - vSwitchId: vsw-uf6ccg2a9g71hx8go****
        - vSwitchId: vsw-uf6nun9tql5t8nh15****
        accessLogConfig:
          logProject: "k8s-hpa-sls-project"
          logStore: "alb_k8s_hpa_sls_logstore"
      listeners:
        - port: 80
          protocol: HTTP

    需要调整参数说明如下:

    参数

    是否必填

    说明

    vSwitchId

    填写创建ACK集群时配置的虚拟交换机ID。

    spec.config.accessLogConfig.logProject

    Alb负载均衡实例接收到用户请求后,会将请求数据存储到SLS日志服务中,请填写部署准备步骤中创建的SLS Project。

    spec.config.accessLogConfig.logStore

    设置Logstore名称,需要以alb_开头。

    说明

    请设置一个不存在的logStore,系统将会自动创建,填写手动创建的logStore会导致后续步骤失败。

    可选择调整参数说明如下:

    参数

    是否必填

    说明

    metadata.name

    AlbConfig的名称。

    说明

    AlbConfig的名称在集群中必须是唯一的。因此,在创建AlbConfig时,您需要确保AlbConfig名称的唯一性,以避免命名冲突。

    请您保存名称,后续的步骤需要再次使用该名称。

    spec.config.name

    ALB实例的名称。

    spec.config.addressType

    ALB实例的网络类型。取值如下:

    • Internet(默认值):公网类型。面向公网提供应用型负载均衡服务,公网可访问。

      说明

      应用型负载均衡通过绑定弹性公网IP进行公网服务,使用公网类型ALB实例将收取弹性公网IP的实例费与带宽、流量费用,详情参见按量付费

    • Intranet:私网类型。面向VPC内部提供应用型负载均衡服务,公网不可访问。

    spec.config.zoneMappings

    设置ALB交换机ID,请填写部署准备步骤中创建的交换机ID。创建交换机具体操作请参见创建和管理交换机

    说明
    • 指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB支持的地域与可用区,请参见ALB支持的地域与可用区

    • 应用型负载均衡支持多可用区部署,若当前地域支持2个及以上可用区,请至少选择2个或以上不同可用区的交换机,以保障业务的高可用性。

    spec.config.accessLogConfig.logProject

    Alb负载均衡实例接收到用户请求后,会将请求数据存储到SLS日志服务中,请填写部署准备步骤中创建的SLS Project。

    spec.config.accessLogConfig.logStore

    设置Logstore名称,需要以alb_开头。

    说明

    请设置一个不存在的logStore,系统将会自动创建,填写手动创建的logStore会导致后续步骤失败。

    spec.listeners

    配置ALB的监听端口和协议。本教程配置示例为端口80的HTTP监听。

    监听定义了流量进入负载均衡的方式和规则,此处建议保留该配置,否则您需要另行创建监听才可使用ALB Ingress。

  4. 配置完成后单击创建,页面将提示创建成功

  5. 检查ALB实例创建成功:

    1. 登录应用型负载均衡ALB控制台

    2. 在顶部菜单栏,选择实例所属的地域。

    3. 应用型负载均衡 ALB > 实例页面,在实例列表可查看到名称为k8s-hpa-alb的ALB实例,表示实例创建成功。

创建IngressClass

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 自定义资源

  3. 单击右上角使用YAML创建资源

    1. 示例模板:选择自定义

    2. 模板:输入YAML配置文件代码。

    YAML配置文件参考

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: k8s-hpa-alb-ingress-class
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: k8s-hpa-alb-config

    可调整参数说明如下:

    参数

    是否必填

    说明

    metadata.name

    IngressClass的名称。

    说明

    IngressClass的名称在集群中必须是唯一的。因此,在创建IngressClass时,您需要确保IngressClass名称的唯一性,以避免命名冲突。

    spec.parameters.name

    关联的AlbConfig的名称,与前一步创建AlbConfig的metadata.name保持一致。

  4. 配置完成后单击创建,页面将提示创建成功

  5. 检查IngressClass创建成功:

    1. 在左侧导航栏,选择工作负载 > 自定义资源

    2. 选择资源对象浏览器页签。

    3. API组搜索栏中,输入IngressClass进行搜索,可查看到对应的IngressClass已创建。

创建Ingress

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 单击右上角使用YAML创建资源

    1. 示例模板:选择自定义

    2. 模板:输入YAML配置文件代码。

    YAML配置文件参考

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: k8s-hpa-alb-ingress
    spec:
      ingressClassName: k8s-hpa-alb-ingress-class
      rules:
       - http:
          paths:
          # 配置Context Path
          - path: /tea
            pathType: ImplementationSpecific
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
          # 配置Context Path
          - path: /coffee
            pathType: ImplementationSpecific
            backend:
              service:
                name: coffee-svc
                port: 
                  number: 80

    可调整参数说明如下:

    参数

    是否必填

    说明

    metadata.name

    Ingress的名称。

    说明

    Ingress的名称在集群中必须是唯一的。因此,在创建Ingress时,您需要确保Ingress名称的唯一性,以避免命名冲突。

    spec.ingressClassName

    关联的IngressClass的名称,与前一步创建IngressClass的metadata.name保持一致。

    spec.rules.http.paths.path

    转发路径URL。

    spec.rules.http.paths.pathType

    URL匹配规则。详情可参考基于URL路径转发请求

    spec.rules.http.paths.backend.service.name

    填写您此前创建的Service名称。

    spec.rules.http.paths.backend.service.port.number

    填写您此前创建的Service的服务端口号。

    这个端口号的设置非常重要,因为它决定了在路由到后端服务时使用的端口。确保端口号正确设置,以确保请求可以正确路由到后端服务并被处理。

  4. 配置完成后单击创建,页面将提示创建成功

  5. 检查Ingress创建成功:

    1. 在左侧导航栏,选择网络 > 路由。可查看到名称为k8s-hpa-alb-ingress的Ingress已部署。

    2. 在k8s-hpa-alb-ingress的端点列,可查看到端点信息。

应用验证

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 在路由列表页,找到前一步创建的Ingress,查看目标Ingress的端点信息。

    image

  4. 通过端点信息,拼装访问地址,分别是http://alb-xxx.cn-hangzhou.alb.aliyuncs.com/tea和http://alb-xxx.cn-hangzhou.alb.aliyuncs.com/coffee

  5. 通过浏览器或curl命令请求拼装的两个地址,访问应用服务

    image

    image

配置弹性伸缩

15

配置节点池弹性伸缩

当集群的容量规划无法满足应用Pod调度时,您可以使用节点自动伸缩功能实现节点的自动扩缩。节点自动伸缩适用于扩容规模较小(例如开启弹性的节点池数量少于20,或对应节点池中的节点数量少于100),工作负载批次较为稳定,以单次伸缩为主等业务场景。

开启节点自动伸缩

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,单击节点伸缩后方的去配置

    1.jpg

  4. 首次使用集群自动弹性伸缩功能时,按照页面提示,开通ESS服务并完成授权(如已开通并授权,请跳过)。

  5. 节点伸缩配置页面,选择节点伸缩方案自动伸缩,配置伸缩的配置项,然后单击确定

    配置

    说明

    节点池扩容顺序策略

    • 随机策略:存在多个可扩容节点池时,从中任意选择一个节点池进行扩容。

    • 默认策略:存在多个可扩容节点池时,从中选择一个资源浪费最少的节点池进行扩容。

    • 优先级策略:存在多个可扩容节点池时,会按照您自定义的顺序选择优先级高的节点池进行扩容。

      需在创建开启了弹性的节点池后再操作。

    弹性灵敏度

    用于调整系统判断伸缩的间隔时间。默认值为60s。

    实施弹性伸缩时,弹性组件会基于调度情况自动触发扩容。您只需配置缩容条件。

    重要
    • ECS节点:仅当同时满足缩容阈值缩容触发时延静默时间三个条件时,弹性组件才有可能执行节点缩容。

    • GPU节点:仅当同时满足GPU 缩容阈值缩容触发时延静默时间三个条件时,弹性组件才有可能执行GPU节点缩容。

    允许缩容

    是否允许进行节点缩容。关闭时,缩容相关配置不生效。请谨慎设置。

    缩容阈值

    启用节点自动伸缩的节点池中,单个节点的请求资源(Request)与单个节点资源容量的比值。

    仅当该比值低于配置的阈值时,即节点的CPU和内存资源利用率均低于缩容阈值时,节点才有可能被缩容。

    GPU 缩容阈值

    GPU实例的缩容阈值。

    仅当该比值低于配置的阈值时,即节点的CPU、内存和GPU资源利用率均低于GPU 缩容阈值时,GPU节点才有可能被缩容。

    缩容触发时延

    从检测到有缩容需求(达到缩容阈值)到实际执行缩容操作(缩容Pod数量)之间的时间间隔。单位:分钟。默认值:10分钟。

    重要

    仅当满足缩容阈值配置,且达到缩容触发时延后,弹性组件才有可能执行节点缩容。

    静默时间

    距离最近一次扩容完成后,弹性组件不执行缩容的时间间隔。

    在静默时间内,弹性组件不会缩容节点,但仍会判断节点是否可以缩容;超过静默时间后,如果节点满足缩容阈值和缩容触发时延两个条件,弹性组件则会正常执行缩容。例如,当静默时间为10分钟,缩容触发时延为5分钟时,弹性组件在最近一次扩容后的10分钟内不会缩容节点,但会在静默的10分钟内判断节点是否符合缩容条件。等待静默时间结束,节点达到缩容阈值且时间超过缩容触发时延规定的5分钟时,弹性组件会继续执行缩容。

    查看高级配置的配置项说明

    配置项

    说明

    Pod 终止超时时间

    缩容节点时等待节点上Pod终止的最长时间。单位:秒。

    Pod 最小副本数

    节点缩容前每个ReplicaSet中允许的Pod最小数量。

    开启 Daemonset Pod 排水

    开启DaemonSet Pod排水后,节点缩容时会驱逐节点上的DaemonSet Pod。

    跳过有 kube-system 命名空间下 Pod 所在节点

    开启后,当集群执行节点自动缩容操作时,可以忽略运行在kube-system命名空间下的Pod所在的节点,确保这些节点不受缩容的影响。

    说明

    此功能对DaemonSet Pod和Mirror Pod不生效。

配置开启弹性的节点池

节点自动伸缩的扩缩对象为开启了自动伸缩节点池的节点。因此,配置节点自动伸缩后,您还需要配置将创建ACK集群的节点池开启弹性。

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 在节点池列表页找到之前步骤创建的节点池,点击编辑。

  4. 在编辑页面,找到自动伸缩配置,选择开启自动弹性伸缩,之后点击确认按钮。

配置HPA弹性伸缩

默认HPA只支持基于CPU和内存的自动伸缩,并不能满足全部业务场景的运维需求,以IO密集型系统为例,CPU和内存并不是系统的唯一瓶颈,本教程将介绍如何实现基于QPS数据的应用弹性伸缩。当同时指定多种HPA指标时,HPA会在检测到任何一个指标达到扩缩阈值后执行扩缩容操作。

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,在集群详情页,单击通过CloudShell管理集群,用于运行配置ACK集群步骤中配置的kubectl工具。

  3. 进入CloudShell界面后,执行shell命令创建yaml文件

    vim hpa.yaml
  4. 使用以下内容,填充到hpa.yaml文件中。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: k8s-alb-tea-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tea
      minReplicas: 2
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: sls_alb_ingress_qps
              selector:
                matchLabels:
                  sls.project: "k8s-hpa-sls-project"  
                  sls.logstore: "alb_k8s_hpa_sls_logstore" 
                  sls.ingress.route: "default-tea-svc-80"
            target:
              type: AverageValue
              averageValue: 2
        - resource:
            name: cpu
            target:
              averageUtilization: 80
              type: Utilization
          type: Resource
        - resource:
            name: memory
            target:
              averageUtilization: 80
              type: Utilization
          type: Resource

    可调整参数说明如下:

    参数

    说明

    metadata.name

    HPA的名称。

    spec.scaleTargetRef.name

    应用名称,本教材使用前面步骤创建的tea应用作为示例。

    spec.minReplicas

    最小容器数量,该Deployment可缩容的容器数量下限,该值需要设置为大于等于1的整数。

    spec.maxReplicas

    最大容器数量,该Deployment可扩容的容器数量上限,该值需要大于最小副本数。

    spec.metrics.external

    默认HPA只支持基于CPU和内存的自动伸缩,external代表使用了除CPU和内存以外的扩展HPA指标,本教程中的QPS指标属于external类型。

    spec.metrics.external.metric.name

    HPA弹性伸缩使用的指标,sls_alb_ingress_qps代表ALB数据的IngressRoute每秒查询率,更多指标请查看阿里云HPA指标

    spec.metrics.external.metric.selector.matchLabels.sls.project

    填写日志服务SLS Project信息,用于监控组件获取应用访问信息,与创建AlbConfig步骤中设置的spec.config.accessLogConfig.logProject保持一致

    spec.metrics.external.metric.selector.matchLabels.sls.logstore

    填写日志服务SLS Logstore信息,用于监控组件获取应用访问信息,与创建AlbConfig步骤中设置的spec.config.accessLogConfig.logStore保持一致

    spec.metrics.external.metric.selector.matchLabels.sls.ingress.route

    格式为<namespace>-<svc>-<port>,本教材实例为default-tea-svc-80。

    spec.metrics.external.target.type

    AverageValue表示QPS要除以Pod的数目进行判断。

    spec.metrics.resource

    默认HPA指标,支持CPU和内存两种,通过spec.metrics.resource.name设置为cpu和memory两种方式进行配置。

    spec.metrics.resource.target

    设置HPA默认指标的利用率阈值,示例中CPU阈值和内存阈值都配置为80%。

    本教程以QPS、CPU、内存三个不同的HPA指标作为示例,您可以根据业务情况做出相应的修改,比如不需要使用内存HPA指标,可以删除resource.name为memory的相关配置。

  5. 执行以下命令,创建HPA。

    kubectl apply -f hpa.yaml
  6. 检查创建成功:

    1. 在左侧导航栏,选择自动伸缩 > 工作负载伸缩

    2. 单击水平伸缩页签,然后选择HPA,查看扩缩容状态和任务列表。

完成及清理

20

方案验证

通过Apache Benchmark测试工具,执行压测脚本,验证容器化集群的弹性伸缩

  1. 安装测试工具Apache Benchmark,Mac OS操作系统默认安装了该测试工具,其他操作系统安装教程请参见官方文档image

  2. 使用Apache Benchmark测试工具,执行压测脚本对应用进行压测,校验QPS变化后,观察Pod的弹性伸缩的执行情况。

    压测脚本:

    ab -c 5 -n 5000 http://alb-***.cn-hangzhou.alb.aliyuncs.com/tea

    命令说明:

    命令

    说明

    ab

    Apache Benchmark提供的压测工具命令。

    -c 5

    一次创建的请求个数。

    -n 5000

    一次测试会话中执行的请求个数。

    http://alb-***.cn-hangzhou.alb.aliyuncs.com/tea

    tea服务应用的访问地址,在应用验证步骤中讲解了如何获取服务应用的访问地址。

  3. 等待压测命令执行一段时间后,请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  4. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态,在应用列表页单击tea应用名称。

  5. 在tea应用详情页面,选择容器伸缩,在前面步骤创建名称为k8s-alb-tea-hpa的HPA,单击事件查看HPA的弹性伸缩执行情况,随着QPS的增加,Pod数目从2扩容到10,之后随着QPS的降低,Pod数目从10缩容到2,基于QPS指标的HPA已经生效。

    image

  6. 继续等待一段时间后,在集群详情页的左侧导航栏,选择节点管理 > 节点池,在节点池列表页单击前面步骤创建名称为k8s-hpa-cluster-nodepool的节点池。

  7. 在节点池详情页面,选择伸缩活动,查看节点池的弹性伸缩执行情况,随着Pod数目的增加,节点数目从2扩容到3,之后随着Pod数目的降低,节点数目从3缩容到2,节点池的弹性伸缩已经生效。

    image

清理资源

  1. 释放ACK集群:

    1. 登录容器服务控制台,在左侧导航栏,选择集群,进入集群列表页,找到目标集群,在更多选项中查看是否有关闭集群删除保护状态的选项,如果有请单击关闭集群删除保护状态,在弹出的对话框中将集群删除保护选项进行取消。

    2. 在更多选项中单击删除,按照界面提示释放实例。

  2. 释放SLS Project:

    登录日志服务控制台,在Project列表页找到前面步骤中创建的名称为k8s-hpa-sls-project的Project,单击删除,按照界面提示释放实例。

  3. 释放台交换机:

    登录专有网络控制台,在交换机页面,找到目标交换机,然后在操作列单击删除,按照界面提示释放实例。

  4. 释放专有网络VPC:

    登录专有网络控制台,在专有网络页面,找到目标VPC,然后在操作列单击删除,按照界面提示释放实例。

一键部署

50

https://www.aliyun.com/solution/tech-solution/ack-hpa

方案概览

通过本教程,您将学习如何在阿里云容器服务上部署的应用,使用应用型负载均衡ALB(Application Load Balancer)七层负载均衡服务,将来自客户端的请求分发至后端容器Pod上,同时利用容器水平伸缩HPA(Horizontal Pod Autoscaler)功能实现弹性伸缩,能够在业务负载急剧飙升时快速扩容多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容以节省资源,无需您人为干预。HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景,例如电商服务、线上教育、金融服务等。

方案架构

本架构采用单地域双可用区部署,将系统部署在2个不同可用区,实现了可用区级故障灾备能力,同时在节点和Pod两个维度开启了弹性伸缩能力,保证了业务的连续性。

image

本方案的技术架构包括以下基础设施和云服务:

  • 1个专有网络VPC和2个交换机:构建云上私有网络。

  • 1个应用型负载均衡ALB:负载均衡服务。

  • 1个容器服务Kubernetes版集群:容器服务平台,提供容器应用管理服务。

  • 1个SLS Project和1个SLS Logstore:提供访问记录的存储服务。

  • 2-3台云服务器ECS:由容器服务Kubernetes版集群创建并部署Nginx服务,作为Web站点。

应用型负载均衡ALB(Application Load Balancer):专门面向七层应用,提供强大的应用层处理能力和丰富的高级转发规则。单ALB实例性能最大可达100万QPS。更多信息,请参见什么是应用型负载均衡ALB

Pod水平自动扩缩HPA(Horizontal Pod Autoscaler):Kubernetes内置组件,提供Pod水平扩缩容能力。

此外阿里云容器服务提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,更多信息,请参见弹性伸缩概述,了解不同方案的适用场景、使用限制等。

默认HPA只支持基于CPU和内存的自动伸缩,并不能满足全部业务场景的运维需求,以IO密集型系统为例,CPU和内存并不是系统的唯一瓶颈。本教程将介绍如何实现基于QPS数据的应用弹性伸缩,更多应用弹性伸缩场景,请参见容器水平伸缩

部署准备

10

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    1. 为节省成本,本方案默认全部选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。

    2. 完成本方案的部署及体验,预计产生费用不超过10元(假设您选择本文示例规格资源,且资源运行时间不超过60分钟。实际情况中可能会因您操作过程中实际使用的流量差异,会导致费用有所变化,请以控制台显示的实际报价以及最终账单为准,如下表格仅供参考)。

      序号

      产品

      规格

      地域

      1

      云服务器 ECS

      ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见ECS选型最佳实践

      本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例,如果您发现目标可用区无推荐规格的实例,可以选择其他可用区或者其他规格的实例。

      华东1(杭州)

      2

      应用型负载均衡ALB

      功能版本:标准版。

      华东1(杭州)

      3

      容器服务Kubernetes版

      集群版本:ACK托管集群Pro版。

      华东1(杭州)

      4

      日志服务SLS

      无规格要求。

      华东1(杭州)

一键部署

10

单击一键部署前往ROS控制台,选择ECS实例规格和可用区(注意需要选择两个不同的可用区),填写ACK托管版集群名称等额外信息。具体产生的费用根据您选择的ECS规格而不同,以控制台显示为准。

说明

本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例,如果您发现目标可用区无推荐规格的实例,可以选择其他可用区或者其他规格的实例。

说明

请您参见公有云支持的地域和可用区,选择应用型负载均衡ALB产品支持的地域和可用区,否则会导致后续步骤无法操作,建议您选择杭州地域可用区 J和可用区 K。

image

开始创建后,等待约10分钟左右,显示创建成功。

image

验证及清理

30

方案验证

一、通过访问应用服务,验证容器服务的可用性

  1. 请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 在路由列表页,找到前一步创建的Ingress,查看目标Ingress的端点信息。

    image

  4. 通过端点信息,拼装访问地址,分别是http://alb-xxx.cn-hangzhou.alb.aliyuncs.com/tea和http://alb-xxx.cn-hangzhou.alb.aliyuncs.com/coffee

  5. 通过浏览器或curl命令请求拼装的两个地址,访问应用服务

    image

    image

二、通过Apache Benchmark测试工具,执行压测脚本,验证容器化集群的弹性伸缩

  1. 安装测试工具Apache Benchmark,Mac OS操作系统默认安装了该测试工具,其他操作系统安装教程请参见官方文档image

  2. 使用Apache Benchmark测试工具,执行压测脚本对应用进行压测,校验QPS变化后,观察Pod的弹性伸缩的执行情况。

    压测脚本:

    ab -c 5 -n 5000 http://alb-***.cn-hangzhou.alb.aliyuncs.com/tea

    命令说明:

    命令

    说明

    ab

    Apache Benchmark提供的压测工具命令。

    -c 5

    一次创建的请求个数。

    -n 5000

    一次测试会话中执行的请求个数。

    http://alb-***.cn-hangzhou.alb.aliyuncs.com/tea

    tea服务应用的访问地址,在应用验证步骤中讲解了如何获取服务应用的访问地址。

  3. 等待压测命令执行一段时间后,请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。

  4. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态,在应用列表页单击tea应用名称。

  5. 在tea应用详情页面,选择容器伸缩,在前面步骤创建名称为k8s-alb-tea-hpa的HPA,单击事件查看HPA的弹性伸缩执行情况,随着QPS的增加,Pod数目从2扩容到10,之后随着QPS的降低,Pod数目从10缩容到2,基于QPS指标的HPA已经生效。

    image

  6. 继续等待一段时间后,在集群详情页的左侧导航栏,选择节点管理 > 节点池,在节点池列表页单击前面步骤创建名称为k8s-hpa-cluster-nodepool的节点池。

  7. 在节点池详情页面,选择伸缩活动,查看节点池的弹性伸缩执行情况,随着Pod数目的增加,节点数目从2扩容到3,之后随着Pod数目的降低,节点数目从3缩容到2,节点池的弹性伸缩已经生效。

    image

清理资源

如果您无需继续使用,请尽快删除资源,避免继续产生费用:

  1. 登录ROS控制台

  2. 在左侧导航栏,选择资源栈

  3. 资源栈页面的顶部选择部署的资源栈所在地域,找到资源栈,然后在其右侧操作列,单击删除

  4. 删除资源栈对话框,选择删除方式释放资源,然后单击确定,根据提示完成资源释放。