Rancher⼊门到精通-2.0K8S六种存储解决⽅案的性能⽐较测
试
⼤多数开发⼈员都认为在部署集时选择合适的存储技术极为重要。但是,在 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/oper
ator.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: "<PathToFlexVolumes>"+ - name: FLEXVOLUME_DIR_PATH
+ value: "/etc/kubernetes/volumeplugins"
# Set the path where kernel modules can be found
# - name: LIB_MODULES_DIR_PATH
# value: "<PathToLibModules>"
指定想在 deviceFilter 中使⽤的设备(附加磁盘始终在 /dev/sdc 上);
diff --git a/cluster/examples/kubernetes/ceph/cluster.yaml b/cluster/examples/kubernetes/ceph/cluster.yaml
index 48cfeeb..0c91c48 100755--- a/cluster/examples/kubernetes/ceph/cluster.yaml
+++ b/cluster/examples/kubernetes/ceph/cluster.yaml
@@ -227,7 +227,7 @@ spec:
storage: # cluster level storage configuration and selection
useAllNodes: trueuseAllDevices: false- deviceFilter:
+ deviceFilter: "^sdc"location:
Config:
安装完成后,使⽤以下配置创建 Ceph 块池和存储类:
apiVersion: k.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 3---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: k.io/block
parameters:
blockPool: replicapool
clusterNamespace: rook-ceph
fstype: xfs
reclaimPolicy: Retain
通过以下部署 箱检查状态:
ceph status
cluster:
id: bee70a10-dce1-4725-9285-b9ec5d0c3a5e
health: HEALTH_OK
services:
mon: 3 daemons, quorum c,b,aubuntu使用入门教程
mgr: a(active)
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 3.0 TiB / 3.0 TiB avail
pgs:
[root@aks-agentpool-27654233-0 /]#
[root@aks-agentpool-27654233-0 /]#
[root@aks-agentpool-27654233-0 /]# ceph osd status
+----+--------------------------+-------+-------+--------+---------+--------+---------+-----------+
| id | host | used | avail | wr ops | wr data | rd ops | rd data | state |
+----+--------------------------+-------+-------+--------+---------+--------+---------+-----------+
| 0 | aks-agentpool-27654233-0 | 1025M | 1021G | 0 | 0 | 0 | 0 | exists,up |
| 1 | aks-agentpool-27654233-1 | 1025M | 1021G | 0 | 0 | 0 | 0 | exists,up |
| 2 | aks-agentpool-27654233-2 | 1025M | 1021G | 0 | 0 | 0 | 0 | exists,up |
+----+--------------------------+-------+-------+--------+---------+--------+---------+-----------+
优点:
它是⼀个可以在⼤型⽣产环境中运⾏的 Robust 存储;
Rook 使⽣命周期管理变得更加简单。
弊端:
复杂;它不太适合在公有云中运⾏,建议只在具有正确配置的 HW 集上运⾏ 。
3. GlusterFS Heketi
GlusterFS 是⼀个的开源存储解决⽅案。 Heketi 是 GlusterFS RESTful volume 的管理界⾯。它提供了⼀种便捷的⽅式让 GlusterFS 具
有动态配置的能⼒。如果没有这种访问权限,⽤户就必须⼿动创建 GlusterFS volume 并将其映射到 Kubernetes pv 上。
这⾥使⽤了 Heketi 快速⼊门指南 [2] 进⾏安装:
根据样本 1 创建了⼀个包含磁盘和主机名的拓扑⽂件;
Heketi 主要是在基于 RHEL 的操作系统上开发和测试的。在 AKS 上测试时,测试⼈员曾遇到了 Ubuntu 主机内核模块路径不正确的问题;
以下是修复该问题的 PR:
+++ b/deploy/kube-templates/glusterfs-daemonset.yaml
@@ -67,7 +67,7 @@ spec:
mountPath: "/etc/ssl"readOnly: true- name: kernel-modules
- mountPath: "/usr/lib/modules"+ mountPath: "/lib/modules"readOnly: truesecurityContext:
capabilities: {}
@@ -131,4 +131,4 @@ spec:
path: "/etc/ssl"- name: kernel-modules
hostPath:
- path: "/usr/lib/modules"+ path: "/lib/modules"
测试⼈员在 AKS 上遇到的另⼀个问题是没有空磁盘,于是他们使⽤ wipefs 清理 glusterfs 的磁盘(这个磁盘以前没有⽤于其他⽤
途);
wipefs -a /dev/sdc
/dev/sdc: 8 bytes were erased at offset 0x00000218 (LVM2_member): 4c 56 4d 32 20 30 30 31
运⾏ gk-deploy -g -t topology.json 命令,它在由 Heketi 控制器控制的每个节点上部署了 glusterfs pod。
root@aks-agentpool-20273348-0:~# kubectl get po -o wide
NAME READY STATUS RESTARTS IP NODE NOMINATED NODE
glusterfs-fgc8f 1/1 Running 0 10.0.1.35 aks-agentpool-20273348-1glusterfs-g8ht6 1/1 Running 0 10.0.1.4 aks-agentpool-20273348-0
同时,动态配置问题也会对测试造成⼀定影响。对于 Kubernetes 控制平⾯,Heketi restURL 是不可
⽤的。测试⼈员尝试利⽤ kube dns record、Pod IP 和 svc IP 来解决这个问题,但是都没有奏效。为此,他们最后选择通过 Heketi CLI ⼿动创建 volume。
root@aks-agentpool-20273348-0:~# export HEKETI_CLI_SERVER=10.0.1.69:8080root@aks-agentpool-20273348-0:~# heketi-cli volume create --si persistentvolume/glusterfs-efb3b155 created
root@aks-agentpool-20273348-0:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
glusterfs-efb3b155 10Gi RWX Retain Available 19s
将现有的 PV 映射到 dbench ⼯具的 PVC 上。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: glusterfs-efb3b155
spec:
accessModes:
- ReadWriteMany
storageClassName: ""resources:
requests:
storage: 10Gi
volumeName: glusterfs-efb3b155
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
glusterfs-efb3b155 Bound glusterfs-efb3b155 10Gi RWX 36m
以下是在 Kubernetes 上安装 Heketi Gluster 的更多内容:
gluster volume info vol_efb3b15529aa9aba889d7900f0ce9849
Volume Name: vol_efb3b15529aa9aba889d7900f0ce9849
Type: Replicate
Volume ID: 96fde36b-e389-4dbe-887b-baae32789436
Status: Started
Snapshot Count: 0Number of Bricks: 1 x 3 = 3Transport-type: tcp
Bricks:
Brick1: 10.0.1.66:/var/lib/heketi/mounts/vg_5413895eade683e1ca035760c1e0ffd0/brick_cd7c419bc4f4ff38bbc100c6d7b93605/brick Brick2: 10.0.1.35:/var/lib/heketi/mounts/vg_3277c6764dbce56b5a01426088901f6d/brick_6cbd74e9bed4758110c67cfe4d4edb53/brick
Brick3: 10.0.1.4:/var/lib/heketi/mounts/vg_29d6152eeafc57a707bef56f091afe44/brick_4856d63b721d794e7a4cbb4a6f048d96/brick Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
heketi ClusterIP 192.168.101.75 <none> 8080/TCP 5h
heketi-storage-endpoints ClusterIP 192.168.103.66 <none> 1/TCP 5h
root@aks-agentpool-20273348-0:~# kubectl get endpoints
NAME ENDPOINTS AGE
heketi 10.0.1.69:8080 5h
heketi-storage-endpoints 10.0.1.35:1,10.0.1.4:1,10.0.1.66:1 5h
kubernetes 172.31.22.152:443 1d
root@aks-agentpool-20273348-0:~# kubectl get endpoints heketi-storage-endpoints -o yaml
apiVersion: v1
kind: Endpoints
metadata:
creationTimestamp: 2019-01-29T15:14:28Z
name: heketi-storage-endpoints
namespace: defaultresourceVersion: "142212"
selfLink: /api/v1/namespaces/default/endpoints/heketi-storage-endpoints
uid: 91f802eb-23d8-11e9-bfcb-a23b1ec87092
subsets:
- addresses:
- ip: 10.0.1.35
- ip: 10.0.1.4
- ip: 10.0.1.66
ports:
- port: 1
protocol: TCP
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论