更新时间:2025-06-26 GMT+08:00

规格规整计算规则说明

对于通过Console或者API在CCI 2.0创建的pod,服务端会根据pod的cpu和内存规格,对pod的资源规格做出规整,以达到合理利用资源并满足CCI资源规格的目的。本章节将详细介绍如何进行资源规格的规整。
表1 CCI支持Pod规格表

容器实例 核/vCPU

容器实例 内存/GiB

0.25

0.5,1,2

0.5

0.5,1,2,3,4

1

1~8,1GiB为步长

2

2~16,1GiB为步长

4

4~32,1GiB为步长

8

8~64,4GiB为步长

16

16~128,8GiB为步长

32

32,64,128,256

48

96,192,384

64

128,256,512

设置Pod规格有两种方式分别为指定pod的内存和CPU规格不指定pod的规格

方式一:指定pod的内存和CPU规格

  • 通过pod annotation "resource.cci.io/pod-size-specs" 设置pod的资源规格。指定规格必须等于表1中支持的pod规格。否则创建pod接口会返回错误信息并拒绝创建pod。"resource.cci.io/pod-size-specs"值可设置格式为"${CPU}_${MEM}",示例:"resource.cci.io/pod-size-specs": "2.00_4.0"。
  • 汇总pod内container的资源规格不能超过通过"resource.cci.io/pod-size-specs"设置的pod规格。否则创建pod接口会返回错误信息并拒绝创建pod。

方式二:不指定pod的规格

  • 不指定pod规格时,则会通过汇总pod内container的资源规格来计算整个pod需要的内存和CPU规格。若计算所得规格匹配上表1中规格,则设置pod规格为匹配上规格值;若未匹配上,则基于表1自动向上规整,设置pod规格为规整后规格值。假设某一pod计算后规格为6core15Gi,自动规整后规格值为8core16Gi。
  • 汇总pod内所有container的CPU和内存资源的计算方式如下:

    pod的规格=max(max(sum(spec.Containers.Request), container.Limit),max(spec.initContainer的资源值))

    sum(spec.Containers.Request) :所有container.Reqeust的CPU和MEM的总和

    max(sum(spec.Containers.Request), container.Limit):上一步计算的request总和与每个container的limit对比,取最大值

    max(spec.initContainer):对所有initContainer的request和limit,CPU资源计算取最大值,内存资源计算取最大值,合并CPU和内存作为最大值

    max(max(sum(spec.Containers.Request), container.Limit),max(spec.initContainer的资源值))取containers和initContainers指定资源量的最大值

  • 向上规整规则如下:

    规整时将向最接近的Pod规格进行调整,必须满足设置的cpu和内存规格小于等于表1支持的cpu和内存规格。若无法向上规整,则pod创建失败

    规整后的规格显示在pod annotation中,格式为resource.cci.io/size=${cpuCeil}_${memoryCeil}

    大于32core CPU的情况,不再进行自动向上规整。若您配置的pod内的container的CPU资源计算之后未匹配上表1中规格,则pod创建失败;若需要对32vCPU以上pod执行自动规整,需在pod annotation中声明"resource.cci.io/resizing-large-size-instance-greater-than-32-cores": "true",允许大规格实例自动规整
    • 若pod未设置"resource.cci.io/pod-size-specs",且pod内所有的container均未设置request和limit时,创建pod会返回错误信息并创建失败。
    • 每个container的CPU和内存需要满足k8s原生的validate要求:当两者存在值时,0<=request<=limit。
    • 每个pod最多创建10个容器。若您存在特殊需求,可以向CCI服务申请白名单方式放开此限制。

自动规整举例说明

表2 自动规整举例

场景描述

Container配置

实际申请资源量

规整后规格

说明

单容器,仅配置request

containers:
  - resources:
      requests:
        cpu: '1.5'
        memory: 2Gi

1.5c2Gi

2c4Gi

只有request,看request值计算资源申请量

单容器,配置request和limit

containers:
  - resources:
      limits:
        cpu: '3.5'
      requests:
        cpu: '1.5'
        memory: 4.5Gi

3.5c4.5Gi

4c5Gi

配置了request和limit,取request和与limit的最大值

多容器,配置request

containers:
  - resources:
      requests:
        cpu: '1.5'
        memory: 2Gi
  - resources:
      requests:
        cpu: '1.5'
        memory: 2Gi

3c4Gi

4c4Gi

多容器,取多容器request和

多容器,配置limit

containers:
  - resources:
      limits:
        cpu: '1.5'
        memory: 2Gi
  - resources:
      limits:
        cpu: '1.5'
        memory: 2Gi

1.5c2Gi

2c4Gi

多容器,取多容器中最大limit

多容器,配置request和limit

containers:
  - resources:
      limits:
        cpu: '5'
        memory: 8Gi
      requests:
        cpu: '1.5'
        memory: 2Gi
  - resources:
      requests:
        cpu: '1.5'
        memory: 2Gi

5c8Gi

8c8Gi

多容器,取多容器Request和与limit的最大值

容器+init容器,容器资源量大

initContainers:
  - resources:
      requests:
        cpu: '1.5'
        memory: 2Gi
containers:
  - resources:
      requests:
        cpu: '3'
        memory: 4Gi

3c4Gi

4c4Gi

取init容器和容器中资源最大值

容器+init容器,init容器资源量大

initContainers:
  - resources:
      requests:
        cpu: '5'
        memory: 8Gi
  - resources:
      requests:
        cpu: '6'
        memory: 9Gi
containers:
  - resources:
      requests:
        cpu: '3'
        memory: 4Gi

6c9Gi

8c12Gi

取init容器中和容器中资源最大值

资源规整后规格与系统支持规格一致

containers:
  - resources:
      requests:
        cpu: '48'
        memory: 96Gi

48c96Gi

48c96Gi

规格匹配成功,无需规整

资源规整后到32c

containers:
  - resources:
      requests:
        cpu: '31'
        memory: 32Gi

31c32Gi

32c32Gi

32c以下规格默认规整

规整后资源大于32c

containers:
  - resources:
      requests:
        cpu: '33'
        memory: 96Gi

33c96Gi

失败

默认不对32c以上实例规整

规整后资源大于32c,并指定了允许对大规格实例进行规整

annotations:
  "resource.cci.io/resizing-large-size-instance-greater-than-32-cores": "true"
containers:
  - resources:
      requests:
        cpu: '33'
        memory: 96Gi

33c96Gi

48c96Gi

用户指定允许对大规格实例规整后,对大规格实例进行规整

从CCE弹性到CCI的Pod,在Pod有多容器,且存在容器仅设置limit的场景下,CCE的pod创建时会遵循原生k8s default_pod规则,规则如下:

在检测到Pod容器未设置request资源但设置了limit资源时,会自动补充request资源且等于limit资源值

示例:在CCE创建1个无状态工作负载deployment,deployment的spec.template里存在2个containers,且每个container仅设置limit资源。pod创建后,每个容器的request资源会被设置,且等于limit资源。

此种场景下,可能出现pod的规整后规格大于预期的情况,您可以通过手动指定容器的request资源进行避免。