使用水平 Pod 自动扩缩器(HPA)

学习目标

  • 识别水平 Pod 自动扩缩器(HPA)的功能

  • 在 Kubernetes 中使用 HPA 自动扩缩工作负载

水平 Pod 自动扩缩

使用场景

你已将工作负载部署到 Kubernetes 集群。到目前为止,你只为每个工作负载配置了固定数量的同时副本。但是,你希望能够根据当前负载自动扩缩工作负载。为此,你希望探索 Kubernetes 中水平 Pod 自动扩缩器(HPA)的功能。

什么是 HorizontalPodAutoscaler?

借助 'Deployments',你可以为所管理的 ReplicaSet 定义固定的副本数量。该数量对于当前负载而言可能过小或过大。例如,如果你的 Deployment 有三个副本且当前负载非常高,则应将 Deployment 扩容到五个或更多副本。如果负载较低,则应将 Deployment 缩容到两个副本。这正是 HPA 发挥作用的地方。借助 HPA,你可以为 Deployment 定义最小和最大副本数量。随后,HPA 会根据当前负载自动对 Deployment 进行扩容或缩容。

你可以基于某个指标(例如 CPU 或内存使用率)配置这种自动扩缩。HPA 会检查该指标的当前值,并将其与目标值进行比较。如果当前值高于目标值,HPA 会对 Deployment 进行扩容。例如,你可以将 Pod 的目标 CPU 使用率设置为 50%。如果 Pod 的当前 CPU 使用率高于 50%,HPA 会对 Deployment 进行扩容。如果当前 CPU 使用率低于 50%,HPA 会对 Deployment 进行缩容。有关指标的更多信息,请参阅容器资源指标

HPA 之所以被明确称为水平,是因为它以水平方式扩缩 Pod 的数量。这意味着 HPA 通过添加或移除 Pod 来增加或减少其数量。这与垂直扩缩形成对比,垂直扩缩是增加或减少 Pod 的资源。例如,你可以通过增加 Pod 定义中的 resources 部分来增加 Pod 的 CPU 和内存。

定义 HorizontalPodAutoscaler

要定义 HPA,你需要创建一个 YAML 文件。以下 YAML 文件定义了一个 HPA,用于扩缩名为 hello-kyma 的 Deployment:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hello-kyma-hpa
spec:
minReplicas: 3
maxReplicas: 5
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hello-kyma
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50

minReplicasmaxReplicas 字段定义 Deployment 的最小和最大副本数量。scaleTargetRef 字段定义被扩缩的 Deployment。metrics 字段定义用于扩缩的指标。在本例中,该指标是 CPU 使用率。target 字段定义该指标的目标值。在本例中,目标值是 50% 的 CPU 使用率。

部署 HorizontalPodAutoscaler

要部署 HorizontalPodAutoscaler,你可以使用 kubectl apply 命令:

kubectl apply -f hpa.yaml

要为现有 Deployment 或 ReplicaSet 创建 HorizontalPodAutoscaler,你可以使用 kubectl autoscale 命令:

kubectl autoscale deployment hello-kyma --cpu-percent=50 --min=3 --max=5

你还可以使用 Kyma dashboard 创建 HorizontalPodAutoscaler。为此,请转到 Discovery and Network 菜单项,然后选择 Horizontal Pod Autoscalers。选择 Create 按钮并填写表单。

Kyma dashboard 的 Horizontal Pod Autoscalers 区域。它显示了自动扩缩器列表及其详细信息,例如名称、创建时间、标签、指标、最小/最大 Pod 数、副本数和状态。

小结

水平 Pod 自动扩缩会根据 CPU 或内存使用率等指标动态调整 Deployment 中的 Pod 数量。借助 HPA,你可以设置最小和最大副本数量,Kubernetes 会根据当前负载自动对 Deployment 进行扩容或缩容。

有关水平 Pod 自动扩缩的进一步阅读

水平 Pod 自动扩缩器