本页面介绍如何通过使用资源分配、负载均衡器流量、自定义指标或多个指标同时自动调整资源,在 Google Kubernetes Engine (GKE) 中扩缩部署。本 页面还提供有关如何配置 HorizontalPodAutoscaler (HPA) 配置文件的分步说明,包括如何查看、删除、清理 HPA 对象以及排查相关问题。 Deployment 是一个 Kubernetes API 对象,可让您运行在集群节点中分布的多个 Pod 副本。
本页面适用于在 GKE 中管理应用扩缩并希望了解如何通过 Pod 横向自动扩缩动态优化性能并保持成本效益的运维人员和开发者。如需详细了解我们在 Google Cloud内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,
安装并
初始化
gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新 版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
- 确保您已有 Autopilot 或 Standard 集群。如果需要,请创建 Autopilot 集群。
适用于 HorizontalPodAutoscaler 对象的 API 版本
当您使用 Google Cloud 控制台时,HPA 对象是使用
autoscaling/v2 API 创建的。
当您使用 kubectl 创建或查看有关 HPA 对象的信息时,您可以指定 autoscaling/v1 API 或 autoscaling/v2 API。
apiVersion: autoscaling/v1为默认值,允许您仅根据 CPU 利用率进行自动扩缩。如需根据其他指标进行自动扩缩,建议使用apiVersion: autoscaling/v2。创建示例 Deployment 中的示例使用apiVersion: autoscaling/v1。创建新 HPA 对象时,建议使用
apiVersion: autoscaling/v2。它可让您根据多个指标进行自动扩缩,包括自定义指标或外部指标。本页面中的所有其他示例均使用apiVersion: autoscaling/v2。
如需检查哪些 API 版本受支持,请使用 kubectl api-versions 命令。
您可以指定在查看使用 apiVersion: autoscaling/v2 的 HPA 的详细信息时要使用的 API。
创建示例 Deployment
创建 HPA 对象之前,您必须先创建其要监控的工作负载。本页面中的示例将不同的 HPA 配置应用于以下 nginx Deployment。以下示例分别展示了基于
资源利用率、基于
自定义指标或外部指标以及基于
多个指标的 HPA。
将以下内容保存到名为 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 应用不同的 HPA 对象。
根据资源利用率进行自动扩缩
此示例创建一个 HPA 对象,以在 CPU 利用率
超过 50% 时自动扩缩
nginx Deployment,并有助于确保自始至终最少有 1 个副本,最多有 10 个副本。
您可以使用 Google Cloud 控制台、
kubectl apply命令或 kubectl autoscale
命令(仅针对平均 CPU)创建针对 CPU 的 HPA。
控制台
前往 Google Cloud 控制台中的工作负载页面。
点击
nginxDeployment 的名称。点击 list 操作 > 修改自动扩缩。
在 Pod 横向自动扩缩部分,点击 选择并配置。
指定以下值:
- 副本数下限:1
- 副本数上限:10
- 自动扩缩指标:CPU
- 目标 :50
- 单位 :个 CPU
点击提交 。
kubectl apply
将以下 YAML 清单保存为名为 nginx-hpa.yaml 的文件:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
# Set the minimum and maximum number of replicas the Deployment can scale to.
minReplicas: 1
maxReplicas: 10
# The target average CPU utilization percentage across all Pods.
targetCPUUtilizationPercentage: 50
如果您创建清单以匹配您自己项目中的特定详细信息,请确保您不会在 Pod 横向自动扩缩器字段中包含敏感数据。
如需创建 HPA,请使用以下命令应用清单:
kubectl apply -f nginx-hpa.yaml
kubectl autoscale
如需创建仅针对平均 CPU 利用率的 HPA 对象,您可以使用 kubectl autoscale 命令:
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
如需获取集群中的 HPA 列表,请使用以下命令:
kubectl get hpa
输出类似于以下内容:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 3 61s
如需获取关于 HPA 的详细信息,您可以使用 Google Cloud 控制台或
kubectl命令。
控制台
前往 Google Cloud 控制台中的工作负载页面。
点击
nginxDeployment 的名称。点击扩缩 选项卡。
kubectl get
如需获取关于 HPA 的详细信息,您可以结合使用 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
如果您创建清单以匹配您自己项目中的特定详细信息,请确保您不会在 Pod 横向自动扩缩器字段中包含敏感数据。
在继续按照本页面中的其余示例操作之前,请先删除 HPA:
kubectl delete hpa nginx
删除 HPA 对象后,Deployment 的副本数量保持不变。 Deployment 不会自动还原到应用 HPA 之前的状态。
您可以详细了解如何删除 HPA。
基于负载均衡器流量的自动扩缩
基于流量的自动扩缩是 GKE 的一项功能,可集成来自负载平衡器的流量利用率信号,从而自动扩缩 Pod。
使用流量作为自动扩缩信号可能会有帮助,因为流量是负载的先行指标,与 CPU 和内存互补。与 GKE 的内置集成有助于确保设置简单明了,并且自动扩缩可快速应对流量高峰以满足需求。
基于流量的自动扩缩通过 网关控制器及其 全球流量管理 功能启用。如需了解详情,请参阅基于流量的自动扩缩。
基于负载均衡器流量的自动扩缩仅适用于 Gateway 工作负载。
要求
基于流量的自动扩缩有以下要求:
- 在 GKE 1.31 版及更高版本中受支持。
- 在项目中启用 Gateway API。
- 支持流经使用 Gateway API 以及
gke-l7-global-external-managed、gke-l7-regional-external-managed、gke-l7-rilb或gke-l7-gxlbGatewayClass 部署的负载平衡器的流量。
限制
基于流量的自动扩缩有以下限制:
- 不受多集群 GatewayClass(
gke-l7-global-external-managed-mc、gke-l7-regional-external-managed-mc、gke-l7-rilb-mc和gke-l7-gxlb-mc)支持。 - 不支持使用
LoadBalancer类型的 Service 的流量。 - 基于流量的自动扩缩中涉及的组件之间必须存在明确且独立的关系。一个 HPA 对象必须专门用于伸缩单个 Service 公开的单个 Deployment(或任何可伸缩资源)。
- 使用
maxRatePerEndpoint字段配置 Service 的容量后,请留出足够的时间(通常为 1 分钟,但在大型集群中可能长达 15 分钟)让负载均衡器使用此更改进行更新,然后再使用基于流量的指标配置 HPA。这种方法有助于确保您的服务不会暂时遇到以下情况:集群尝试根据仍在进行配置的负载均衡器发出的指标进行自动扩缩。 - 如果基于流量的自动伸缩功能用于由多个负载平衡器(例如,由一个 Ingress 和一个 Gateway 或由两个 Gateway)提供服务的 Service,HPA 可能会考虑来自各个负载平衡器的最高流量值来做出伸缩决策,而不是考虑来自所有负载平衡器的流量值总和。
部署基于流量的自动扩缩
以下练习使用 HPA 根据收到的流量自动扩缩 store-autoscale Deployment。网关接受来自互联网的 Pod 入站流量。自动扩缩器会将来自网关的流量信号
与在 store-autoscale Service 资源上配置的
每个 Pod 流量容量
进行比较。通过生成流向网关的流量,会影响部署的 Pod 数量。
下图展示了基于流量的自动扩缩的工作原理:
如需部署基于流量的自动扩缩,请执行以下步骤:
对于 Standard 集群,请确认集群中已安装 GatewayClass。对于 Autopilot 集群,GatewayClass 是默认安装的。
kubectl get gatewayclass输出会确认 GKE GatewayClass 资源已准备好在集群中使用:
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 16h gke-l7-regional-external-managed networking.gke.io/gateway True 16h gke-l7-gxlb networking.gke.io/gateway True 16h gke-l7-rilb networking.gke.io/gateway True 16h如果您没有看到此输出,请在 GKE 集群中启用 Gateway API。
将示例应用和 Gateway 负载均衡器部署到您的集群:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml示例应用会创建以下内容:
- 包含 2 个副本的 Deployment。
- 将关联的
GCPBackendPolicy设置maxRatePerEndpoint设置为10的 Service。如需详细了解 Gateway 功能,请参阅 GatewayClass 功能。 - 用于访问互联网上的应用的外部 Gateway。如需详细了解如何使用 Gateway 负载均衡器,请参阅部署 Gateway。
- 与所有流量匹配并将其发送到
store-autoscaleService 的 HTTPRoute。
使用基于流量的自动扩缩时,服务容量是一个关键元素,因为它决定了触发自动扩缩事件的每个 Pod 流量。它使用与 Service 关联的 GCPBackendPolicy 上的
maxRatePerEndpoint字段进行配置,该字段定义了 Service 应该在每个 Pod 的每秒请求中接收的最大流量。Service 容量取决于您的应用。如需了解详情,请参阅确定 Service 的容量。
将以下清单保存为
hpa.yaml:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: store-autoscale spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: store-autoscale # Set the minimum and maximum number of replicas the Deployment can scale to. minReplicas: 1 maxReplicas: 10 # This section defines that scaling should be based on the fullness of load balancer # capacity, using the following configuration. metrics: - type: Object object: describedObject: kind: Service name: store-autoscale metric: # The name of the custom metric which measures how "full" a backend is # relative to its configured capacity. name: "autoscaling.googleapis.com|gclb-capacity-fullness" target: # The target average value for the metric. The autoscaler adjusts the number # of replicas to maintain an average capacity fullness of 70% across all Pods. averageValue: 70 type: AverageValue此清单描述了具有以下属性的 HPA 对象:
minReplicas和maxReplicas:设置 Deployment 的副本数下限和上限。在此配置中,Pod 的数量可以从 1 个副本扩容到 10 个副本。describedObject.name: store-autoscale:对store-autoscale服务的引用,定义了流量容量。scaleTargetRef.name: store-autoscale:对store-autoscaleDeployment 的引用,定义了由 HPA 扩缩的资源。averageValue: 70:容量利用率的目标平均值为 70%。此属性可以使 HPA 实现增长利润率,以便正在运行的 Pod 能够在创建新 Pod 时处理超额的流量。
如果您创建清单以匹配您自己项目中的特定详细信息,请确保您不会在 Pod 横向自动扩缩器字段中包含敏感数据。
HPA 会产生以下流量行为:
- Pod 的数量会在 1 到 10 个副本之间进行调整,以实现每个端点的最大速率的 70%。这会使
maxRatePerEndpoint=10时每个 Pod 7 RPS。 - 在每个 Pod 超过 7 RPS 时,Pod 会纵向扩容,直至达到其 10 个副本的上限或直至平均流量为每个 Pod 7 RPS。
- 如果流量减少,则 Pod 会使用 HPA 算法纵向缩容到合理的速率。
您还可以 部署流量生成器 以验证基于流量的自动扩缩行为。
在 30 RPS 时,Deployment 会扩缩到 5 个副本,以使每个副本在理想情况下接收 6 RPS 的流量,即每个 Pod 的 60%。该目标利用率低于 70%,因此 Pod 会进行适当扩缩。根据流量波动,自动扩缩副本的数量也可能会发生波动。如需详细了解如何计算副本数量,请参阅自动扩缩行为。
根据自定义指标或外部指标进行自动扩缩
如需根据自定义指标进行扩缩,您可以 公开自定义指标 (预览版),并将指标从 Pod 或工作负载直接发送到 自动扩缩器。
对于外部指标(例如 Pub/Sub),请参阅 Pub/Sub HPA 示例。
根据多个指标进行自动扩缩
此示例创建一个 HPA 对象,该对象根据 CPU 利用率和名为 packets_per_second 的自定义指标进行自动扩缩。
如果您按照前面的示例操作,且仍然存在名为 nginx 的 HPA 对象,请先
删除它,然后再按照本示例进行操作。
本示例要求使用 apiVersion: autoscaling/v2。如需详细了解可用的 API,请参阅适用于 HPA 对象的 API 版本。
将此 YAML 清单保存为名为 nginx-multiple.yaml 的文件:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics: # The metrics to base the autoscaling on.
- type: Resource
resource:
name: cpu # Scale based on CPU utilization.
target:
type: Utilization
averageUtilization: 50
# The HPA will scale the replicas to try and maintain an average
# CPU utilization of 50% across all Pods.
- type: Resource
resource:
name: memory # Scale based on memory usage.
target:
type: AverageValue
averageValue: 100Mi
# The HPA will scale the replicas to try and maintain an average
# memory usage of 100 Mebibytes (MiB) across all Pods.
# 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
如果您创建清单以匹配您自己项目中的特定详细信息,请确保您不会在 Pod 横向自动扩缩器字段中包含敏感数据。
应用 YAML 清单:
kubectl apply -f nginx-multiple.yaml
创建完成后,HPA 会监控 nginx Deployment 的平均 CPU 利用率、平均内存利用率和(如果取消注释)自定义 packets_per_second 指标。HPA 会根据某项指标对 Deployment 进行自动扩缩,条件是该指标的值将创建更大的自动扩缩事件。
配置性能 HPA 配置文件
性能 HPA 配置文件可缩短 Pod 横向自动扩缩的反应时间,有助于提高 HPA 处理大量对象的能力(在次要版本 1.31-1.32 中最多可处理 1,000 个对象,在版本 1.33 或更高版本中最多可处理 5,000 个对象)。
如果符合条件的 Autopilot 集群的控制平面在运行 GKE 1.32 版或更高版本,则系统会自动对其启用此配置文件。对于 Standard 集群,如果符合条件的集群的控制平面在运行 GKE 1.33 版或更高版本,则系统会自动对其启用此配置文件。
如果 Standard 集群满足以下所有条件,则不会自动启用性能 HPA 配置文件:
- 集群在从较低版本升级到 1.33 版或更高版本。
- 集群至少有一个节点池具有以下任一机器类型:
e2-micro、e2-custom-micro、g1-small、f1-micro。 - 未启用节点自动预配功能。
如果现有集群满足相关要求,您也可以对其启用性能 HPA 配置文件。
要求
如需启用性能 HPA 配置文件,请验证您的 Autopilot 集群和 Standard 集群是否满足以下要求:
- 您的控制平面运行的是 GKE 1.31 版或更高版本。
- 如果您的控制平面运行的是 GKE 1.31 版,请启用 系统指标收集。
- 在项目中启用 Autoscaling API 。
- 所有
节点服务账号
都已分配了
roles/autoscaling.metricsWriter角色。 - 如果您使用 VPC Service Controls,请验证 Autoscaling API 包含在您的服务边界中。
启用性能 HPA 配置文件
如需在集群中启用性能 HPA 配置文件,请使用以下命令:
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID \
--hpa-profile=performance
您需要进行如下替换:
CLUSTER_NAME:集群的名称。LOCATION:集群的计算可用区或区域(例如 us-central1-a 或 us-central1)。PROJECT_ID:您的 Google Cloud 项目 ID。
停用性能 HPA 配置文件
如需在集群中停用性能 HPA 配置文件,请使用以下命令:
gcloud container clusters update CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID \
--hpa-profile=none
您需要进行如下替换:
CLUSTER_NAME:集群的名称。LOCATION:集群的计算可用区或区域(例如 us-central1-a 或 us-central1)。PROJECT_ID:您的 Google Cloud 项目 ID。
查看有关 HorizontalPodAutoscaler 的详细信息
如需查看 HPA 的配置和统计信息,请使用以下命令:
kubectl describe hpa HPA_NAME
将 HPA_NAME 替换为您的 HPA 对象的名称。
如果 HPA 使用 apiVersion: autoscaling/v2 且基于多个指标,则 kubectl describe hpa 命令仅显示 CPU 指标。如需查看所有指标,请改用以下命令:
kubectl describe hpa.v2.autoscaling HPA_NAME
将 HPA_NAME 替换为您的 HPA 对象的名称。
每个 HPA 对象的当前状态显示在 Conditions 字段中,自动扩缩事件列在 Events 字段中。
输出类似于以下内容:
Name: nginx
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling/v2","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>
删除 HorizontalPodAutoscaler
您可以使用 Google Cloud 控制台或 kubectl delete 命令删除 HPA 对象。
控制台
如需删除 nginx HPA 对象,请执行以下操作:
前往控制台中的工作负载 页面。 Google Cloud
点击
nginxDeployment 的名称。点击 list 操作 > 自动扩缩。
点击删除 。
kubectl delete
如需删除 nginx HPA 对象,请使用以下命令:
kubectl delete hpa nginx
删除 HPA 对象后,Deployment(或其他部署对象)将保持现有规模,并且不会还原到 Deployment 的原始清单中的副本数量。如需手动扩缩 Deployment,使其还原为三个 Pod,您可以使用 kubectl scale 命令:
kubectl scale deployment nginx --replicas=3
清理
如果您尚未删除 HPA 对象,请执行此操作:
kubectl delete hpa nginx删除
nginxDeployment:kubectl delete deployment nginx您也可以选择删除集群。
问题排查
如需获取问题排查建议,请参阅排查 Pod 横向自动扩缩问题。
后续步骤
- 详细了解 Pod 横向自动扩缩。
- 详细了解 Pod 纵向自动扩缩。
- 详细了解 CPU 启动加速。