概述
Kubernetes 是一个流行的容器编排平台,为开发者提供了一种便捷的方式来管理和扩展他们的应用程序。在 Kubernetes 中,Pod 是最小的基本单位,而在 Pod 内,容器是真正运行应用程序的地方。在大多数情况下,Pod 中只运行一个容器,但有时需要在一个 Pod 中运行多个容器。这样做有很多好处,例如容器间通信更容易、共享网络和存储等。
在 Kubernetes 中,Pod 的大小是由开发者手动指定的。但是,这个指定的大小可能不是最优的,尤其是在应用程序的负载变化的情况下。由于应用程序负载的变化,可能会导致 Pod 中容器的资源利用率不够高,或者容器中运行的应用程序会持续不断地申请更多的资源。这些问题都可以通过 Kubernetes 中的 Vertical Pod Autoscaler(VPA)来解决。
VPA 的使用和工作原理
VPA 是 Kubernetes 的一个插件,可以自动调整 Pod 中容器的资源限制。它可以根据容器内的度量(例如 CPU 和内存利用率)自动调整 Pod 中容器的内存、CPU 请求和限制。它可以让 Pod 更加智能,与应用程序的负载自适应,实现自动化调整。
在 Kubernetes 中,VPA 可以与 HPA(Horizontal Pod Autoscaler)一起使用来满足不同的负载要求。负载变化时,HPA 会增加或减少 Pod 的数量,而 VPA 会调整 Pod 中每个容器的资源需求。这样一来,Kubernetes 中的应用程序可以更加适应负载。
VPA 可以基于容器的每个度量指标进行调整。在 Kubernetes 中,有两种不同的 VPA 模式。
- Recommended: 这种模式中,VPA 推荐应用程序使用的资源请求和限制。这意味着容器进程可以超过其请求的资源,但不能超过容器的限制。这样可以确保在负载变化的情况下,应用程序将具有足够的资源来保持其稳定性。
- Exact: 这种模式中,VPA 将确切的资源限制作为每个容器的请求。这意味着在负载变化时,容器进程不会超过其请求的资源限制。这可以确保在所有情况下,容器(即应用程序)都具有可靠的资源。
使用实例
下面,我们来看一个使用 Vertical Pod Autoscaler 的实例。首先,我们需要创建一个 Deployment,并进行初始化设置:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------------- ----- --------- ------------ ---- ------ --------- - --------- --------- ------- ---- ------ ----- ----------- - ----- ------------ ------ -------- ---------- --------- ------- ------ ---- ------ ------- ---- ------ ------- -------展开代码
上述代码创建了一个 Deployment,其中包含一个名为 my-container 的应用程序容器。该容器需要 0.25 vCPU 和 64 MB 内存的请求,并且允许最多使用 0.5 vCPU 和 128 MB 内存的限制。接下来,让我们使用 VPA 来调整容器的资源要求。
首先,我们需要创建一个 VPA 对象,它定义了我们需要使用的模式,以及所需的度量。在这个例子中,我们将使用 Recommended 模式,并度量 CPU 利用率:
-- -------------------- ---- ------- ----------- -------------------------- ----- --------------------- --------- ----- ------ ----- ---------- ----------- --------- ----- ---------- ----- ------------- ------------- ----------- ------ --------------- ------------------ - -------------- ------------ ----------- ---- ---- ------- ---- ----------- ---- ---- ------- ----- -------------------- - --- - ------ ----- ------------- ------------- ----------- ------展开代码
这个 VPA 对象将与名为 my-deployment 的 Deployment 关联,控制其内的容器。它还指定了使用 Recommended 模式和 CPU 利用率作为度量。在 resourcePolicy 字段中,我们指定了 my-container 对于 CPU 和内存的最小和最大值,以及以这些资源作为需要调整的指标。最后,我们将 updateMode 设置为 Auto。
要应用此 VPA 对象,请使用以下命令:
$ kubectl apply -f vpa.yaml
然后,我们可以使用以下命令来监视 Pod 和容器的资源使用情况:
$ kubectl get pods $ kubectl top pods $ kubectl get containers $ kubectl top containers
接下来,模拟 Pod 中容器的负载变化。该负载变化可以通过创建新的 Deployment 对象,并将其扩展到多个 Pod。在这个例子中,我们将使用名为 my-load-test 的新 Deployment:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ------------ ----- --------- ------------ ---- ------ --------- - --------- --------- ------- ---- ------ ----- ----------- - ----- ------------ ------ --------展开代码
这个 Deployment 将创建 4 个 Pod,同时运行 my-app 容器。
现在,使用以下命令来监视 VPA 的工作,并确定是否自动调整容器内的资源请求:
$ kubectl get vpa my-vpa
如果 VPA 正常工作,它应该在负载变化时自动调整容器的资源需求,以确保应用程序的可靠性和性能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67ca76a0e46428fe9e2a8f26