Kubernetes吊舱获得不同的CPU限制

Kubernetes吊舱获得不同的CPU限制,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我们在Kubernetes集群中有几个应用程序使用ApacheIgnite。Ignite创建各种线程池,其大小如下: Math.max(8, Runtime.getRuntime().availableProcessors()) 因此,基本上线程池的大小将始终至少为8,但如果系统认为有更多处理器,则可能会更大 我们遇到的问题是,一些POD的池大小为8,而其他POD的池大小为36,即节点上的CPU数量 我们正在使用Helm部署所有应用程序,但我们没有为任何POD设置任何CPU限制。理论上,它们都

我们在Kubernetes集群中有几个应用程序使用ApacheIgnite。Ignite创建各种线程池,其大小如下:

Math.max(8, Runtime.getRuntime().availableProcessors())
因此,基本上线程池的大小将始终至少为8,但如果系统认为有更多处理器,则可能会更大

我们遇到的问题是,一些POD的池大小为8,而其他POD的池大小为36,即节点上的CPU数量

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

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

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

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

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

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


我们似乎处于一种竞争状态,在应用程序启动初期,该值报告为36,但在某个时候下降到2。根据点燃豆子的时间,他们看到的是36或2。确实很奇怪。它们是否在同一名称空间中?舵图上是否有
配额
限制范围
或您设置的


另外,您是否可以通过运行
kubectl get nodes-o custom columns='NAME:metadata.NAME,cpu:status.capacity.cpu'
来验证cpu的限制

确实很奇怪。它们是否在同一名称空间中?舵图上是否有
配额
限制范围
或您设置的

另外,您是否可以通过运行
kubectl get nodes-o custom columns='NAME:metadata.NAME,cpu:status.capacity.cpu'
来验证cpu的限制

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
        resources:
          requests:
            cpu: 1000m
我在本地的Redhat7机器上运行了这个,它有24个内核。预期产出为:

Number of CPUs = 24
然后,我将各种CPU资源请求应用于部署:

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
        resources:
          requests:
            cpu: 1000m
并重新部署。结果很有趣:

  • CPU请求设置为500m:应用程序报告1个CPU
  • CPU请求设置为1000m:应用程序报告24个CPUtl;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
    
            resources:
              requests:
                cpu: 1000m
    
    我在本地的Redhat7机器上运行了这个,它有24个内核。预期产出为:

    Number of CPUs = 24
    
    然后,我将各种CPU资源请求应用于部署:

    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
    
            resources:
              requests:
                cpu: 1000m
    
    并重新部署。结果很有趣:

    • CPU请求设置为500m:应用程序报告1个CPU

    • CPU请求设置为1000m:应用程序报告24个CPU您是否有任何HPA
      $kubectl get HPA--所有名称空间
      ?另外,这个头盔是公共的还是你的私人的?@PjoterS我们有1个HPA,头盔图表是私人的(它们很简单,我看看是否可以将它们发布到原始问题中)。如果你可以粘贴你的部署和HPA YAML,这将非常有帮助。乍一看,HPA似乎只针对一个池。@PjoterS也许……但我们有几个没有HPA的应用程序也可以看到36个CPU。我会试着把它们贴出来,我只是不确定我是否看到了它们的相关性。我确实添加了一个注释,我们在每个应用程序中都有一个健康检查,报告可用处理器的数量,每个应用程序在启动后显示2个。让我觉得在启动时存在一个竞争条件,即数字从36开始,然后下降到2,并且取决于Ignite启动的时间,它可能会看到错误的数字。您是否有任何HPA
      $kubectl get HPA--所有名称空间
      ?另外,这个头盔是公共的还是你的私人的?@PjoterS我们有1个HPA,头盔图表是私人的(它们很简单,我看看是否可以将它们发布到原始问题中)。如果你可以粘贴你的部署和HPA YAML,这将非常有帮助。乍一看,HPA似乎只针对一个池。@PjoterS也许……但我们有几个没有HPA的应用程序也可以看到36个CPU。我会试着把它们贴出来,我只是不确定我是否看到了它们的相关性。我确实添加了一个注释,我们在每个应用程序中都有一个健康检查,报告可用处理器的数量,每个应用程序在启动后显示2个。让我觉得在启动时有一个竞争条件,即数字从36开始,然后下降到2,并且取决于Ignite启动的时间,它可能会看到错误的数字。是的,所有应用程序都在同一名称空间中运行。我们有3个节点,都报告36个CPU。是的,所有应用程序都在同一个名称空间中运行。我们有3个节点,全部报告36个CPU。仅供参考,关于CPU请求,请检查以下文档:1等于1000m。不过,我认为这种情况可能与2和4有关,但不管怎样,它工作正常。谢谢@PjoterS,我之前确实读过这些。我的具体情况是,当仅CPU资源设置为
      1
      1000m
      时,我的Java应用程序认为它在节点上拥有所有CPU。如果我也设置了一个CPU限制,问题就会消失,但是我们有一些不想设置限制的情况。我打开了一个GitHub问题,以防其他人感兴趣:。看起来这实际上可能是OpenJDK的问题,但还不确定。仅供参考,关于CPU请求,请检查以下文档:所以1等于1000m。然而我认为这是一个很好的例子