【发布时间】: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