Curve 分布式存储在 KubeSphere 中的实践
Curve 介绍
Curve 是网易开发的现代存储系统,目前支持文件存储 (CurveFS) 和块存储 (CurveBS)。现在它作为一个沙盒项目托管在 CNCF。
Curve 是一个高性能、轻量级操作、本地云的开源分布式存储系统。Curve 可以应用于 :
- 主流云本地基础设施平台 OpenStack 和 Kubernetes;
- 云本地数据库的高性能存储 ;
- 使用与 s3 兼容的对象存储作为数据存储的云存储中间件。

实现效果
通过部署 CurveFS 集群、Helm 部署 Curve-csi 插件创建 SC 来达到声明 PVC 时自动创建 PV 的效果
开始部署
K8s 环境可以通过安装 KubeSphere 进行部署 , 我使用的是高可用方案。
在公有云上安装 KubeSphere 参考文档:多节点安装
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 79d v1.23.8
k8s-node1 Ready worker 79d v1.23.8
k8s-node2 Ready worker 79d v1.23.8
k8s-node3 Ready worker 79d v1.23.8

使用 Curveadm 工具部署 CurveFS
CurveAdm 是 Curve 团队为提高系统易用性而设计的工具,其主要用于快速部署和运维 CurveBS/CurveFS 集群。
硬件环境需求:
| 宿主机 | 系统 | IP 地址 |
|---|---|---|
| Curve(控制节点) | Centos7.9 | 192.168.149.169 |
| Curve1(服务节点) | Centos7.9 | 192.168.149.177 |
每台服务器都需要安装 docker:
[root@curve ~]# yum install -y yum-utils
[root@curve ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@curve ~]# yum install docker-ce docker-ce-cli containerd.io
[root@curve ~]# systemctl start docker
控制节点安装 Curveadm:
[root@curve ~]# bash -c "$(curl -fsSL https://curveadm.nos-eastchina1.126.net/script/install.sh)"
主机管理
主机模块用来统一管理用户主机,以减少用户在各配置文件中重复填写主机 SSH 连接相关配置。(此操作在控制节点进行)
准备主机列表:
global:
user: root
ssh_port: 22
private_key_file: /root/.ssh/id_rsa
hosts:
- host: curve1
hostname: 192.168.149.169
- host: curve
hostname: 192.168.149.177
forward_agent: true
become_user: root
labels:
- client
说明:

创建 SSH 秘钥:
[root@curve ~]# ssh-keygen #一路回车即可
[root@curve ~]# ssh-copy-id -i root@192.168.149.177
#发送私钥到服务节点
导入主机列表:
[root@curve ~]#curveadm hosts commit hosts.yaml
查看主机列表:
[root@curve ~]# curveadm hosts ls

CuveFS 集群拓扑
集群拓扑文件用来描述哪些服务部署在哪些机器上,以及每一个服务实例的配置。
(目前集群拓扑分为单机部署、多机部署本教程只演示单机部署)
准备单机部署文件:
说明:此文件只需要修改一处,target 的值改成服务节点的 hostname,其他全默认不需要修改。
kind: curvefs
global:
report_usage: true
data_dir: ${home}/curvefs/data/${service_role}${service_host_sequence}
log_dir: ${home}/curvefs/logs/${service_role}${service_host_sequence}
container_image: opencurvedocker/curvefs:latest
variable:
home: /tmp
target: curve1 #这里需要改成服务节点的hostname
etcd_services:
config:
listen.ip: ${service_host}
listen.port: 2380${service_host_sequence} # 23800,23801,23802
listen.client_port: 2379${service_host_sequence} # 23790,23791,23792
deploy:
- host: ${target}
- host: ${target}
- host: ${target}
mds_services:
config:
listen.ip: ${service_host}
listen.port: 670${service_host_sequence} # 6700,6701,6702
listen.dummy_port: 770${service_host_sequence} # 7700,7701,7702
deploy:
- host: ${target}
- host: ${target}
- host: ${target}
metaserver_services:
config:
listen.ip: ${service_host}
listen.port: 680${service_host_sequence} # 6800,6801,6802
listen.external_port: 780${service_host_sequence} # 7800,7801,7802
global.enable_external_server: true
metaserver.loglevel: 0
# whether commit filesystem caches of raft wal to disk.
# it should be true iff you wants data NEVER lost,
# of course, it will leads some performance skew.
braft.raft_sync: false
deploy:
- host: ${target}
- host: ${target}
- host: ${target}
config:
metaserver.loglevel: 0
部署预检
预检模块用来提前检测那些可能导致用户部署失败的因素,以提高用户部署的成功率。
添加自定义命名集群,并指定拓扑文件:
[root@curve ~]# curveadm cluster add curve -f topology.yaml
切换 curve 集群为当前管理集群:
[root@curve ~]# curveadm cluster checkout curve
执行预检:
[root@curve ~]# curveadm precheck
查看执行结果:

使用 CurveAdm 部署 CurveFS 集群
[root@curve ~]# curveadm deploy
如果部署成功,将会输出类似 Cluster 'curve' successfully deployed ^_^. 的字样
查看集群运行情况:
[root@curve ~]#curveadm status
[root@localhost curve]# curveadm status
Get Service Status: [OK]
cluster name : curve
cluster kind : curvefs
cluster mds addr : 192.168.149.177:6700,192.168.149.177:6701,192.168.149.177:6702
cluster mds leader: 192.168.149.177:6701 / f339fd5e7f3e
Id Role Host Replicas Container Id Status
-- ---- ---- -------- ------------ ------
724fe98710d0 etcd curve1 1/1 e3d86591f2dc Up 50 seconds
d5b08fe05a81 etcd curve1 1/1 da7932929055 Up 50 seconds
963664e175dd etcd curve1 1/1 134d4445542a Up 50 seconds
83fa9fc656af mds curve1 1/1 1f7429cd9822 Up 48 seconds
f339fd5e7f3e mds curve1 1/1 2983a89adecf Up 49 seconds
3d7201165a57 mds curve1 1/1 b6135408346b Up 49 seconds
875d7fd126f2 metaserver curve1 1/1 1983afeed590 Up 44 seconds
9d5fb31b2bd9 metaserver curve1 1/1 fe920d6b7343 Up 44 seconds
1344d99579c4 metaserver curve1 1/1 875cb4e5c14d Up 44 seconds
[root@localhost curve]# curveadm status
Get Service Status: [OK]
cluster name : curve
cluster kind : curvefs
cluster mds addr : 192.168.149.177:6700,192.168.149.177:6701,192.168.149.177:6702
cluster mds leader: 192.168.149.177:6701 / f339fd5e7f3e
Id Role Host Replicas Container Id Status
-- ---- ---- -------- ------------ ------
724fe98710d0 etcd curve1 1/1 e3d86591f2dc Up 2 hours
d5b08fe05a81 etcd curve1 1/1 da7932929055 Up 2 hours
963664e175dd etcd curve1 1/1 134d4445542a Up 2 hours
83fa9fc656af mds curve1 1/1 1f7429cd9822 Up 2 hours
f339fd5e7f3e mds curve1 1/1 2983a89adecf Up 2 hours
3d7201165a57 mds curve1 1/1 b6135408346b Up 2 hours
875d7fd126f2 metaserver curve1 1/1 1983afeed590 Up 2 hours
9d5fb31b2bd9 metaserver curve1 1/1 fe920d6b7343 Up 2 hours
1344d99579c4 metaserver curve1 1/1 875cb4e5c14d Up 2 hours
KubeSphere 平台部署 minio
添加 minio 应用仓库

添加仓库地址:charts.min.io/。

从应用模板创建 minio 服务
<
,
,
,
,
>
自定义 root 账号和密码:


访问 minio 界面并设置:
说明:登录的 URL 是集群宿主机的 IP+NodePort 端口,可以在 service 中查看对应端口号


点击新建 Bucket:

自定义 Bucket 名称:

创建 Policies:

自定义 Policy Name:

创建规则:
说明 : 此规则是全局 Bucket 都可以访问,生产环境不建议这么配置
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListAllMyBuckets",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
创建 Users:

创建 AKSK:


自定义账号名称并勾选刚才设置好的规则(也可以全选):

创建 Group:


KubeSphere 平台部署 Cruvefs-csi 插件
创建应用:

选择应用商店:

选择 Curvefs-csi 应用进行安装:



填写 parameters 信息。字段说明 :
- mdsAddr 地址可以通过 Curveadm status 输出后查看
- s3Endpoint 可以通过 K8s 集群的 service 里查看到(要填写 minio 服务对应的 NodePort,不要填写 console 的 Nodeport)
- AKSK 可以通过刚才 minio 上创建时保存的查看
- s3Bucket 可以通过刚才创建的 Bucket 查看

通过 Curve-sc 创建 PV 和 PVC 进行挂载
创建持久卷声明:




创建工作负载使用存储卷:






进入容器终端:

切换目录到 /data 并写入测试数据:
cd /data
mkdir curve
echo 1111 > curve.txt
验证查看 minio 数据:

本文由博客一文多发平台 OpenWrite 发布!
Curve 分布式存储在 KubeSphere 中的实践的更多相关文章
- ceph在品高云中的实践
ceph简介 ceph是业界目前人气最高的开源存储项目之一,关于其定义在官网是这样的:"Ceph is a unified, distributed storage system desig ...
- KubeSphere 日志备份与恢复实践
为什么需要日志备份 KubeSphere 日志系统使用 Fluent Bit + ElasticSearch 的日志采集存储方案,并通过 Curator 实现对 Index 的生命周期管理,定期清理久 ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- 05-雷海林-mysql备份原理与在TDSQL中的实践
05-雷海林-mysql备份原理与在TDSQL中的实践 下载地址: http://files.cnblogs.com/files/MYSQLZOUQI/05-%E9%9B%B7%E6%B5%B7%E6 ...
- 一致性Hash算法在数据库分表中的实践
最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...
- 华为云对Kubernetes在Serverless Container产品落地中的实践经验
华为云容器实例服务,它基于 Kubernetes 打造,对最终用户直接提供 K8S 的 API.正如前面所说,它最大的优点是用户可以围绕 K8S 直接定义运行应用. 这里值得一提是,我们采用了全物理机 ...
- React 与 Redux 在生产环境中的实践总结
React 与 Redux 在生产环境中的实践总结 前段时间使用 React 与 Redux 重构了我们360netlab 的 开放数据平台.现将其中一些技术实践经验总结如下: Universal 渲 ...
- immutable.js 在React、Redux中的实践以及常用API简介
immutable.js 在React.Redux中的实践以及常用API简介 学习下 这个immutable Data 是什么鬼,有什么优点,好处等等 mark : https://yq.aliyu ...
- Immutable.js 以及在 react+redux 项目中的实践
来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...
- TypeScript在react项目中的实践
前段时间有写过一个TypeScript在node项目中的实践. 在里边有解释了为什么要使用TS,以及在Node中的一个项目结构是怎样的. 但是那仅仅是一个纯接口项目,碰巧赶上近期的另一个项目重构也由我 ...
随机推荐
- 关于“内网穿透”的一些知识(续3)—— NAT类型判断
前文: 关于"内网穿透"的一些知识(续2)-- 端口预测 ------------------------------------------- 本文是对前面几篇文章的补充.这里要 ...
- ubuntu 配置NTP时间服务器&&定时同步本地时间
Ubuntu系统: NTP时间服务器的安装: 服务器安装命令: sudo apt-get install ntp NTP服务配置,设置为本地时间服务器,屏蔽默认server,服务器层级设为10: vi ...
- baselines算法库common/wrapper.py模块分析
common/wrapper.py模块: import gym class TimeLimit(gym.Wrapper): def __init__(self, env, max_episode_st ...
- 实验室服务彻底死机记录——硬件故障——主板pcie槽坏掉或显卡坏掉
2022年11月8日 后记(最新更新) 服务器送售后,售后给厂家技术打电话,厂家技术说可能是显卡的电源线松了,于是我们打开机箱把显卡的电源线紧了紧,然后神奇的事情发生了,故障解除了...... 一 ...
- Long Way to be Non-decreasing 题解
前言 题目链接:洛谷:CF. 题意简述 yzh 喜欢单调不降序列. 她有一个序列 \(a\),最初为 \(a_1, \ldots, a_n\),其中每个元素都在 \([1, m]\) 内. 她希望使序 ...
- 用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践
用户案例 | 自如 随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求.同时,众多非专业开发人员也需要一种更为"亲民"的调度平台使用体验. ...
- Java 代码本地设置Hadoop用户名密码
在Hadoop环境中,通常使用Kerberos进行身份验证.但在一些开发或测试环境中,我们可能需要在本地代码中设置用户名和密码来模拟或进行简单的测试.虽然这不是一个安全的做法,因为它违背了Kerber ...
- OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!
自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...
- QGroupBox自定义样式(仿DotNetBar)
QSS如下: QGroupBox { border:1px solid gray; border-radius:5px; margin-top:3ex; font-size:10pt; color:# ...
- 使用Packer构建镜像
什么是Packer Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像.Docker 镜像等. Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜 ...