ACK集群支持AHPA(Advanced Horizontal Pod Autoscaler)的弹性能力,满足在应用具备周期性的情况下,通过弹性预测,进行资源预热,解决您在服务使用中遇到的弹性滞后问题。本文介绍如何部署并使用AHPA。

前提条件

步骤一:安装Application Intelligence Controller

  1. 登录容器服务管理控制台,在左侧导航栏选择集群
  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理
  3. 组件管理页面,单击其他页签,然后在Application Intelligence Controller卡片中单击安装
  4. 安装组件Application Intelligence Controller对话框中,单击确定

步骤二:配置Prometheus数据源

  1. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > Prometheus实例列表
  3. Prometheus监控页面左上角选择Prometheus实例所在的地域,然后在目标实例右侧的操作列下单击设置
  4. 设置页面单击设置页签,根据需求复制HTTP API地址下的内网地址。
  5. 在K8s集群中设置Promethues查询地址。
    1. 使用以下内容,创建application-intelligence.yaml
      armsUrl表示ARMS Promethues访问地址,本文配置为上一步获取的内网地址。
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: application-intelligence
        namespace: kube-system
      data:
        armsUrl: "http://cn-hangzhou-intranet.arms.aliyuncs.com:9443/api/v1/prometheus/da9d7dece901db4c9fc7f5b9c40****/1581204543170042/cc6df477a982145d986e3f79c985a****/cn-hangzhou"
    2. 执行如下命令,部署application-intelligence。
      kubectl apply -f application-intelligence.yaml

步骤三:部署测试服务

测试服务包括fib-deployment、fib-svc以及用于模拟请求峰谷服务fib-loader,同时部署一个HPA资源用于与AHPA进行结果对比。

使用以下内容,创建demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fib-deployment
  namespace: default
  annotations:
    k8s.aliyun.com/eci-use-specs: "1-2Gi"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fib-deployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: fib-deployment
    spec:
      containers:
      - image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-server:20200820-171837
        imagePullPolicy: IfNotPresent
        name: user-container
        ports:
        - containerPort: 8080
          name: user-port
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: 2000Mi
          requests:
            cpu: "1"
            memory: 2000Mi
---
apiVersion: v1
kind: Service
metadata:
  name: fib-svc
  namespace: default
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: fib-deployment
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fib-loader
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: fib-loader
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: fib-loader
    spec:
      containers:
      - args:
        - -c
        - |
          /ko-app/fib-loader --service-url="http://fib-svc.${NAMESPACE}?size=35&interval=0" --save-path=/tmp/fib-loader-chart.html
        command:
        - sh
        env:
        - name: NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-loader:20201126-110434
        imagePullPolicy: IfNotPresent
        name: loader
        ports:
        - containerPort: 8090
          name: chart
          protocol: TCP
        resources:
          limits:
            cpu: "8"
            memory: 16000Mi
          requests:
            cpu: "2"
            memory: 4000Mi
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: fib-hpa
  namespace: default
spec:
  maxReplicas: 50
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: fib-deployment
  targetCPUUtilizationPercentage: 50
---

步骤四:部署AHPA

您可以通过提交AdvancedHorizontalPodAutoscaler资源配置弹性策略,具体操作如下。

  1. 使用以下内容,创建ahpa-demo.yaml
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: AdvancedHorizontalPodAutoscaler
    metadata:
      name: ahpa-demo
    spec:
      scaleStrategy: observer
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 40
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: fib-deployment 
      maxReplicas: 100
      minReplicas: 2
      stabilizationWindowSeconds: 300
      prediction:
        quantile: 95
        scaleUpForward: 180
      instanceBounds:
      - startTime: "2021-12-16 00:00:00"
        endTime: "2031-12-16 00:00:00"
        bounds:
        - cron: "* 0-8 ? * MON-FRI"
          maxReplicas: 15
          minReplicas: 4
        - cron: "* 9-15 ? * MON-FRI"
          maxReplicas: 15
          minReplicas: 10
        - cron: "* 16-23 ? * MON-FRI"
          maxReplicas: 20
          minReplicas: 15

    部分参数说明如下:

    参数是否必选说明
    scaleTargetRef用于指定目标Deployment。
    metrics用于配置弹性Metrics,当前支持CPU、GPU、Memory、QPS、RT等指标。
    metrics. resource. averageUtilization表示目前阈值,例如averageUtilization: 40表示CPU使用目标阈值为40%。
    scaleStrategy用于设置弹性伸缩模式。弹性伸缩模式包括autoobserver,默认值为observer
    • auto:表示由AHPA负责扩缩容。
    • observer:表示只观察,但不进行真正的伸缩动作。您可以通过这种方式观察AHPA的工作是否符合预期。
    maxReplicas表示最大扩容实例数。
    minReplicas表示最小缩容实例数。
    stabilizationWindowSeconds缩容冷却时间,默认300秒。
    prediction. quantile表示预测分位数,业务指标实际值低于设定目标值的概率越大表示越保守。取值范围为0~1,支持两位小数,默认值为0.99。推荐取值范围为0.90~0.99。
    prediction. scaleUpForward表示Pod达到Ready状态所需要的时间(冷启动时间)。
    instanceBounds表示扩缩容时间段实例数边界。
    • startTime:表示开始时间。
    • endTime:表示结束时间。
    instanceBounds. bounds. cron用于配置定时任务,Cron表达式表示一个时间集合,使用5个空格分隔的字段表示,例如- cron: "* 0-8 ? * MON-FRI"表示每月星期一到星期五晚上12点到早上8点执行任务。
    Cron表达式的字段解释如下,更多信息,请参见Cron表达式
    字段名是否必须允许的值允许的特定字符
    分(Minutes)0~59* / , -
    时(Hours)0~23* / , -
    日(Day of Month)1~31* / , – ?
    月(Month)1~12或JAN~DEC* / , -
    星期(Day of Week)0~6或SUN~SAT* / , – ?
    说明
    • 月(Month)和星期(Day of Week)字段的值不区分大小写,例如SUNSunsun效果一致。
    • 若星期(Day of Week)字段未配置,默认为 *
    • 特定字符说明:
      • *:表示所有可能的值。
      • /:表示指定数值的增量。
      • ,:表示列出枚举值。
      • -:表示范围。
      • ?:表示不指定值。
  2. 执行以下命令,创建AHPA弹性策略。
    kubectl apply -f fib-deployment.yaml

步骤五:查看预测结果

本文以弹性伸缩模式配置为observer为例,观察AHPA预测结果是否符合预期。

说明 由于预测需要历史7天的数据,上述示例部署完成之后,需要运行7天才可以看到预测结果。如果已有线上的应用可以直接在AHPA中指定该应用即可。
  1. 执行以下命令,查看AHPA弹性预测与使用HPA策略的对比效果。
    kubectl get --raw '/apis/metrics.alibabacloud.com/v1beta1/namespaces/default/predictionsobserver/fib-deployment'|jq -r '.content' |base64 -d > observer.html
  2. 打开observer.html查看预测结果。
    与使用HPA策略进行对比,基于CPU指标的AHPA预测结果示例如下:
    • Predict CPU Oberserver:蓝色表示HPA实际的CPU使用量,绿色表示AHPA预测出来的CPU使用量。绿色曲线高于蓝色,表明预测的CPU容量充足。CPU预测
    • Predict POD Oberserver:蓝色表示使用HPA实际的扩缩容Pod数,绿色表示AHPA预测出来的扩缩容Pod数,绿色曲线低于蓝色,表明预测的Pod数量更少。您可以将弹性伸缩模式设置为auto,以预测的Pod数进行设置,为您节省更多的Pod资源,避免资源的浪费。POD预测

    通过预测结果表明,弹性预测趋势符合预期。若经过观察后,符合预期,您可以将弹性伸缩模式设置为auto,由AHPA负责扩缩容。