OpenEBS Container Attached Storage

本文图片来源Openebs 前言 关于 OpenEBS OpenEBS是一个运行在Kubernets上的开源存储项目,符合CAS(Container Attached Storage)架构, 它的所有组件全部运行在用户层,属于在k8s上云原生的分布式文件系统。 OpenEBS文件系统提供如下类别的特性,每个特性都可以用于某个特定环境下的解决方案。 cStor: 支持容错,高可用性,副本拷贝,支持快照,克隆等技术,其后端是由ZFS支持。 Jiva: 后端引擎为年轻的Longhorn,支持容错,副本拷贝,但没有cStor的快照和克隆技术。 Dynamic Local PV HostPath: 直接使用本地文件存储,优点是低延时,缺点是不支持高可用,一旦本地节点宕机或者本地磁盘损坏,则导致数据丢失, Dynamic Local PV Devices: 和HostPath类似,直接使用本地的硬盘进行存储,缺点也是无法支持高可用,但是低延迟。 Dynamic Local PV ZFS: 不支持高可用,但可以使用ZFS的功能(制作快照和克隆技术),从而提升数据的保护能力,便于从灾难中恢复数据。 特性(Features) CAS 架构: PV和PVC都是容器化的,便于kubernets进行管理。 同步副本: 当采用cStor Jiva Mayastor存储引擎时,实现多副本同步拷贝,从而提供数据的高可用冗错机制。 快照和克隆: 采用cStor存储引擎时,支持写时复制快照技术,生成快照有助于我们可以回滚数据,克隆可以快速的生成一套生产环境数据以便开发在测试环境使用真实的生产数据。 备份和恢复: 使用备份工具及插件,快速的备份文件和恢复文件。 监控: openebs 组件会提供Metric接口,从而方便prometheus对其监控,进而调优整套存储方案的性能。 Alpha特性 支持ARM64,这也是我目前在使用的原因,自己在组建一套7*24小时运行的Polkadot委托节点,因为直接和收益挂钩,所以我调研了很多容器化的存储架构方案,虽然Openebs性能不如其他的老牌分布式存储系统,像Ceph,glusterfs这样的,但是它提供的CAS架构和高容错机制,以及支持ARM64,就让我决定选择它用于金融行业的云存储架构方案。 架构 基于单一服务的PV架构 整个PV的底层读写操作全部在内核层面完成,Kubernets只是增加了一层抽象,将PV通过底层的分布式文件读写接口导出到用户层,Pods通过PVC与PV绑定进行数据的读写处理。 基于微服务的PV架构 典型的CAS架构,数据的读写操作全部在用户层处理,CAS架构中的副本拷贝以及存储控制器全部由kubernets自身来进行调度,PV直接从CAS控制器的底层资源中获取存储设备,Pods通过PVC与PV绑定,从而完成数据的读写处理。 None CAS 与 CAS 对比 CAS的优势: 更加敏捷,可以直接在Pods层面去优化存储控制器。 更加精细的监控,能够直接监控到每一个Volume的IOPS,读写延迟。 解耦合,不依赖于第三方的云存储系统,比如你可以不改变yaml文件的情况下,将应用从一个集群,迁移到另一个集群,如果采用None CAS,则会非常依赖对于Kubenets不可见的存储管理系统,迁移过程中需要修改yaml文件中关于PV的描述。 云原生,好处就在于能够直接与其他系统对接,比如文件系统监控,管理,采用Kube CRD的方式直接调用底层的存储系统。 微服务架构 采用微服务的方式极大的提高了分布式文件系统的高可用性,因为整个存储的服务全部运行在用户层,每一个服务都可以从一个节点迁移到另外一个节点,只要我们满足副本的可用性,即使某一个节点宕机也不会影像我们线上的数据访问,保证系统的可用。 从上图中,我们可以看出Storage Controller直接管理底层的副本处理的相关Pods,应用层的Pods通过PV与Storage Controller沟通。 ...

October 18, 2020

Raspberry Pi K3s NFS FS

NFS on Raspberry Pi 目前正学习如何在树莓派4集群上结合gromacs+mpich的分子动力学模拟,所以需要搭建一款分布式存储系统,又由于树莓派性能的限制,搭建OpenEBS会比较浪费计算资源,最后就采用轻量级的NFS来完成文件系统的共享和存储。 NFS on K3s aarch64 基础依赖 NFS Server: sudo apt install nfs-kernel-server 添加共享文件目录到/etc/exports: /mnt/data/nfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) # 外部使用 /mnt/data/kubedata 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) # k3s 使用 启动 NFS Server: sudo systemctl restart nfs-kernel-server NFS Client: sudo apt install nfs-common sudo mount 192.168.1.145:/mnt/data/nfs ./nfs 添加到/etc/fstab: 192.168.1.145:/mnt/data/nfs /home/chenfeng/nfs nfs auto,nofail,noatime,nolock 0 0 K3s NFS Volume 需要使用Kubernets提供的NFS Client Provisioner k3s是跑在Ubuntu 20.04 aarch64 系统上的,而官方提供的NFS Client Provisioner是基于ARM v7的,所以需要重新编译Provisioner。 以下的操作全部在Raspberry pi 4上完成的。 以下为PATH: diff -ur ./Makefile /tmp/nfs-client/Makefile --- ./Makefile 2020-06-28 07:47:43.883181030 +0000 +++ /tmp/nfs-client/Makefile 2020-06-28 10:06:00.588586966 +0000 @@ -28,17 +28,16 @@ container: build image build_arm image_arm build: - CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o docker/x86_64/nfs-client-provisioner ./cmd/nfs-client-provisioner + go build -a -ldflags '-extldflags "-static"' -o docker/x86_64/nfs-client-provisioner ./cmd/nfs-client-provisioner build_arm: - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -a -ldflags '-extldflags "-static"' -o docker/arm/nfs-client-provisioner ./cmd/nfs-client-provisioner + go build -a -ldflags '-extldflags "-static"' -o docker/arm/nfs-client-provisioner ./cmd/nfs-client-provisioner image: docker build -t $(MUTABLE_IMAGE) docker/x86_64 docker tag $(MUTABLE_IMAGE) $(IMAGE) image_arm: - docker run --rm --privileged multiarch/qemu-user-static:register --reset docker build -t $(MUTABLE_IMAGE_ARM) docker/arm docker tag $(MUTABLE_IMAGE_ARM) $(IMAGE_ARM) Only in /tmp/nfs-client/deploy: .deployment-arm.yaml.swp diff -ur ./deploy/deployment-arm.yaml /tmp/nfs-client/deploy/deployment-arm.yaml --- ./deploy/deployment-arm.yaml 2020-06-28 09:24:48.499572298 +0000 +++ /tmp/nfs-client/deploy/deployment-arm.yaml 2020-06-28 10:06:11.876117004 +0000 @@ -4,7 +4,8 @@ name: nfs-client-provisioner labels: app: nfs-client-provisioner - namespace: nfs + # replace with namespace where provisioner is deployed + namespace: default spec: replicas: 1 strategy: @@ -20,7 +21,7 @@ serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner - image: 192.168.1.114:5000/nfs-client-provisioner-arm + image: quay.io/external_storage/nfs-client-provisioner-arm:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes @@ -28,11 +29,11 @@ - name: PROVISIONER_NAME value: fuseim.pri/ifs - name: NFS_SERVER - value: 192.168.1.145 + value: 10.10.10.60 - name: NFS_PATH - value: /mnt/data/kubedata + value: /ifs/kubernetes volumes: - name: nfs-client-root nfs: - server: 192.168.1.145 - path: /mnt/data/kubedata + server: 10.10.10.60 + path: /ifs/kubernetes diff -ur ./deploy/test-pod.yaml /tmp/nfs-client/deploy/test-pod.yaml --- ./deploy/test-pod.yaml 2020-06-28 09:36:06.872994438 +0000 +++ /tmp/nfs-client/deploy/test-pod.yaml 2020-06-28 10:06:11.920115180 +0000 @@ -5,7 +5,7 @@ spec: containers: - name: test-pod - image: 192.168.1.114:5000/ubuntu:20.04 + image: gcr.io/google_containers/busybox:1.24 command: - "/bin/sh" args: diff -ur ./docker/arm/Dockerfile /tmp/nfs-client/docker/arm/Dockerfile --- ./docker/arm/Dockerfile 2020-06-28 07:47:43.759177680 +0000 +++ /tmp/nfs-client/docker/arm/Dockerfile 2020-06-28 10:06:00.628585293 +0000 @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM hypriot/rpi-alpine:3.6 -RUN apk update --no-cache && apk add ca-certificates +FROM ubuntu:20.04 COPY nfs-client-provisioner /nfs-client-provisioner ENTRYPOINT ["/nfs-client-provisioner"] nfs-client/cmd/nfs-client-provisioner为Provisioner源码目录。 ...

June 28, 2020

Create Gluste Filesystem Cluster

glusterfs 简介 glusterfs 一套分布式的网络文件系统, 因为要在kubernetes当作共享式永久存储文件系统使用,所以借此机会研究下该文件系统. 搭建过程 准备 准备三台服务器,可以互相访问 操作系统 Linux (ubuntu or centos) 安装 gluster server 快速安装过程详见 Quick Start Guide 具体安装的过程详见 Install Guide 由于我选择的操作系统是 Centos 7.x, 所以下面所有的操作过程全部在Centos上完成. 三台服务器分别为 Server1, Server2, Server3 分别在三台服务器上安装gluster server yum install centos-release-gluster && yum install glusterfs-server # install server yum install centos-release-gluster && yum install glusterfs-client # install client 在 Server1 上执行 gluster peer probe server2 gluster peer probe server3 分别在 Server2 Server3 上执行 gluster peer probe server1 显示添加节点状态 gluster peer status Server上分别会显示peers信息 ...

April 15, 2020