翻译:小君君(才云)
技术校对:星空下的文仔(才云)、bot(才云)
大多数开发人员都认为在部署集群时选择合适的存储技术极为重要。但是,在 Kubernetes 这片市场上,人们对于存储技术的选择并没有一个标准的答案。本文将介绍 Kubernetes 中常用的 6 种存储,分析它们的使用场景和优缺点,并对它们进行性能测试,找出哪种存储解决方案才是最理想的选择。
存储技术的选择在很大程度上取决于工程师们要运行的工作负载类型。如果你正在使用 Kubernetes,你可能偏向于通过动态配置使用 volume 来进行块存储。对于裸机集群,你就需要为你的用例选择最为合适的技术,并将其集成到你的硬件上。
此外,例如 AKS、EKS 和 GKE 等公有云可以开箱即用并带有块存储,但这并不意味着它们是最好的选择。在许多情况下,默认公有云存储类的故障转移时间较长。例如,在 AWS EBS 中存在一个故障的 VM,附在此 VM Pod 上的 volume 需要 5 分钟以上的时间才能在另一个节点上重新联机。但是,像 Portworx 和 OpenEBS 此类云原生存储就可以很快解决这种问题。
本文的目的就是寻找在 Kubernetes 中最常用的存储解决方案,并进行基本性能比较。本次测试使用以下存储后端对 Azure AKS 执行所有测试:
Azure 原生 StorageClass:Azure 高级版;
将 AWS cloud volume 映射到实例中:Azure hostPath,附带 Azure 托管磁盘;
由 Rook 管理的 Ceph;
由 Heketi 管理的 Gluster;
带有 cStor 后端的 OpenEBS;
Portworx。
测试结果
*注:请将结果作为存储选择期间的标准之一,但不要仅根据本文的数据做出最终判断。
在描述过程之前,我们先总结一下最终结论。如果我们忽略本地 Azure pvc 或 hostPath,测试结果是:
Portworx 是 AKS 最快的容器存储;
Ceph 是 HW 集群的最佳开源后端存储,但对于公有云,它的操作复杂性较高;
OpenEBS 是一个很棒的概念,但需要更多的后端优化(这个项目正在优化中)。
那么这究竟是为什么呢?让我们从每个后端存储介绍安装说明开始,详述 AKS 测试的具体过程!
各存储解决方案的安装及优缺点
*注:本节不含 Azure hostpath 的安装介绍。
Azure 原生 Storage Class
本文将把 Azure 原生 Storage Class 作为所有测试的基线。Azure 会动态创建托管磁盘并将其映射到 VM 中,其中 Kubernetes 为 Pod 的 volume。
如果只是为了使用它,你没有必要再做其他事情。当你配置新的 AKS 集群时,它会自动预定义为“default”和“managed-premium”两种存储类。Premium 类将使用基于 SSD 的高性能和低延迟磁盘。
$ kubectl get storageclasses
NAME PROVISIONER AGE
default (default) kubernetes.io/azure-disk 8m
managed-premium kubernetes.io/azure-disk 8m
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
dbench-pv-claim Bound pvc-e7bd34a4-1dbd-11e9-8726-ae508476e8ad 1000Gi RWO managed-premium 10s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
dbench-w7nqf 0/1 ContainerCreating 0 29s
优点:
AKS 上的默认值无需执行任何操作。
弊端:
故障转移方案非常慢:有时需要将近 10 分钟的时间才能将 volume 重新连接到不同节点上的 Pod。
2.Ceph Rook
Ceph Rook 需要设计特定的硬件配置,根据数据类型生成 pg 组,配置日志 SSD 分区(在 bluestore 之前)并定义 crush 映射。它是一种处理整个存储集群安装的简洁方法。
在 AKS 上安装 Ceph Rook :
使用 Ceph Rook 快速入门指南[1];
配置特定于 AKS 的 FLEXVOLUME_DIR_PATH,因为它们使用 /etc/kubernetes/volumeplugins/ 而不是默认的 Ubuntu /usr/libexec。没有这个改变,pvc 将无法通过 kubelet 安装。
diff --git a/cluster/examples/kubernetes/ceph/operator.yaml b/cluster/examples/kubernetes/ceph/operator.yaml
index 73cde2e..33f45c8 100755--- a/cluster/examples/kubernetes/ceph/operator.yaml
+++ b/cluster/examples/kubernetes/ceph/operator.yaml
@@ -431,8 +431,8 @@ spec:
# - name: AGENT_MOUNT_SECURITY_MODE
# value: "Any"
# Set the path where the Rook agent can find the flex volumes
- # - name: FLEXVOLUME_DIR_PATH
- # value: ""+ - name: FLEXVOLUME_DIR_PATH
+ value: "/etc/kubernetes/volumeplugins"
# Set the path where kernel modules can be found
# - name: LIB_MODULES_DIR_PATH
# value: ""