磁盘配置

存储容量

INFO

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

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

上述分区布局描述的是运行非 Alauda OS 的节点。在节点运行 Alauda OS 的集群中,平台状态存储在 /var/cpaas 下,而不是 /cpaas 下;节点磁盘则在 provider 的机器配置中声明,而不是手动进行分区。容量建议仍然适用。有关各 provider 的磁盘声明操作步骤,请参阅Alauda OS 上创建工作负载集群。

ETCD 最佳实践

快速存储对 etcd 的可靠运行至关重要。etcd 依赖持久、低延迟的磁盘操作,将提案写入其预写日志 (WAL)。
如果磁盘写入耗时过长,fsync 延迟可能导致成员错过心跳、无法及时提交提案,并出现请求超时或临时的领导者变更。这些问题还可能拖慢 Kubernetes API,降低整个集群的响应能力。
总之,HDD 并非理想选择,不建议使用。如果必须将 HDD 用于 etcd,请选择可用的最快型号(例如 15,000 RPM)。

INFO

遵循以下硬盘使用建议,可让 etcd 获得最佳性能:

  • etcd 磁盘优先选择 SSD 或 NVMe。当写入耐久性和稳定性至关重要时,可考虑服务器级单层单元 (SLC) SSD。避免使用 NAS、SAN 和 HDD。

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

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

    • 不要在控制平面主机上运行 I/O 敏感型活动(例如日志记录)或其他密集的文件系统活动;至少不要让这些活动与 etcd 共用同一底层存储。
  • 持续使用 fio 等工具进行基准测试,并根据测试结果跟踪集群增长时的性能。更多信息,请参阅磁盘基准测试指南。

验证 etcd 的硬件

规格最低要求建议备注
顺序写入 IOPS50500(越高越好)大多数云提供商公布的是并发 IOPS,而不是顺序 IOPS。并发 IOPS 值通常约为顺序 IOPS 的 10 倍。
磁盘带宽10 MB/s100 MB/s(越高越好)更高的磁盘带宽可在成员发生故障、需要追赶集群进度时,加快数据恢复速度。
吞吐量(使用 fdatasync 进行顺序 8 kB 写入)每 10 ms 写入 50 次每 2 ms 写入 500 次反映每次写入操作后将数据刷新到磁盘时的持续写入吞吐量。

使用 fio 进行基准测试

要测量实际的顺序 IOPS 和吞吐量,请使用磁盘基准测试工具 fio:

WARNING

不要在 集群的任何节点上运行这些测试。
请改为在配置与控制平面节点相同的专用 VM 上运行测试。\

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