当我们执行 "kubectl scale deploy" 时,Kubernetes 不遵守 HPA 配置吗?

Doesn't Kubernetes honor HPA configuration when we execute "kubectl scale deploy"?

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

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

这是我在 kubectl get hpa 中看到的 名称参考 TARGETS MINPODS MAXPODS REPLICAS AGE** 测试 Deployment/xxxx /1000% 1 4 0 1h

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

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

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

这是很好的观察。我正在浏览 HPA 的文档并遇到 HPA 用于缩放 pods 的数学公式。它看起来像

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

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

a: HPA 不应阻止 pods 的手动缩放,因为它仅从资源(cpu、内存等)获取触发器。使用 "kubectl scale" 或任何其他方式进行缩放后,HPA 将根据最小、最大副本和平均利用率值出现。

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

c: 是的,除非您将副本计数设置为非零值,否则 HPA 将不起作用。所以你必须扩大到一些非零值。

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