学习 Kubernetes,第四部分,自动缩放

2025-06-04

学习 Kubernetes,第四部分,自动缩放

在Twitter上关注我,很高兴接受您对主题或改进的建议/Chris

第四部分旨在向您展示如何利用自动扩展作为您的扩展策略。我们已经向您展示了如何以期望状态进行扩展,但这或许会更加强大

  • 第一部分 - 从头开始​​,第一部分,基础知识、部署和 Minikube在这一部分中,我们将介绍为什么使用 Kubernetes、一些历史和一些基本概念,如部署、节点、Pod。
  • 第二部分 - 服务和标签简介在本部分中,我们将加深对 Pod 和节点的了解。我们还将介绍服务和标签,以及如何使用标签来查询我们的工件。
  • 第三部分 - 扩展
    在本部分中,我们将探讨如何根据期望状态进行扩展。我们指定所需的 Pod 数量,然后让 Kubernetes 承担主要工作,确保 Pod 能够扩展到期望数量,并通过所谓的自我修复功能来维持这一数量。

  • 第四部分 - 自动缩放我们在这里

在本文中,我们将介绍以下内容:

  • 为什么要进行自动缩放,我们将讨论不同的场景,在这些场景中,依靠自动缩放比静态定义自动缩放更有意义,就像我们对期望状态所做的那样
  • 我们来讨论一下水平自动缩放的概念/功能,它允许我们以弹性方式进行缩放。
  • 实验室 - 让我们扩展,我们将研究如何实际设置kubectl并模拟大量传入请求。然后,我们将检查结果,看看 Kubernetes 是否按照我们的想法运行。

资源

 为什么

在上一篇中,我们讨论了理想状态。这是一个可行的策略,直到发生一些不可预见的事情,突然涌入大量流量。这种情况很可能发生在大型促销期间的电商业务,或者在热门活动售票时售卖门票的商家。

这类事件属于异常情况,会迫使你快速扩容。但另一方面,在某些时候,你需要缩减规模,或者突然出现容量过剩,你可能需要为此付费。你真正想要的是弹性扩展,以便在需要时进行扩展,在流量较少时进行缩减。

如何

水平自动缩放,是什么意思?

这是 Kubernetes 中的一个概念,可以扩展我们所需的 Pod 数量。它可以在replication controllerdeployment或上执行此操作replica set。它通常查看 CPU 利用率,但可以使用称为 的函数来查看其他数据custom metrics support,因此它是可定制的。

resource它由 a和 a两部分组成controller。acontroller会检查利用率(或者您指定的任何指标),以确保副本数量符合您的要求。如果需要,它会启动更多 Pod 或移除它们。默认设置是每秒检查一次,15但您可以通过查看名为 的标志来更改此设置--horizontal-pod-autoscaler-sync-period

决定副本数量的底层算法如下:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
Enter fullscreen mode Exit fullscreen mode

 实验室——让我们扩大规模

好的,我们需要做的第一件事是扩展我们的部署以使用除期望状态之外的其他东西。

进行自动缩放时,我们需要指定两件事:

  • min/max,我们根据所需的 Pod 数量定义最小值和最大值
  • CPU,在这个版本中,我们设置了一定的 CPU 利用率百分比。当 CPU 利用率超过该百分比时,它会根据需要进行扩展。可以将其视为一个IF子句,如果 CPU 值大于阈值,则尝试扩展

设置

在尝试扩展实验之前,我们需要确保已启用正确的附加组件。您可以通过输入以下命令轻松查看已启用的附加组件:

minikube addons list
Enter fullscreen mode Exit fullscreen mode

如果看起来和上面一样,那就没问题了。为什么这么说呢?因为为了实现自动扩展,我们需要启用heapster这些附加组件。metrics-server

Heapster 支持容器集群监控和性能分析。

指标服务器通过资源指标 API 提供指标。Horizo​​ntal Pod Autoscaler 使用此 API 收集指标

我们可以使用以下命令轻松启用它们(我们需要自动缩放才能显示正确的数据):

minikube addons enable heapster
Enter fullscreen mode Exit fullscreen mode


minikube addons enable metrics-server
Enter fullscreen mode Exit fullscreen mode

我们需要再做一件事,即自enable 定义指标minikube,我们从这样的标志开始:

minikube start --extra-config kubelet.EnableCustomMetrics=true
Enter fullscreen mode Exit fullscreen mode

好的,现在我们可以开始了。

运行实验

我们需要执行以下操作来运行我们的实验

  • 创建部署
  • 应用自动缩放
  • 向部署中注入大量请求
  • 观察自动缩放如何变化

 创建部署

kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
Enter fullscreen mode Exit fullscreen mode

上面我们创建了一个部署php-apache,并将其作为服务暴露在 port 上80。我们可以看到我们正在使用镜像k8s.gcr.io/hpa-example

它应该告诉我们以下内容:

service/php-apache created
deployment.apps/php-apache created
Enter fullscreen mode Exit fullscreen mode

自动缩放

接下来我们将使用命令autoscale。我们将像这样使用它:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
Enter fullscreen mode Exit fullscreen mode

它应该说类似这样的话:

horizontalpodautoscaler.autoscaling/php-apache autoscaled
Enter fullscreen mode Exit fullscreen mode

上面我们在部署中应用了自动缩放php-apache,正如您所见,我们正在应用基于min-maxcpu基于的自动缩放,这意味着我们给出了自动缩放应如何发生的规则:

如果 CPU 负载较高,则>= 50%创建一个新的 Pod,但最多只能创建 10 个 Pod。如果负载较低,则逐渐恢复到一个 Pod

不断提出请求

下一步是向我们的部署发送大量请求,并观察自动扩展功能的效果。那么该怎么做呢?

首先,让我们检查一下水平 pod 自动缩放器的当前状态,或者hpa简单地输入以下命令:

kubectl get hpa
Enter fullscreen mode Exit fullscreen mode

这应该给我们这样的结果:

上面显示了两条信息。第一列TARGETS显示了 CPU 利用率actual usage/trigger value。第二列显示了当前REPLICAS的副本数量。1

下一个技巧是打开一个单独的终端选项卡。我们需要进行一些设置,以便可以发送大量请求。

接下来我们使用以下命令创建一个容器:

kubectl run -i --tty load-generator --image=busybox /bin/sh
Enter fullscreen mode Exit fullscreen mode

这应该会将我们带到容器内的提示符。接下来是:

while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
Enter fullscreen mode Exit fullscreen mode

上述命令应该产生类似这样的结果。

这将一直持续,直到您击中CTRL+C,但现在先不要管它。

这会导致大量请求陷入while true循环。

我认为while true循环很糟糕?

是的,但我们只会运行一分钟,以便自动缩放。是的,CPU 会发出很大的声音,但不用担心 :)

让这个持续一分钟左右,然后在第一个终端选项卡(不是运行请求的选项卡)中输入以下命令,如下所示:

kubectl get hpa
Enter fullscreen mode Exit fullscreen mode

现在应该显示如下内容:

从上面可以看到,这一列TARGETS看起来有所不同,现在显示339%/50%的是 CPU 的当前负载,以及REPLICAS副本7数从 1 增加到 7 的情况。所以,正如你所见,我们对其进行了相当猛烈的攻击。

现在转到第二个终端并点击,CTRL+C否则你会遇到这样的情况:

Kubernetes 实际上需要几分钟时间才能冷却下来,并将值恢复正常。初步观察 Pods 的情况,我们发现:

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

如您所见,我们仍有 7 个 Pod 启动并运行,但让我们等待一两分钟,它应该看起来像这样:

好的,现在我们恢复正常了。

概括

这篇文章里我们做了一些很棒的事情。我们成功设置了自动扩展,并向它发送了大量请求,希望没有耗尽我们的 CPU ;)

我们还设法学习了一些新的 Kubernetes 命令,并看到了自动扩展功能如何根据我们的规范为我们提供新的 Pod。

文章来源:https://dev.to/azure/kubernetes-from-the-beginning-part-iv-autoscaling-54l6
PREV
学习 Kubernetes,第三部分 扩展我的应用程序
NEXT
如何使用 Kubernetes(以 YAML 文件为例)