自动伸缩是 Kubernetes 的核心能力。您配置的扩展机制(HPA、VPA 和 Cluster Autoscaler)越严格,运行应用程序的浪费和成本就越低。
Kubernetes 提供了三种自动伸缩机制:Horizontal Pod Autoscaler (HPA)、Vertical Pod Autoscaler (VPA) 和 Cluster Autoscaler。
在本文中,我们关注水平 pod 自动缩放。您可以通过在集群上配置 Horizontal Pod Autoscaler (HPA) 设置来控制基于各种指标运行的 pod 数量。这使您能够根据需求扩大或缩小规模。
继续阅读以了解 Kubernetes HPA 是什么以及它在动手示例中的工作原理。
在深入研究 Horizontal Pod Autoscaler (HPA) 之前,让我们看一下 Kubernetes 的自动缩放机制。
Kubernetes 支持三种类型的自动缩放:
1. Horizontal Pod Autoscaler (HPA),它缩放应用程序的副本数量。
2. Vertical Pod Autoscaler (VPA),用于扩展容器的资源请求和限制。
3. Cluster Autoscaler,调整集群的节点数。
这些自动缩放器在两个 Kubernetes 级别之一上工作:pod 和 cluster。虽然 Kubernetes HPA 和 VPA 方法在 pod 级别调整资源,但 Cluster Autoscaler 会扩大或缩小集群中的节点数量。
在许多应用程序中,使用情况会随着时间而变化——例如,晚上访问电子商务商店的人多于中午左右。当您的应用程序需求发生变化时,您可以使用 Horizontal Pod Autoscaler (HPA) 根据 CPU 利用率自动添加或删除 pod。
HPA 根据您在外部提供的指标或自定义指标做出自动缩放决策。
首先,您需要使用 MIN 和 MAX 值定义在任何给定时间应运行的副本数。配置完成后,Horizontal Pod Autoscaler 控制器会负责检查指标并根据需要进行调整。默认情况下,它每 15 秒检查一次指标。
配置 HPA 控制器将监控部署的 pod 并了解 pod 副本的数量是否需要更改。为了确定这一点,HPA 采用每个 pod 指标值的加权平均值,并计算删除或添加副本是否会使该值更接近其目标值。
假设您的部署的目标 CPU 利用率为 50%。您目前有五个 Pod 在那里运行,平均 CPU 利用率为 75%。在这种情况下,HPA 控制器将添加三个副本以使 pod 平均值更接近 50% 的目标。

Horizontal Pod Autoscaler 是一种自动扩展机制,可用于扩展无状态应用程序。但是您也可以使用它来支持扩展有状态集。
要为经历定期需求变化的工作负载节省成本,请将 HPA 与集群自动缩放结合使用。这将帮助您在 pod 数量减少时减少活动节点的数量。
请注意,HPA 有一些限制:
Horizontal Pod Autoscaler (HPA) 是 Kubernetes 集群管理器的一项功能,它监视 pod 容器的 CPU 使用情况,并根据需要自动调整它们的大小以保持目标利用率水平。
为此,HPA 需要一个指标来源。例如,当基于 CPU 使用率进行扩展时,它使用metrics-server。如果要使用自定义或外部指标进行 HPA 扩展,则需要部署实现 custom.metrics.k8s.io API 或 external.metrics.k8s.io API 的服务;这提供了一个与监控服务或指标源的接口。
自定义指标包括网络流量、内存或与 pod 应用程序相关的任何值。如果您的工作负载使用标准 CPU 指标,请确保在 pod 规范中为容器配置 CPU 资源限制。
Kubernetes HPA 需要访问每个 pod 的资源指标来做出扩展决策。这些值是从 metrics-server 提供的 metrics.k8s.io API 中检索的。
HPA 扩展决策的另一个关键信息来源是观察到的 pod 的 CPU 利用率值。但是这些值是如何计算的呢?它们是来自单个 pod 的资源请求的百分比。
如果您错过了某些容器的资源请求值,这些计算可能会变得完全不准确,并导致次优操作和糟糕的扩展决策。这就是为什么值得为每个 pod 的所有容器配置资源请求值的原因,这些容器是由 HPA 扩展的 Kubernetes 控制器的一部分。
自定义指标
您可以将 Horizontal Pod Autoscaler (HPA) 配置为基于自定义指标进行扩展,这些指标是您从应用程序收集的内部指标。HPA 支持两种类型的自定义指标:
请记住在配置自定义指标时为 pod 和对象指标使用正确的目标类型。
外部指标
这些指标允许 HPA 根据第三方监控系统提供的指标自动扩展应用程序。外部指标支持 Value 和 AverageValue 的目标类型。
在决定自定义指标和外部指标时,请选择自定义指标,因为保护外部指标 API 比获得内部指标更难。
Vertical Pod Autoscaler 可自动执行请求并限制配置,从而减少开销并节省成本。另一方面,Horizontal Pod Autoscaler 旨在横向扩展而不是向上或向下扩展。
在为业务或目的级服务层设计集群时,请仔细检查您的分箱和打包密度设置是否相互冲突。
假设您的一个工作负载最终消耗的比它请求的多。发生这种情况是因为需要资源吗?或者工作负载是否因为它们可用但不是非常需要而消耗它们?
在为自动缩放选择实例大小和类型时使用实例权重。实例加权很有用,尤其是当您采用多样化的分配策略并使用 Spot 实例时。
由于这是 Kubernetes 的核心功能之一,我们使用的云服务提供商应该无关紧要。但在本例中,我们将使用 GKE。
您可以通过 UI 或 gcloud utils 创建集群,如下所示:
- gcloud container \
- --project "[your-project]" clusters create "[cluster-name]" \
- --release-channel None \
- --zone "europe-west3-c" \
- --node-locations "europe-west3-c" \
- --machine-type "e2-standard-2" \
- --image-type "COS_CONTAINERD" \
- --disk-size "50" \
- --enable-autorepair \
- --num-nodes "3"
然后我们可以使用以下方式连接到集群:
gcloud container clusters get-credentials [cluster-name] --zone europe-west3-c --project [your-project]
这也应该将您的上下文切换到集群,因此无论何时使用 kubectl,您都将处于该集群的上下文中。
完成后,我们可以验证是否可以看到节点:
- > kubectl get nodes
-
- NAME STATUS ROLES AGE VERSION
- gke-valdas-1-default-pool-cf1cd6be-cvc4 Ready <none> 4m50s v1.22.11-gke.400
- gke-valdas-1-default-pool-cf1cd6be-q62h Ready <none> 4m49s v1.22.11-gke.400
- gke-valdas-1-default-pool-cf1cd6be-xrf0 Ready <none> 4m50s v1.22.11-gke.400
GKE 预装了指标服务器;我们可以验证使用:
- > kubectl get pods -n kube-system | grep metrics
-
- gke-metrics-agent-n92rl 1/1 Running 0 7m34s
- gke-metrics-agent-p5d49 1/1 Running 0 7m33s
- gke-metrics-agent-tf96r 1/1 Running 0 7m34s
- metrics-server-v0.4.5-fb4c49dd6-knw6v 2/2 Running 0 7m20s
请注意,如果您的集群没有指标服务器,您可以使用一个命令轻松安装它:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
你可以在这里找到更多信息。
我们还可以使用 `top` 命令来验证是否收集了指标:
- > kubectl top pods -A
-
- NAMESPACE NAME CPU(cores) MEMORY(bytes)
- kube-system event-exporter-gke-5479fd58c8-5rt4b 1m 12Mi
- kube-system fluentbit-gke-5r6v5 5m 22Mi
- kube-system fluentbit-gke-nwcx9 4m 25Mi
- kube-system fluentbit-gke-zz6gl 4m 25Mi
- kube-system gke-metrics-agent-n92rl 2m 26Mi
- kube-system gke-metrics-agent-p5d49 3m 27Mi
- kube-system gke-metrics-agent-tf96r 3m 26Mi
- kube-system konnectivity-agent-6fbc8c774c-4vvff 1m 6Mi
- kube-system konnectivity-agent-6fbc8c774c-lsk26 1m 7Mi
- kube-system konnectivity-agent-6fbc8c774c-rnvp2 2m 6Mi
- kube-system konnectivity-agent-autoscaler-555f599d94-f2w5n 1m 4Mi
- kube-system kube-dns-85df8994db-lvf55 2m 30Mi
- kube-system kube-dns-85df8994db-mvxv5 2m 30Mi
- kube-system kube-dns-autoscaler-f4d55555-pctcj 1m 11Mi
- kube-system kube-proxy-gke-valdas-1-default-pool-cf1cd6be-cvc4 1m 22Mi
- kube-system kube-proxy-gke-valdas-1-default-pool-cf1cd6be-q62h 1m 23Mi
- kube-system kube-proxy-gke-valdas-1-default-pool-cf1cd6be-xrf0 1m 26Mi
- kube-system l7-default-backend-69fb9fd9f9-fctch 1m 1Mi
- kube-system metrics-server-v0.4.5-fb4c49dd6-knw6v 27m 24Mi
- kube-system pdcsi-node-mf6pt 2m 9Mi
- kube-system pdcsi-node-sxdrg 3m 9Mi
- kube-system pdcsi-node-wcnw7 3m 9Mi
现在,让我们创建一个具有资源请求和限制的单副本部署:
- apiVersion: autoscaling/v1
- kind: HorizontalPodAutoscaler
- metadata:
- name: hpa-demo
- spec:
- scaleTargetRef:
- apiVersion: apps/v1
- kind: Deployment
- name: hpa-demo
- minReplicas: 1
- maxReplicas: 5
- targetCPUUtilizationPercentage: 60