当我们执行“kubectl scale deploy”时,Kubernetes 不尊重 HPA 配置吗?

Posted

技术标签:

【中文标题】当我们执行“kubectl scale deploy”时,Kubernetes 不尊重 HPA 配置吗?【英文标题】:Doesn't Kubernetes honor HPA configuration when we execute "kubectl scale deploy"? 【发布时间】:2019-06-25 16:53:34 【问题描述】:

情景: 我已经使用 helm chart 部署了一个服务,我可以看到我的服务、hpa、部署、pod 等。 在我的 hpa 设置中:最小 pod 计数设置为 1。 我可以看到我的 Pod 正在运行并且能够处理服务请求。

过了一会儿—— 我已经执行了——“kubectl scale deploy --replicas=0” 运行上述命令后,我可以看到我的 pod 已被删除(尽管 hpa min pod 设置设置为 1),我期待一段时间后 hpa 将扩大到最小 pod 计数,即 1。 但是我没有看到这种情况发生,我已经等了一个多小时,hpa 没有创建新的 pod。 我也尝试向我的 Kubernetes 服务发送请求,我在想现在 hpa 将扩大 pod,因为没有 pod 来服务请求,但是 hps 似乎没有这样做,我得到了一个响应我的服务不可用。

这是我在 kubectl get hpa 中看到的 名称 参考 目标 MINPODS MAXPODS REPLICAS 年龄** 测试部署/xxxx /1000% 1 4 0 1h

有趣的是,我发现 hpa 快速缩减: 当我执行“kubectl scale deploy --replicas=2”(请注意 in hpa 计数为 1)时,我可以看到 2 个 pod快速创建,但在 5 分钟内,1 个 pod 被 hpa 删除。

这是 Kubernetes(尤其是 hpa)的预期行为吗? 如,如果我们通过执行 --"kubectl scale deploy --replicas=0" 删除所有 pod, a) hpa 不会阻止以减少副本数少于配置的 pod 数(在 hpa 配置中)和 b) hpa 不会按比例放大(基于 hpa 旋转周期)到配置的最小 pod 数。 并且本质上 c) 在我们重新部署或执行另一轮“kubectl scale deploy”以更新副本计数之前,不会有此服务的 pod。

这是 Kubernetes 代码库中的预期行为还是(可能的)错误? 我使用的是 Kubernetes 1.8 版本。

【问题讨论】:

【参考方案1】:

这是一个很棒的观察。我正在浏览 HPA 的文档,遇到了 HPA 用来缩放 pod 的数学公式。它看起来像

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

在您的情况下,当前 pod 利用率为零,因为您的 pod 计数为零。所以从数学上讲,这个等式结果为零。因此,如果 pod 计数为零,这就是 HPA 无法工作的原因。

a: HPA 不应阻止手动扩展 pod,因为它仅从资源(cpu、内存等)获得触发。一旦您使用“kubectl scale”或通过任何其他方式进行缩放,HPA 将根据最小、最大副本和平均利用率值出现。

b: 如果当前计数不为零,HPA 会扩展到最小副本数。我试过了,它工作得很好。

c: 是的,除非您将副本数设为非零值,否则 HPA 将无法工作。所以你必须扩大到一些非零值。

希望这能解答您对 HPA 的疑虑。

【讨论】:

感谢 Rajesh 的解释。从 hpa 算法的角度来看是完全有意义的。我的印象是 Kubernetes 引擎可能会在创建/删除任意数量的副本之前查看 hpa 值(如果有一个 hpa 与部署相关联),但事实并非如此。

以上是关于当我们执行“kubectl scale deploy”时,Kubernetes 不尊重 HPA 配置吗?的主要内容,如果未能解决你的问题,请参考以下文章

当 JVM 执行 Java 应用程序时,操作系统的作用是啥?为啥我们需要操作系统?

当我们在 Xcode 中执行程序时,有没有办法查看函数调用的顺序?

当我们执行“kubectl scale deploy”时,Kubernetes 不尊重 HPA 配置吗?

当通过 hp alm 执行 gui 快速测试时,我们如何获取当前运行实例的配置名称

当第三方使用哨兵向我们的服务器执行任何事件时,是不是可以每次都追踪第三方的详细信息?

当我们执行 Mobilefirst 构建时,从哪里复制 wlapp 文件中的 worklight 文件夹?