
# 规格规整计算规则说明
对于通过Console或者API在CCI 2.0创建的pod，服务端会根据pod的cpu和内存规格，对pod的资源规格做出规整，以达到合理利用资源并满足CCI资源规格的目的。本章节将详细介绍如何进行资源规格的规整。
 表1CCI支持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"，允许大规格实例自动规整
  ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/caution_3.0-zh-cn.png)
  - 若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   | 2c2Gi   | 只有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 | 用户指定允许对大规格实例规整后，对大规格实例进行规整           |
   
![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/caution_3.0-zh-cn.png)
从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资源进行避免。
