使用 Rook 构建生产可用存储环境实践_Spring_java_gg的博客-程序员秘密

技术标签: kubernetes  分布式存储  分布式  docker  xhtml  

Rook 是基于 Kubernetes 之上构建的存储服务框架。它支持 Ceph、NFS 等多种底层存储的创建和管理。帮助系统管理员自动化维护存储的整个生命周期。存储的整个生命周期包括部署、启动、配置、申请、扩展、升级、迁移、灾难恢复、监控和资源管理等,看着就让笔者觉得事情不少,Rook 的目标就是降低运维的难度,让 Kubernetes 和 Rook 来帮你托管解决这些任务。

Rook 管理 Ceph 集群

Ceph 分布式存储是 Rook 支持的第一个标记为 Stable 的编排存储引擎,在笔者验证 Rook 操作 Ceph 的过程中发现,其社区文档、脚本都放在一起,初次新手很难知道如何一步一步体验 Rook 搭建 Ceph 的过程。这从一个侧面反应了分布式存储的技术难度和兼容性是一个长期的迭代过程,Rook 的本意是为了降低部署管理 Ceph 集群的难度,但是事与愿违,初期使用的过程并不友好,有很多不知名的问题存在官方文档中。

在安装 Ceph 前要注意,目前最新的 Ceph 支持的存储后端 BlueStore 仅支持裸设备,不支持在本地文件系统之上建立存储块。因为 Rook 文档的混乱,一开始我们需要自己找到安装脚本目录,它在https://github.com/rook/rook/tree/master/cluster/examples/kubernetes/ceph

$ git clone https://github.com/rook/rook.git
$ cd rook
$ git checkout release-1.4
$ cd cluster/examples/kubernetes/ceph
$ kubectl create -f common.yaml
# 检查 namesapce 是否有 rook-ceph 了
$ kubectl get namespace
$ kubectl create -f operator.yaml
# 上述的步骤必须确定 pods 已经处于 running or complete 才能做下一个阶段,否则很有可能会 fail,上述的步骤需要等一会。
$ kubectl create -f cluster.yaml
# 等待 Ceph 集群创建成功。
$ kubectl -n rook-ceph get pods
# mgr 1, mon 3, 
# rook-ceph-crashcollector (有几个 node 就有几个)
# rook-ceph-osd (有几个 disk,就会有几个 pod,排序从 0 开始)

Ceph 的问题很多,经常需要使用工具箱查看一些情况,按照如下步骤部署:


$ kubectl create -f toolbox.yaml
$ kubectl -n rook-ceph get pods | grep ceph-tools
rook-ceph-tools-649c4dd574-gw8tx   1/1  Running  0   3m20s
$ kubectl -n rook-ceph exec -it rook-ceph-tools-649c4dd574-gw8tx bash
$ ceph -s
cluster:
    id:     9ca03dd5-05bc-467f-89a8-d3dfce3b9430
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum a,d,e (age 12m)
    mgr: a(active, since 8m)
    osd: 44 osds: 44 up (since 13m), 44 in (since 13m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   45 GiB used, 19 TiB / 19 TiB avail
    pgs:     1 active+clean

# ceph 集群可以使用的容量
$ ceph df
# ceph osd 与 node 的关系分布
$ ceph osd tree
# 删除 ceph toolbox 工具
$ kubectl delete -f toolbox.yaml

使用 Dashboard 查看 Ceph 运行情况:


$ vim dashboard-external-https.yaml
apiVersion: v1
kind: Service
metadata:
  name: rook-ceph-mgr-dashboard-external-https
  namespace: rook-ceph
  labels:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
spec:
  ports:
  - name: dashboard
    port: 8443
    protocol: TCP
    targetPort: 8443
  selector:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
  sessionAffinity: None
  type: NodePort
$ kubectl create -f dashboard-external-https.yaml
$ kubectl -n rook-ceph get service
rook-ceph-mgr-dashboard-external-https   NodePort    10.107.117.151   <none>        8443:31955/TCP      8m23s

访问地址是 31955,https://master_ip:31955 就可以访问。账号是 admin,密码可以在线查到:

$ kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

清空 Ceph:

$ cd /rook/cluster/examples/kubernetes/ceph
$ kubectl -n rook-ceph delete cephcluster rook-ceph
$ kubectl -n rook-ceph get cephcluster
# 确认 rook-ceph 被删除
$ kubectl delete -f operator.yaml
# 删除集群
$ kubectl delete -f common.yaml
$ kubectl delete -f cluster.yaml

用 Rook 管理 NFS 文件系统

NFS 文件系统目前在国内企业还是很常见的一种存储方案。用 Rook 来管理 NFS 文件系统可以极大的方便开发者的存储环境。安装 rook 之前需要先安装 NFS Client 安装包。在 CentOS 节点上安装 nf-utils,在 Ubuntu 节点上安装 nf-common。然后就可以安装 Rook 了。步骤如下:

git clone --single-branch --branch v1.4.6 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/nfs
kubectl create -f common.yaml
kubectl create -f provisioner.yaml
kubectl create -f operator.yaml



#查看运行情况
[[email protected] ~]# kubectl -n rook-nfs-system get pod
NAME                                   READY   STATUS    RESTARTS   AGE
rook-nfs-operator-59fb455d77-2cxn4     1/1     Running   0          75m
rook-nfs-provisioner-b4bbf4cc4-qrzqd   1/1     Running   1          75m

创建权限,rbac.yaml 内容如下:

---
apiVersion: v1
kind: Namespace
metadata:
  name:  rook-nfs
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: rook-nfs-server
  namespace: rook-nfs
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rook-nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get"]
  - apiGroups: ["policy"]
    resources: ["podsecuritypolicies"]
    resourceNames: ["rook-nfs-policy"]
    verbs: ["use"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
  - apiGroups:
    - nfs.rook.io
    resources:
    - "*"
    verbs:
    - "*"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rook-nfs-provisioner-runner
subjects:
  - kind: ServiceAccount
    name: rook-nfs-server
     # replace with namespace where provisioner is deployed
    namespace: rook-nfs
roleRef:
  kind: ClusterRole
  name: rook-nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

执行 yaml 创建权限:

kubectl create -f rbac.yaml

当前主流的做法是采用动态申请资源的方式创建 NFSServer,步骤如下:

kubectl create -f nfs.yaml

# sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  labels:
    app: rook-nfs
  name: rook-nfs-share1
parameters:
  exportName: share1
  nfsServerName: rook-nfs
  nfsServerNamespace: rook-nfs
provisioner: rook.io/nfs-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate

kubectl create -f sc.yaml 将创建 StorageClass,然后就可以申请资源:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rook-nfs-pv-claim
spec:
  storageClassName: "rook-nfs-share1"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

kubectl create -f pvc.yaml 将创建一份文件卷。校验结果:


[[email protected] nfs]# kubectl get pvc
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
rook-nfs-pv-claim   Bound    pvc-504eb26d-1b6f-4ad8-9318-75e637ab50c7   1Mi        RWX            rook-nfs-share1   7m5s

测试使用的案例:

> kubectl create -f busybox-rc.yaml
> kubectl create -f web-rc.yaml

> kubectl get pod -l app=nfs-demo

> kubectl create -f web-service.yaml

> echo; kubectl exec $(kubectl get pod -l app=nfs-demo,role=busybox -o jsonpath='{.items[0].metadata.name}') -- wget -qO- http://$(kubectl get services nfs-web -o jsonpath='{.spec.clusterIP}'); echo

Thu Oct 22 19:28:55 UTC 2015
nfs-busybox-w3s4t

当你发现 NFS Server 没有运行起来,可以用这一行命令查看问题:

kubectl -n rook-nfs-system logs -l app=rook-nfs-operator

总结

Rook 项目从笔者入手来,其目标定位还是很准,并且真实的解决了简化 Ceph 安装配置的痛点,并且依据 Ceph 使用的经验开始注入更多的存储驱动,如 NFS 存储驱动。使用起来并不复杂,但是它的文档实在是太糟糕了。社区中也没有人来专门维护这套文档,导致文章中很多描述都是过期的,你根本不清楚如何配置。一不小心就会配置错误。所以大家在使用过程中,还是要仔细熟悉一遍 yaml 文档的内容,了解到它的功能后在安装,就会事半功倍。这种不完善其实对开源技术爱好者来说,也是一种机会,让你通过修改文档的方式参与到 Rook 这个项目中。以我梳理一遍之后,通过最新版本的安装步骤,你可以几分钟就可以部署自己的分布式存储环境,Rook 确实事半功倍,值得推荐并大量实践使用。

参考资料

https://draveness.me/papers-ceph/ 

https://rook.io/docs/rook/v1.4/nfs.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012516914/article/details/119306995

智能推荐

Git使用心得_HelloWorldQAQ。的博客-程序员秘密

Github使用记录最近对github的一些使用心得清除git工程的git信息rm -rf .git本地创建git项目并push到远程echo "# Readme" &gt;&gt; README.mdgit initgit add README.mdgit commit -m "first commit"git remote add origin gi[email protected]:addressgit push -u origin masterpush一个已经存在的库git rem

Python通过cmd安装第三方库_python cmd加载裤_wind_听雨的博客-程序员秘密

Python通过cmd安装第三方库1.直接安装命令:pip inatall 库名(对于同时安装python2和python3环境的系统,建议采用pip3命令&lt;在pip后面加个"3"就可以了&gt;专门为python3版本安装第三方库。)2.利用国内镜像安装命令: pip install -i 镜像站网址 库名国内常用镜像站网址:1&gt; 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/2&gt; 阿里云:http://mirrors.aliy

一个php的二级联动,无刷新,从数据库中调入类别_php无刷下拉数据表_wztgq的博客-程序员秘密

在WEB项目中多维下拉菜单的实现技巧和方法  作者:tttk 来源:CSDN 点击次数:11382 2003-6-12 8:44:36 〓简介〓【摘要】对于web项目中下拉菜单的设计,尤其涉及到复杂的多维菜单,许多web开发的入门者往往不知所措,网络中关于此类问题的讨论也是屡见不鲜。文章旨在通过一个实例的分析,帮助初学者掌握web项目中多维动态下拉菜单的实现原理和方法,帮助入门者熟悉javascr

ROS1云课→28机器人代价地图配置-程序员秘密

在我们的示例中,如果机器人检测到一个距离小于2.5m的障碍物,就会将这个障碍物引入到代价地图中。后者则用于在机器人运动过程中,实时清除代价地图中的障碍物,并更新可移动的自由空间数据。在上面还会配置主题的名称,这是不能被遗漏的,如果不进行配置,那么导航功能包集会使用默认的主题以保证程序能够正常运行,那么一旦机器人移动起来,很可能就会撞到墙上或者障碍物上。它们也有最基本的通用参数,这些参数会保存在共享的文件中。在前面做的所有工作都成了现在项目的铺垫,而最大的乐趣也即将开始,这是赋予机器人生命的时刻。

Lua 正则表达式 匹配_lua中已什么开头匹配_shuizhizhiyin的博客-程序员秘密

. 任意字符%s 空白符%p 标点字符%c 控制字符%d 数字%x 十六进制数字%z 代表0的字符%a 字母%l 小写字母%u 大写字母%w 字母和数字上面字符类的大写形式表示小写所代表的集合的补集。例如,'%A'非字母的字符:模式修饰符+ 匹配前一字符1次或多次* 匹配前一字符0次或多次;最长匹配  -- 先尽可能长地把本次匹配模式走完

使用信号进行同步 sem_post_weixin_30443747的博客-程序员秘密

使用信号进行同步信号是 E. W. Dijkstra 在二十世纪六十年代末设计的一种编程架构。Dijkstra 的模型与铁路操作有关:假设某段铁路是单线的,因此一次只允许一列火车通过。信号将用于同步通过该轨道的火车。火车在进入单一轨道之前必须等待信号灯变为允许通行的状态。火车进入轨道后,会改变信号状态,防止其他火车进入该轨道。火车离开这段轨道时,必须再次更改信号的状态,以便允许其他火车...

随便推点

梦到曦和二字与公司起名_梦见曦字_柳鲲鹏的博客-程序员秘密

  梦里记得清楚,醒来时专门查了一下字典,说是中国古代的太阳神。  后来有一次说要成立一个新的公司名,吾就说,咱是文化人,起名要有点讲究。当时吾就想了两个:  正行。这个以前在南京佛教协会门口看到的对联,“爱国爱教,正信正行”。  曦和。做梦梦到过。  后来一问,其实人家早就定了。名字大约是生意兴旺发达之间。这不是说不好,只是作为文化人起这样的名,难免就……...

zabbix4.4.3使用postgresql数据库_postgres zabbix_海棠果果的博客-程序员秘密

之前在centos7安装部署了zabbix4.4.3,使用的是mysql数据库,这里记录的是在尝试使用postgresql数据库的过程中遇到的一些问题,希望对大家有所帮助。

Sub-process /usr/bin/dpkg returned an error code (1) 的解决办法_weixin_34092455的博客-程序员秘密

安装 auctex error Sub-process /usr/bin /dpkg returned an error code (1) 的解决办法cd /var/lib/dpkgsudo mv info{,.bak}sudo mkdir infosudo dpkg --configure -asudo apt-get install -f 转载于:https:/...

H264编码常用参数整理_qp range_Aero Auto的博客-程序员秘密

1.Profileprofile是代表编码器能力的,一般有BP、MP、HP。越高级的profile性能需求越强。typedef enum VENC_H264PROFILETYPE { VENC_H264ProfileBaseline = 66, /**&amp;amp;lt; Baseline profile */ VENC_H264ProfileMain = 77...

Day04---前端框架:Bootstrap_下列说法正确的是a.栅格类属性向上不兼容。b.栅格类属性向下兼容。c.一行中如_ElegantCodingWH的博客-程序员秘密

一、今日内容1. Bootstrap学习 1. Bootstrap概述 2. 响应式布局(栅格系统) 3. Bootstrap的全局CSS样式和JS插件2. 案例二、Bootstrap学习1. Bootstrap概述1. 概念:一个前端开发的框架。来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使...

推荐文章

热门文章

相关标签