【问题标题】:Kubernetes pods getting different CPU limitsKubernetes pod 获得不同的 CPU 限制
【发布时间】:2021-09-27 15:46:17
【问题描述】:

我们在 Kubernetes 集群中有多个使用 Apache Ignite 的应用程序。 Ignite 创建了各种大小如下的线程池:

Math.max(8, Runtime.getRuntime().availableProcessors())

所以基本上线程池的大小总是至少为 8,但如果系统认为有更多处理器,则可能更多。

我们遇到的问题是,一些 pod 使用 8 大小的池进行旋转,而其他 pod 使用 36 大小,这是节点上的 CPU 数量。

我们使用 Helm 部署所有应用,但我们为任何 pod 设置任何 CPU 限制。理论上,它们都应该看到相同数量的可用 CPU。

还有什么可能导致同一节点上的 pod 看到有多少可用处理器的不同视图?

更新

我们在所有应用程序中都有一个运行状况端点,它使用与 Ignite 相同的 Runtime#availableProcessors() 方法显示 JVM 报告的 CPU 数量。

我们所有的应用程序,包括 Ignite 认为有 36 个 CPU 的应用程序,在进程启动后都会报告 2 个处理器。

我在该方法的 Java 文档中发现了以下有趣的一行:

此值可能会在虚拟机的特定调用期间发生变化。因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况。

似乎我们处于竞争状态,在应用程序启动的早期,该值报告为 36,但在某些时候下降到 2。根据 Ignite bean 的触发时间,它们会看到 36 或 2。

【问题讨论】:

  • 您有任何 HPA $ kubectl get hpa --all-namespaces 吗?此外,此 HELM 是公开的还是您的私有?
  • @PjoterS 我们确实有 1 个 HPA,并且 Helm 图表是私有的(它们非常简单,我会看看是否可以将它们发布到原始问题)
  • 如果您可以粘贴您的部署和 HPA YAML,这将有很大帮助。乍一看,HPA 似乎只针对一个池。
  • @PjoterS 也许......但我们有几个没有 HPA 的应用程序也看到 36 个 CPU。我会尝试发布它们,我只是不确定我是否看到了相关性。我确实添加了一条说明,我们在每个报告可用处理器数量的应用程序中进行了健康检查,并且 每个 应用程序在启动后显示 2。让我觉得启动时存在竞争条件,数字从 36 开始,然后下降到 2,并且根据 Ignite 的启动时间,它可能会看到错误的数字。

标签: kubernetes kubernetes-helm


【解决方案1】:

tl;dr 根本问题似乎是resources.requests.cpu 被精确设置为1000m

我编写了一个简单的 Java 应用程序,它转储了可用的处理器数量:

public class CpuTest {
    public static void main(String[] args) {
        System.out.println("Number of CPUs = "
                            + Runtime.getRuntime().availableProcessors());   
    }
}

我打包成一个 Dockerfile 并创建了一个简单的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cputest
  labels:
    app: cputest
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cputest
  template:
    metadata:
      labels:
        app: cputest
    spec:
      containers:
      - name: cputest
        image: dev/cputest:latest
        imagePullPolicy: Never

我在我的本地 RedHat 7 机器上运行了这个,它有 24 个内核。预期的输出:

Number of CPUs = 24

然后我将各种 CPU 资源请求应用于部署:

        resources:
          requests:
            cpu: 1000m

并重新部署。结果很有趣:

  • CPU 请求设置为 500m:应用报告 1 个 CPU
  • CPU 请求设置为 1000m:应用报告 24 CPU
  • CPU 请求设置为 1001m:应用报告 2 个 CPU
  • CPU 请求设置为 2000m:应用报告 2 个 CPU
  • CPU 请求设置为 4000m:应用报告 4 个 CPU

因此,仅当 CPU 请求设置为 1000m 时才会出现问题(也尝试了 1 并得到相同的结果,它认为它拥有所有 24 个 CPU)。

我回去查看了我们所有的应用程序。果然,我们将 CPU 请求完全设置为 1000m 的那些是有问题的。任何其他值都按预期工作。

最有趣的是,当我还将 CPU 限制设置为 1000m 时,问题就消失了,JVM 报告了 1 个 CPU。

这很可能是意料之中的,我不完全了解 Kubernetes 是如何使用 CPU 资源和限制的,或者可能是我们使用的版本 (1.12.7) 存在问题。

不管怎样,我至少知道为什么我们的一些 pod 看到不同的 CPU。

【讨论】:

【解决方案2】:

确实很奇怪。它们在同一个命名空间中吗?有没有quota或者Limit range的舵图或者你设置的?

另外,你能通过运行kubectl get nodes -o custom-columns='NAME:metadata.name,CPU:status.capacity.cpu' 来验证cpu 的限制吗?

【讨论】:

  • 是的,所有应用都在同一个命名空间中运行。我们有 3 个节点都报告了 36 个 CPU。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2021-09-03
  • 2023-01-19
  • 2023-01-11
相关资源
最近更新 更多