【问题标题】:GKE resource request can't be lowered past 100 mCPUGKE 资源请求不能低于 100 mCPU
【发布时间】:2021-09-25 10:43:22
【问题描述】:

我最近使用 GKE 版本 1.19.9-gke.1900 设置了一个 Kubernetes 集群,目的是在不同的命名空间中启动微服务组。每个服务的 pod 都包含一个服务镜像和一个 Istio 代理镜像。每个 pod 的初始 CPU 资源请求是 100 mCPU,但这比给定命名空间中的大多数服务将使用的要多。这导致集群用尽可用 CPU 来启动服务,即使我在任何给定时间只使用了大约 25% 的可用总 CPU。

垂直自动缩放已禁用,我尝试使用 Deployment、ResourceQuota 和 LimitRange 清单将资源限制设置为 25 mCPU。

# First tried this
apiVersion: apps/v1
kind: Deployment
spec:
  ...
  template:
    ...
    spec:
      containers:
        - name: service-name
          image: service-name:dev
          resources:
            requests:
              cpu: 25m
              memory: 128Mi
            limits:
              cpu: 2000m
              memory: 512Mi
      ...
---
# Then this
apiVersion: v1
kind: LimitRange
metadata:
  name: limit-range-limiter
spec:
  limits:
    - default:
        cpu: 100m
        memory: 512Mi
      defaultRequest:
        cpu: 25m
        memory: 128Mi
      type: Container
---
# Then this finally
apiVersion: v1
kind: ResourceQuota
metadata:
  name: resource-limiter
spec:
  hard:
    requests.cpu: 25m
    limits.cpu: 2000m
    requests.memory: 128Mi
    limits.memory: 512Mi

使用 Deployment 和 LimitRange,Pod 将请求 125 mCPU,而不是只为服务的 pod 请求 25 mCPU。并且使用 ResourceQuota,我收到一个错误,我必须设置 cpu 和内存请求和限制,尽管它在清单中。这会导致副本失败并阻止我的服务启动。

我还注意到,每个命名空间都默认从 GKE 安装了一个名为 gke-resource-quotas 的 ResourceQuota,它无法编辑。但是,如果我在创建命名空间之后但在部署任何服务之前直接应用 ResourceQuota 清单,则不会添加 gke-resource-quotas 文件。

Pod 是否可以在 GKE 上请求低于 100 mCPU 的任何内容?

编辑:我们设法弄清楚发生了什么。 Istio 默认为 Pod 请求 100 mCPU。实际的配置值是在istio-sidecar-injector ConfigMap 中设置的。一旦我们更改了该值,Pod 就可以从较低的值开始。

【问题讨论】:

  • here,100m 被提及为默认值,但没有提及最小值(即使对于许多应用程序而言,100m 经常被提及太小)。你的应用真的只需要 2.5% 的 CPU 吗?
  • 对不起,我误读了您的评论。此处的目的是将应用程序启动到最低资源状态以进行开发。通常情况下,一些服务不会被使用,因此它们不需要太多的运行 CPU。但是如果它们在命名空间内被访问,它们就在那里。命名空间完全有可能在其生命周期中使用少于 2.5% 的 CPU。

标签: kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

想要扩展 guillaume blaquiere 所说的话,Pod 可以请求任何低于 100 mCPU 的东西。例如看,Resource requests and limits

1- CPU 的默认请求是 100m。这对于许多应用程序来说太小了,并且可能远小于节点上可用的 CPU 量。

2- 没有默认的内存请求。没有默认内存请求的 Pod 可以调度到没有足够内存来运行 Pod 工作负载的节点上。

3- 将 CPU 或内存请求的值设置得太小可能会导致将过多的 Pod 或不理想的 Pod 组合调度到给定节点上并降低性能。

4-为 CPU 或内存请求设置过大的值可能会导致 Pod 无法调度并增加集群资源的成本。

更多信息refer

【讨论】:

  • 所以我知道您理论上可以使用 Pod 清单文件创建一个 pod。但是我得到的是当使用部署清单或任何限制器时,GKE 不会使用给定的 cpu 启动请求启动 pod。这似乎违背了基本的 Kubernetes 和 GKE 文档。
猜你喜欢
  • 2017-01-07
  • 2020-03-15
  • 2021-10-21
  • 2017-07-09
  • 1970-01-01
  • 2023-02-25
  • 2015-05-26
  • 2011-11-30
相关资源
最近更新 更多