
# 选择合适的节点数据盘大小
节点在创建时会默认创建一块数据盘，供容器运行时和Kubelet组件使用，详情请参见[数据盘空间分配说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0341.html)。由于容器运行时和Kubelet组件使用的数据盘不可被卸载，且默认大小为100G，出于使用成本考虑，您可手动调整该数据盘容量，最小支持下调至20G，节点上挂载的普通数据盘支持下调至10G。
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
调整容器运行时和Kubelet组件使用的数据盘大小存在一些风险，根据本文提供的预估方法，建议综合评估后再做实际调整。
- 过小的数据盘容量可能会频繁出现磁盘空间不足，导致镜像拉取失败的问题。如果节点上需要频繁拉取不同的镜像，不建议将数据盘容量调小。
- 集群升级预检查会检查数据盘使用量是否超过95%，磁盘压力较大时可能会影响集群升级。
- Device Mapper类型比较容易出现空间不足的问题，建议使用OverlayFS类型操作系统，或者选择较大数据盘。
- 从日志转储的角度，应用的日志应单独挂盘存储，以免dockersys分区存储空间不足，影响业务运行。

- 调小数据盘容量后，建议您的集群安装npd插件，用于检测可能出现的节点磁盘压力问题，以便您及时感知。如出现节点磁盘压力问题，可根据[数据盘空间不足时如何解决]进行解决。
 
#### 约束与限制
- 仅1.19及以上集群支持调小容器运行时和Kubelet组件使用的数据盘容量。
- 调整数据盘大小功能只支持云硬盘，不支持本地盘（本地盘仅在节点规格为"磁盘增强型"或"超高I/O型"时可选）。
 
#### 如何选择合适的数据盘
在选择合适的数据盘大小时，需要结合以下考虑综合计算：
- 在拉取镜像过程中，会先从镜像仓库中下载镜像tar包然后解压，最后删除tar包保留镜像文件。在tar包的解压过程中，tar包和解压出来的镜像文件会同时存在，占用额外的存储空间，需要在计算所需的数据盘大小时额外注意。
- 在集群创建过程中，节点上可能会部署必装插件（如Everest插件、coredns插件等），这些插件会占用一定的空间，在计算数据盘大小时，需要为其预留大约2G的空间。
- 在应用运行过程中会产生日志，占用一定的空间，为保证业务正常运行，需要为每个Pod预留大约1G的空间。
根据不同的节点存储类型，详细的计算公式请参见[OverlayFS类型]及[Device Mapper类型]。
 #### OverlayFS类型
OverlayFS类型节点上的容器运行时和容器镜像空间默认占数据盘空间的90%（建议维持此值），这些容量全部用于dockersys分区，计算公式如下：
- 容器运行时和容器镜像空间：默认占数据盘空间的90%，其空间大小 = 数据盘空间 \* 90%
  - dockersys分区（/var/lib/docker路径）：容器运行时和容器镜像空间（默认占90%）都在/var/lib/docker目录下，其空间大小 = 数据盘空间 \* 90%
   
- Kubelet组件和EmptyDir临时存储：占数据盘空间的10%，其空间大小 = 数据盘空间 \* 10%
在OverlayFS类型的节点上，由于拉取镜像时，下载tar包后会存在解压过程，该过程中tar包和解压出来的镜像文件会同时存在于dockersys空间，会占用约2倍的镜像实际容量大小，等待解压完成后tar包会被删除。因此，在实际镜像拉取过程中，除去系统插件镜像占用的空间后，需要保证dockersys分区的剩余空间大于2倍的镜像实际容量。为保证容器能够正常运行，还需要在dockersys分区预留出相应的Pod容器空间，用于存放容器日志等相关文件。
因此在选择合适的数据盘时，需满足以下公式：
**dockersys分区容量 \> 2\*镜像实际总容量 + 系统插件镜像总容量（约2G） + 容器数量 \* 单个容器空间（每个容器需预留约1G日志空间）**
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
当容器日志选择默认的json.log形式输出时，会占用dockersys分区，若容器日志单独设置持久化存储，则不会占用dockersys空间，请根据实际情况估算**单个容器空间**。
例如：
假设节点的存储类型是OverlayFS，节点数据盘大小为20G。根据[上述计算公式]，默认的容器运行时和容器镜像空间比例为90%，则dockersys分区盘占用：20G\*90% = 18G，且在创建集群时集群必装插件可能会占用2G左右的空间。倘若此时您需要部署10G的镜像tar包，但是由于解压tar包时大约会占用20G的dockersys空间，再加上必装插件占用的空间，超出了dockersys剩余的空间大小，极有可能导致镜像拉取失败。
 #### Device Mapper类型
Device Mapper类型节点上的容器运行时和容器镜像空间默认占数据盘空间的90%（建议维持此值），这些容量又分为dockersys分区和thinpool空间，计算公式如下：
- 容器运行时和容器镜像空间：默认占数据盘空间的90%，其空间大小 = 数据盘空间 \* 90%
  - dockersys分区（/var/lib/docker路径）：默认占比20%，其空间大小 = 数据盘空间 \* 90% \* 20%
  
  - thinpool空间：默认占比为80%，其空间大小 = 数据盘空间 \* 90% \* 80%
   
- Kubelet组件和EmptyDir临时存储：占数据盘空间的10%，其空间大小 = 数据盘空间 \* 10%
在Device Mapper类型的节点上，拉取镜像时tar包会在dockersys分区临时存放，等tar包解压后会把实际镜像文件存放在thinpool空间，最后dockersys空间的tar包会被删除。因此，在实际镜像拉取过程中，需要保证dockersys分区的空间大小和thinpool空间大小均有剩余。由于dockersys空间比thinpool空间小，因此在计算数据盘空间大小时，需要额外注意。为保证容器能够正常运行，还需要在dockersys分区预留出相应的Pod容器空间，用于存放容器日志等相关文件。
因此在选择合适的数据盘时，需同时满足以下公式：
- **dockersys分区容量 \> tar包临时存储（约等于镜像实际总容量） + 容器数量 \* 单个容器空间（每个容器需预留约1G日志空间）**
- **thinpool空间 \> 镜像实际总容量 + 系统插件镜像总容量（约2G）**
 
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
当容器日志选择默认的json.log形式输出时，会占用dockersys分区，若容器日志单独设置持久化存储，则不会占用dockersys空间，请根据实际情况估算**单个容器空间**。
例如：
假设节点的存储类型是Device Mapper，节点数据盘大小为20G。根据[上述计算公式]，默认的容器运行时和容器镜像空间比例为90%，则dockersys分区盘占用：20G\*90%\*20% = 3.6G，且在创建集群时集群必装插件可能会占用2G左右的dockersys空间，所以剩余1.6G左右。倘若此时您需要部署大于1.6G的镜像tar包，虽然thinpool空间足够，但是由于解压tar包时dockersys分区空间不足，极有可能导致镜像拉取失败。
 #### 数据盘空间不足时如何解决
**方案一：清理镜像**
您可以执行以下步骤清理未使用的镜像：
- 使用containerd容器运行时的节点：
  1. 查看节点上的本地镜像。
     ```
     crictl images -v
     ```
     
  
  2. 确认镜像无需使用，并通过镜像ID删除无需使用的镜像。
     ```
     crictl rmi {镜像ID}
     ```
     
   
- 使用docker容器运行时的节点：
  1. 查看节点上的本地镜像。
     ```
     docker images
     ```
     
  
  2. 确认镜像无需使用，并通过镜像ID删除无需使用的镜像。
     ```
     docker rmi {镜像ID}
     ```
     
   
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
请勿删除cce-pause等系统镜像，否则可能导致无法正常创建容器。
**方案二：扩容磁盘**
您可以根据您的需求扩容数据盘大小，详情请参见[存储扩容](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00198.html)。
