规格规整计算规则说明
设置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服务申请白名单方式放开此限制。
自动规整举例说明
场景描述 |
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资源进行避免。