配置 Pod 横向自动扩缩

本页面介绍了如何使用横向 Pod 自动扩缩以根据不同类型的指标自动扩缩 Deployment。您可以使用相同的准则为任何可扩缩的 Deployment 对象配置一个 HorizontalPodAutoscaler

准备工作

在开始之前,请确保您已执行以下任务:

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

适用于 HorizontalPodAutoscaler 对象的 API 版本

当您使用 Google Cloud Console 时,HorizontalPodAutoscaler 对象是使用 autoscaling/v2beta2 API 创建的。

当您使用 kubectl 创建或查看有关“横向 Pod 自动扩缩程序”的信息时,您可以指定 autoscaling/v1 API 或 autoscaling/v2beta2 API。

  • apiVersion: autoscaling/v1 为默认值,允许您仅根据 CPU 利用率进行自动扩缩。如需根据其他指标进行自动扩缩,建议使用 apiVersion: autoscaling/v2beta2配置 Deployment 中的示例使用的是 apiVersion: autoscaling/v1

  • 创建新的 HorizontalPodAutoscaler 对象时,建议使用 apiVersion: autoscaling/v2beta2。它可让您根据多个指标进行自动扩缩,包括自定义指标或外部指标。本主题中的所有其他示例均使用 apiVersion: autoscaling/v2beta2

如需检查哪些 API 版本受支持,请使用 kubectl api-versions 命令。

您可以指定在查看使用 apiVersion: autoscaling/v2beta2 的“横向 Pod 自动扩缩程序”的详细信息时要使用的 API。

创建示例 Deployment

在创建“横向 Pod 自动扩缩程序”之前,您必须先创建其要监控的工作负载。本主题中的示例会将不同的“横向 Pod 自动扩缩程序”配置应用于以下 nginx Deployment。以下示例分别展示了基于资源利用率自定义指标或外部指标,以及多个指标的“横向 Pod 自动扩缩程序”。

将以下内容保存到名为 nginx.yaml 的文件中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

此清单指定 CPU 请求的值。如果要根据资源利用率百分比进行自动扩缩,您必须为该资源指定请求。如果不指定请求,则可以仅根据资源利用率的绝对值进行自动扩缩,例如:以 milliCPU 表示的 CPU 利用率

如需创建 Deployment,请应用 nginx.yaml 清单:

kubectl apply -f nginx.yaml

Deployment 的 spec.replicas 已设置为 3,因此部署了 3 个 Pod。您可以使用 kubectl get deployment nginx 命令进行验证。

本主题中的每个示例都会对示例 nginx Deployment 应用不同的“横向 Pod 自动扩缩程序”。

根据资源利用率进行自动扩缩

此示例创建一个 HorizontalPodAutoscaler 对象,以在 CPU 利用率超过 50% 时自动扩缩 nginx Deployment,并确保自始至终最少有 1 个副本,最多 有 10 个副本。

您可以使用 Cloud Console、kubectl apply 命令或 kubectl autoscale 命令(仅针对平均 CPU),来创建针对 CPU 的“横向 Pod 自动扩缩程序”。

控制台

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 点击 nginx Deployment 的名称。

  3. 点击 操作 > 自动扩缩

  4. 指定以下值:

    • 副本数下限:1
    • 副本数上限:10
    • 自动扩缩指标:CPU
    • 目标:50
    • 单位:%
  5. 点击完成

  6. 点击自动调节

kubectl apply

将以下 YAML 清单保存到名为 nginx-hpa.yaml 的文件:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

如需创建 HPA,请使用以下命令应用清单:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

如需创建仅针对平均 CPU 利用率的 HorizontalPodAutoscaler 对象,您可以使用 kubectl autoscale 命令:

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

如需获取集群中“横向 Pod 自动扩缩程序”的列表,请使用以下命令:

kubectl get hpa

输出内容类似如下:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

如需获取有关“横向 Pod 自动扩缩程序”的详细信息,您可以使用 Cloud Console 或 kubectl 命令。

控制台

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 点击 nginx Deployment 的名称。

  3. 自动扩缩程序部分中查看“横向 Pod 自动扩缩程序”配置。

  4. 事件标签页中查看关于自动扩缩事件的更多详情。

kubectl get

如需获取有关“横向 Pod 自动扩缩程序”的详细信息,您可以结合使用 kubectl get hpa-o yaml 标志。status 字段包含关于当前副本数以及所有近期自动扩缩事件的信息。

kubectl get hpa nginx -o yaml

输出内容类似如下:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

在继续按照本主题中的其余示例操作之前,请先删除 HPA:

kubectl delete hpa nginx

删除“横向 Pod 自动扩缩程序”时,Deployment 的副本数量保持不变。Deployment 不会自动还原到应用“横向 Pod 自动扩缩程序”之前的状态。

您可以详细了解如何删除“横向 Pod 自动扩缩程序”

根据自定义指标或外部指标进行自动扩缩

您可以按照分步教程来创建基于自定义指标外部指标的“横向 Pod 自动扩缩程序”。

根据多个指标进行自动扩缩

此示例创建的“横向 Pod 自动扩缩程序”根据 CPU 利用率和名为 packets_per_second 的自定义指标进行自动扩缩。

如果您按照前面的示例操作,且仍然存在名为 nginx 的“横向 Pod 自动扩缩程序”,请先删除它,然后再按照本示例进行操作。

本示例要求使用 apiVersion: autoscaling/v2beta2。如需详细了解可用的 API,请参阅适用于 HorizontalPodAutoscaler 对象的 API 版本

将此 YAML 清单保存为名为 nginx-multiple.yaml 的文件:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

应用 YAML 清单:

kubectl apply -f nginx-multiple.yaml

创建完成后,“横向 Pod 自动扩缩程序”会监控 nginx Deployment 的平均 CPU 利用率、平均内存利用率和(如果取消注释)packets_per_second 自定义指标。“横向 Pod 自动扩缩程序”会根据某项指标对 Deployment 进行自动扩缩,条件是该指标的值将创建更大的自动扩缩事件。

查看有关“横向 Pod 自动扩缩程序”的详细信息

如需查看“横向 Pod 自动扩缩程序”的配置和统计信息,请使用以下命令:

kubectl describe hpa HPA_NAME

HPA_NAME 替换为您的 HorizontalPodAutoscaler 名称。

如果“横向 Pod 自动扩缩程序”使用 apiVersion: autoscaling/v2beta2 且基于多个指标,则 kubectl describe hpa 命令仅显示 CPU 指标。如需查看所有指标,请改用以下命令:

kubectl describe hpa.v2beta2.autoscaling HPA_NAME

HPA_NAME 替换为您的 HorizontalPodAutoscaler 名称。

每个“横向 Pod 自动扩缩程序”的当前状态显示在 Conditions 字段中,自动扩缩事件列在 Events 字段中。

输出内容类似如下:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

删除“横向 Pod 自动扩缩程序”

您可以使用 Cloud Console 或 kubectl delete 命令删除“横向 Pod 自动扩缩程序”。

控制台

如需删除 nginx 横向 Pod 自动扩缩程序,请执行以下操作:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 点击 nginx Deployment 的名称。

  3. 点击 操作 > 自动扩缩

  4. 点击删除

kubectl delete

如需删除 nginx 横向 Pod 自动扩缩程序,请执行以下操作:

kubectl delete hpa nginx

删除“横向 Pod 自动扩缩程序”时,Deployment(或其他部署对象)的现有规模将保持不变,并且不会还原到 Deployment 的原始清单中的副本数量。如需手动扩缩 Deployment,使其还原为三个 Pod,您可以使用 kubectl scale 命令:

kubectl scale deployment nginx --replicas=3

清理

  1. 删除“横向 Pod 自动扩缩程序”(如果您尚未这样做):

    kubectl delete hpa nginx
    
  2. 删除 nginx Deployment:

    kubectl delete deployment nginx
    
  3. 您也可以选择删除集群

问题排查

设置“横向 Pod 自动扩缩程序”时,您可能会看到如下警告消息:

unable to fetch pod metrics for pod

当指标服务器启动时,看到此消息是正常现象。但是,如果您仍然看到警告,并发现 Pod 未针对您的工作负载进行扩缩,则请确保您已为工作负载中的每个容器指定资源请求。如需将资源利用百分比目标与“横向 Pod 自动扩缩程序”搭配使用,您必须为工作负载中每个 Pod 中运行的每个容器配置对该资源的请求。否则,“横向 Pod 自动扩缩程序”无法执行所需的计算,也不会执行与该指标相关的操作。

后续步骤