磁盘配置

存储容量

INFO

请将以下分区挂载到专用磁盘或 LVM 配置的逻辑卷上,以便后续扩展。

分区最小大小推荐大小备注
/var/lib/etcd10GB20GB建议使用专用的高 IO 磁盘来存放 etcd 数据。
/var/lib/containerd/100GB150GB
/cpaas/global 集群控制平面节点至少 100GB;
其他节点至少 40GB
200GB如果预期 infra 节点组件需要更多 /cpaas/ 空间,请预留额外空间。
/50GB100GB,越大越好确保有足够的空闲磁盘空间以保持利用率低于 80%。如果使用率超过该阈值,节点上的 Pod 可能会被驱逐。
用于下载和解压安装包、扩展等的任意位置20GB250GB实际存储需求取决于计划安装的扩展。
如果预期后续添加更多组件或启用额外功能,请预留更多空间。

推荐的 ETCD 实践

快速存储对于 etcd 的可靠运行至关重要。etcd 依赖持久且低延迟的磁盘操作来将提案持久化到其预写日志(WAL)。
如果磁盘写入耗时过长,fsync 延迟可能导致成员错过心跳,无法及时提交提案,并出现请求超时或临时领导者变更。这些问题也会减慢 Kubernetes API 并降低整体集群响应速度。
总之,HDD 是不佳的选择,不推荐使用。如果必须使用 HDD 作为 etcd 存储,请选择最快的(例如 15,000 RPM)。

INFO

以下硬盘实践可提供最佳的 etcd 性能:

  • 优先使用 SSD 或 NVMe 作为 etcd 磁盘。当写入耐久性和稳定性为优先考虑时,建议使用服务器级单层单元(SLC)SSD。避免使用 NAS、SAN 和 HDD。

    • 优先选择写入吞吐量高的磁盘,以加速压缩和碎片整理。
    • 优先选择读取带宽强的磁盘,以缩短故障后恢复时间。
    • 优先选择延迟稳定且低的磁盘,确保快速的读写操作。
  • 避免使用分布式块存储系统,如 Ceph RADOS Block Device (RBD)、网络文件系统 (NFS) 及其他网络附加后端,因为它们会引入不可预测的延迟。

  • 将 etcd 数据保存在专用磁盘或专用逻辑卷上。

    • 不要在控制平面主机上放置 I/O 敏感(如日志)或其他高强度文件系统活动,或者至少不要让它们与 etcd 共享相同的底层存储。
  • 持续使用 fio 等工具进行基准测试,并利用结果跟踪集群增长时的性能。详情请参阅 磁盘基准测试指南

验证 etcd 硬件

规格最低要求推荐备注
顺序写入 IOPS50500(越高越好)大多数云服务商公布的是并发 IOPS,而非顺序 IOPS。并发 IOPS 通常比顺序 IOPS 高约 10 倍。
磁盘带宽10 MB/s100 MB/s(越高越好)更高的磁盘带宽可以加快故障成员追赶集群时的数据恢复速度。
吞吐量(顺序 8 kB 写入,带 fdatasync50 次写入/10 毫秒500 次写入/2 毫秒反映每次写入操作后数据刷新到磁盘时的持续写入吞吐量。

使用 fio 进行基准测试

为了测量实际的顺序 IOPS 和吞吐量,建议使用磁盘基准测试工具 fio。您可以参考以下说明:

WARNING

请勿在 集群的任何节点上运行这些测试。
请在与控制平面节点配置相同的专用虚拟机上运行测试。\

set -e
mkdir -p /var/lib/etcd/

echo "INFO: Running fio"
fio --rw=write --ioengine=sync --fdatasync=1 --directory=/var/lib/etcd --size=100m --bs=8000 --name=etcd_perf --output-format=json --runtime=60 --time_based=1 | tee /tmp/fio.out

# Scrape the fio output for p99 of fsync in ns
fsync=$(cat /tmp/fio.out | jq '.jobs[0].sync.lat_ns.percentile["99.000000"]')
iops=$(cat /tmp/fio.out | jq '.jobs[0].write.iops')
echo "INFO: 99th percentile of fsync is $fsync ns"

# Compare against the recommended value
if [[ $fsync -ge 10000000 ]]; then
    echo "WARN: IOPS is $iops, 99th percentile of the fsync is greater than the recommended value which is ${fsync} ns > 10 ms, faster disks are recommended to host etcd for better performance"
else
    echo "INFO: IOPS is $iops, 99th percentile of the fsync is within the recommended threshold: - 10 ms, the disk can be used to host etcd"
fi