应用容器水平伸缩(HPA)

应用容器水平伸缩HPA(Horizontal Pod Autoscaling)可以动态调整应用的副本数,适应业务流量的波峰波谷,适用于Deployment、StatefulSet等实现Scale接口的对象。本文介绍如何在ACK One应用分发中使用容器水平伸缩(HPA)控制关联集群的应用副本数。

前提条件

背景信息

应用通过Fleet实例分发后,Fleet实例每5分钟查看关联集群,并保证应用相关资源在关联集群和Fleet实例中的一致性。因此,直接使用容器水平伸缩(HPA)修改副本数会和Fleet实例应用一致性功能冲突,需要在应用分发中使用容器水平伸缩(HPA)控制关联集群的应用副本数。

操作步骤

  1. 执行以下命令,创建命名空间。

    替换demo为待创建的命名空间名称。

    kubectl create namespace demo
  2. 执行以下命令,获取关联集群。

    kubectl amc get managedcluster

    预期输出:

    Name             Alias           HubAccepted
    c4a416e****      cluster1        true
  3. 在Fleet实例上创建Deployment和容器水平伸缩(HPA)资源。

    1. 使用以下内容,创建app-meta.yaml文件,包括Deployment和容器水平伸缩(HPA)资源。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx
        namespace: demo
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9
              ports:
              - containerPort: 80
              resources:
                requests:
                  cpu: 500m
      ---
      apiVersion: autoscaling/v2beta2
      kind: HorizontalPodAutoscaler
      metadata:
        name: nginx-hpa
        namespace: demo
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: nginx
        minReplicas: 1
        maxReplicas: 10
        metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 50
    2. 执行以下命令,将资源下发到Fleet实例。

      kubectl apply -f app-meta.yaml
  4. 创建应用分发规则,通过创建apply-once policy使Fleet实例忽略Deployment副本数的变化,不再保持Deployment的副本数和Fleet实例的一致性。

    1. 使用以下内容,创建app.yaml文件,定义应用分发规则。

      apiVersion: core.oam.dev/v1beta1
      kind: Application
      metadata:
        name: nginx
        namespace: demo
        annotations:
          app.oam.dev/publishVersion: version1
      spec:
        components:
          - name: nginx
            type: ref-objects
            properties:
              objects:
                - apiVersion: apps/v1
                  kind: Deployment
                  name: nginx
                - apiVersion: autoscaling/v1
                  kind: HorizontalPodAutoscaler
                  name: nginx-hpa
        policies:
          - name: apply-once
            type: apply-once      #apply-once policy定义Fleet实例忽略哪些资源,哪些字段的变化。
            properties:
              enable: true        #开启apply-once功能。
              rules:
                - selector:
                    componentNames: [ "nginx" ]         #选择特定的资源名称启动apply-once,本示例为Deployment名称nginx。
                    resourceTypes: [ "Deployment" ]     #通过资源类型选择特定资源启用apply-once。
                  strategy:
                    path: [ "spec.replicas" ]           #选择资源中的特定字段启用apply-once。
          - type: topology
            name: beijing-clusters
            properties:
              clusters: ["c4a416e****"]
    2. 执行以下命令,将分发规则下发到Fleet实例,Fleet实例根据分发规则,将Deployment和容器水平伸缩(HPA)下发到关联集群中。

      kubectl apply -f app.yaml
  5. 执行以下命令,查看应用部署情况。

    替换demo为您已创建的命名空间名称。

    kubectl get app nginx -n demo

    预期输出:

    NAME    COMPONENT   TYPE          PHASE     HEALTHY   STATUS      AGE
    nginx   nginx       ref-objects   running   true      Ready:2/2   51s
  6. 执行如下命令,获取关联集群的资源运行状态。

    kubectl amc get deployment,hpa -n demo -m c4a416e****

    预期输出:

    Run on ManagedCluster c4a416exxx (cluster1)
    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nginx   2/2     2            2           63s
    
    NAME                                            REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx   0%/50%    1         10        2          63s
  7. 当HPA生效后,执行以下命令,查看应用副本数。

    kubectl amc get pod -n demo -m c4a416e****

    预期输出:

    Run on ManagedCluster c4a416e**** (cluster1)
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-697b955cdc-b94nl   1/1     Running   0          6m

    可以看到在没有业务流量的情况下,副本缩小到1,符合预期。