Pod 副本缩减在 Kubernetes Horizontal Pod Autoscaler 中是如何工作的?
Posted
技术标签:
【中文标题】Pod 副本缩减在 Kubernetes Horizontal Pod Autoscaler 中是如何工作的?【英文标题】:How does pod replica scaling down work in Kubernetes Horizontal Pod Autoscaler? 【发布时间】:2018-10-09 08:51:30 【问题描述】:我的理解是,在 Kubernetes 中,在使用 Horizontal Pod Autoscaler 时,如果 targetCPUUtilizationPercentage
字段设置为 50%,并且所有 pod 副本的平均 CPU 利用率高于该值,HPA 会创建更多副本.一旦平均 CPU 低于 50% 一段时间,它会降低副本数。这是我不确定的部分:
如果 pod 上的 CPU 利用率为 10%,而不是 0%,HPA 是否仍会终止副本? 10% 的 CPU 并不多,但由于它不是 0%,因此当前正在运行某些任务那个吊舱。如果这是一个持续时间很长的任务(几秒钟)并且 HPA 决定终止 pod,则该任务将不会完成。
HPA 是仅在其 CPU 利用率为 0% 时终止 Pod,还是在看到该值低于 targetCPUUtilizationPercentage
时终止它们?
HPA 如何决定删除哪些 pod? 谢谢!
【问题讨论】:
嗨,据我了解,HPA 使用相对值来决定是否增加副本数。我附上了链接以作进一步解释。 github.com/kubernetes/community/blob/master/contributors/… 【参考方案1】:所以你有两个问题,让我一一解决。第一部分 - 如果副本集中的 pod 正在消耗 10%,那么 Kubernetes 会杀死那个 pod 吗?答案是肯定的。 Kubernetes 不是查看单个 pod,而是查看该副本集中所有 pod 的该指标的平均值。缩小也是逐渐的as explained here
问题的第二部分——当一个 pod 即将被杀死但它仍在处理一些请求时,你的应用程序如何优雅地运行?这可以由grace period of the pod termination 处理,如果您实现a PreStop
hook 会更好——这将允许您执行诸如停止接收传入请求但处理现有请求之类的操作。这个的实现会根据你使用的语言运行时而有所不同,所以我不会在这里详细介绍。
最后 - 您应该考虑的一种情况是,如果正在运行 pod 的 VM 突然停机 - 您没有机会执行 PreStop 挂钩!我认为应用程序需要足够强大以处理故障。
【讨论】:
优秀的答案。谢谢! @Vishal Biyani 直到我知道我们需要设置宽限期来完成现有请求之前我一直认为 k8s 服务会在 pod 关闭之前重定向所有新请求? @im7mortal - 你是对的,K8S 将停止路由请求,如文档所述:“当 kubelet 开始正常关闭时,控制平面会从 Endpoints 中删除正在关闭的 Pod”。非常适合短暂的 HTTP 请求,但我不想对工作负载做出假设。它也可能是一个运行时间更长的数据处理请求,因此保持答案足够通用。以上是关于Pod 副本缩减在 Kubernetes Horizontal Pod Autoscaler 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章