使用 Horizo​​ntal Pod Autoscaling 以及资源请求和限制

Posted

技术标签:

【中文标题】使用 Horizo​​ntal Pod Autoscaling 以及资源请求和限制【英文标题】:Using Horizontal Pod Autoscaling along with resource requests and limits 【发布时间】:2021-08-14 20:35:06 【问题描述】:

假设我们有以下部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  replicas: 2
  template:
    spec:
      containers:
        - image: ...
          ...
          resources:
            requests:
              cpu: 100m
              memory: 50Mi
            limits:
              cpu: 500m
              memory: 300Mi

我们还创建了一个 HorizontalPodAutoscaler 对象,它会根据 CPU 平均利用率自动增加/减少 pod 的数量。我知道 HPA 会根据资源 requests 计算 pod 的数量,但是如果我希望容器能够在水平扩展之前请求更多资源怎么办?

我有两个问题:

1) 在定义 HPA 时,K8s 是否会使用资源limits

2) 我可以告诉 HPA 根据资源限制而不是请求进行扩展吗?或者作为实现这种控制的一种手段,我可​​以将targetUtilization 的值设置为100% 以上吗?

【问题讨论】:

【参考方案1】:

不,HPA 根本不考虑限制。您可以将目标利用率指定为任何甚至高于 100% 的值。

【讨论】:

【参考方案2】:

您好,在部署中,我们有资源请求和限制。根据文档here,这些参数在 HPA 成为自动缩放器的主要角色之前起作用:

    创建 Pod 时,Kubernetes 调度程序会选择一个节点用于 要运行的 Pod。 每个节点都有一个最大容量对于每个 资源类型:它可以提供的 CPU 和内存量 豆荚。 然后 kubelet 启动 Pod 的容器,它将 CPU 和内存限制传递给容器运行时。 如果容器超过其内存限制,它可能会被终止。如果它是可重新启动的,kubelet 将重新启动它,就像任何其他类型的运行时故障一样。

如果一个 Container 超过了它的内存请求,很可能只要节点内存不足,它的 Pod 就会被驱逐。

另一方面:

Horizo​​ntal Pod Autoscaler 实现为一个控制循环,其周期由控制器管理器控制(默认值为 15 秒)。 控制器管理器根据每个 Horizo​​ntalPodAutoscaler 定义中指定的指标查询资源利用率。

注意: 请注意,如果 pod 的某些容器没有相关的资源请求集,则不会定义 pod 的 CPU 利用率,并且自动缩放器不会对该指标采取任何操作。

希望有帮助

【讨论】:

以上是关于使用 Horizo​​ntal Pod Autoscaling 以及资源请求和限制的主要内容,如果未能解决你的问题,请参考以下文章

Pod 副本缩减在 Kubernetes Horizo​​ntal Pod Autoscaler 中是如何工作的?

Kubernetes Horizo​​ntal Pod Autoscaler 如何计算多容器 Pod 的 CPU 利用率?

Kubernetes Pod Horizo​​ntal Autoscaler pod 和对象选择器字段是字符串吗?

使用 Prometheus 适配器的 Horizo​​ntal Pod Autoscaler (HPA) 自定义指标(单位是如何定义的?)

如何在 Kubernetes Horizo​​ntal Pod Autoscaling 中排除一些容器的指标

如何在 gke 中将 kube-controller-manager 中的 --horizo​​ntal-pod-autoscaler-sync-period 字段更改为 5sec