Kuberntes云原生实战六 使用Rook搭建Ceph集群

举报
JAVA日知录 发表于 2022/07/24 00:22:26 2022/07/24
【摘要】 大家好,我是飘渺。 今天咱们继续更新Kubernetes云原生实战系列,这是系列文章的第六篇,需要实现在Kuberetes中安装Ceph集群,系列文章,欢迎持续关注。 Rook介绍 Rook https://rook.io 是一个自管理的分布式存储编排系统,可以为Kubernetes提供便利的存储解决方案。Rook本身并不提...

大家好,我是飘渺。

今天咱们继续更新Kubernetes云原生实战系列,这是系列文章的第六篇,需要实现在Kuberetes中安装Ceph集群,系列文章,欢迎持续关注。

Rook介绍

Rook https://rook.io 是一个自管理的分布式存储编排系统,可以为Kubernetes提供便利的存储解决方案。

Rook本身并不提供存储,而是在kubernetes和存储系统之间提供适配层,简化存储系统的部署与维护工作。

目前,Rook支持的存储系统包括:Ceph、CockroachDB、Cassandra、EdgeFS、Minio、NFS。当然,Rook支持的最好的还是Ceph 和 NFS。

5379a93ff096c13b1aa3b1d0635e2a9a.png

为什么要使用Rook?

使用Rook的其中一个主要好处在于它是通过原生的Kubernetes机制和数据存储交互。这就意味着你不再需要通过命令行手动配置Ceph。

  • 你想要在一个集群里部署CephFS吗?只需要创建一个YAML文件就行了!

  • 什么?你还想要部署一个支持S3 API的对象存储?行,另外再建一个YAML文件就行!

Ceph介绍

Ceph 是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。Ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。

Ceph支持三种存储:

  • 块存储(RDB):可以直接作为磁盘挂载

  • 文件系统(CephFS):提供POSIX兼容的网络文件系统CephFS,专注于高性能、大容量存储

  • 对象存储(RADOSGW):提供RESTful接口,也提供多种编程语言绑定。兼容S3(是AWS里的对象存储)、Swift(是openstack里的对象存储)

核心组件

Ceph 主要有三个基本进程:

  • OSD
    用于集群中所有数据与对象的存储,处理集群数据的复制、恢复、回填、再均衡,并向其他osd守护进程发送心跳,然后向 Monitor 提供一些监控信息。

  • Monitor
    监控整个集群的状态,维护集群的 cluster MAP 二进制表,保证集群数据的一致性。

  • MDS (可选)
    为 Ceph 文件系统提供元数据计算、缓存与同步。MDS 进程并不是必须的进程,只有需要使用 CephFS 时,才需要配置 MDS 节点。

安装Ceph集群

通过rook安装ceph集群需要满足以下两个前提条件:

  • 已部署好的Kubernetes集群 (✅)

  • osd节点需要有未格式化⽂件系统的磁盘(✅)

前置准备

  1. 在master1节点下载rook到本地,使用最新版本1.8.8

git clone --single-branch --branch v1.8.8 https://github.com/rook/rook.git
  
  1. 给所有需要安装ceph的worker节点安装lvm2


   
  1. yum install lvm2 -y
  2. #检查是否安装成功
  3. [root@sit-k8s-worker1 ~]# yum list installed | grep lvm2
  4. lvm2.x86_64                        7:2.02.187-6.el7_9.5       @iflytekdc-updates
  5. lvm2-libs.x86_64                   7:2.02.187-6.el7_9.5       @iflytekdc-updates
  1. 给worker节点打上标签,保证ceph只安装在这3台worker节点上


   
  1. kubectl label node k8s-worker1 role=ceph-storage
  2. kubectl label node k8s-worker2 role=ceph-storage
  3. kubectl label node k8s-worker3 role=ceph-storage

修改完成后使用命令查看label属性


   
  1. [root@k8s-master1 ~]# kubectl get nodes --show-labels 
  2. NAME              STATUS   ROLES                  AGE     VERSION   LABELS
  3. k8s-worker1   Ready    worker                 3d17h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,role=ceph-storage
  4. k8s-worker2   Ready    worker                 3d17h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker2,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,role=ceph-storage
  5. k8s-worker3   Ready    worker                 3d17h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker3,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,role=ceph-storage
  1. 手动下载安装ceph所需镜像

rook 中ceph依赖很多都是使用国外的镜像,下载很慢,而且经常出现400,所以建议直接手动下载。注意,以下脚本在所有节点都需要运行(master 和 worker)

创建可执行文件 ceph.sh,内容如下


   
  1. image_list=(
  2.   csi-node-driver-registrar:v2.5.0
  3.   csi-attacher:v3.4.0
  4.   csi-snapshotter:v5.0.1
  5.   csi-resizer:v1.4.0
  6.   csi-provisioner:v3.1.0
  7. )
  8. aliyuncs="registry.aliyuncs.com/it00021hot"
  9. google_gcr="k8s.gcr.io/sig-storage"
  10. for image in ${image_list[*]}
  11. do
  12.   docker image pull ${aliyuncs}/${image}
  13.   docker image tag ${aliyuncs}/${image} ${google_gcr}/${image}
  14.   docker image rm ${aliyuncs}/${image}
  15.   echo "${aliyuncs}/${image} ${google_gcr}/${image} downloaded."
  16. done

同时给其授予可执行权限

chmod +x ceph.sh
  

检查镜像是否下载完成


   
  1. [root@k8s-worker1 ~]# docker images | grep csi
  2. k8s.gcr.io/sig-storage/csi-node-driver-registrar                   v2.5.0    cb03930a2bd4   4 months ago    19.6MB
  3. k8s.gcr.io/sig-storage/csi-resizer                                 v1.4.0    551fd931edd5   4 months ago    55.5MB
  4. k8s.gcr.io/sig-storage/csi-snapshotter                             v5.0.1    53ae5b88a338   4 months ago    55.2MB
  5. k8s.gcr.io/sig-storage/csi-provisioner                             v3.1.0    c3dfb4b04796   4 months ago    57.7MB
  6. k8s.gcr.io/sig-storage/csi-attacher                                v3.4.0    03e115718d25   5 months ago    54.8MB
  1. 修改ceph调度算法,通过节点亲和性让其运行在指定节点上,同时手动指定节点及磁盘

还记得我们之前挂载磁盘的时候给ceph预留了一个空盘吧?现在需要用到了~

先通过lsblk查看盘符,可以看到vdb2是预留给ceph的


   
  1. [root@k8s-worker2 ~]# lsblk
  2. NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
  3. sr0     11:0    1  478K  0 rom  
  4. vda    253:0    0   50G  0 disk 
  5. ├─vda1 253:1    0    1G  0 part /boot
  6. └─vda2 253:2    0   49G  0 part /
  7. vdb    253:16   0  500G  0 disk 
  8. ├─vdb1 253:17   0  100G  0 part /var/lib/docker
  9. └─vdb2 253:18   0  400G  0 part

然后修改ceph集群配置

vim /root/rook/deploy/examples/cluster.yaml
  

   
  1. #原始位置大概在138行 
  2. # 第一处修改节点亲和性 ,设置为安装ceph的机器节点的标签(本文档worker节点标签role=ceph-storage)
  3. placement:
  4.     all:
  5.       nodeAffinity:
  6.         requiredDuringSchedulingIgnoredDuringExecution:
  7.           nodeSelectorTerms:
  8.           - matchExpressions:
  9.             - key: role
  10.               operator: In
  11.               values:
  12.               - ceph-storage
  13. #原始位置大概在215行起,
  14. # Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named
  15.  # nodes below will be used as storage resources.  Each node's 'name' field should match their 'kubernetes.io/hostname' label.
  16. #  第二处修改
  17.   storage: # cluster level storage configuration and selection
  18.     useAllNodes: false
  19.     useAllDevices: false
  20.     config:
  21.       journalSizeMB: "4096"
  22.     nodes:
  23.     - name: "k8s-worker1"
  24.       devices:
  25.         - name: "vdb2" # 可以通过lsblk查看磁盘信息
  26.           config:
  27.             storeType: bluestore
  28.     - name: "k8s-worker2"
  29.       devices: 
  30.         - name: "vdb2" # 可以通过lsblk查看磁盘信息
  31.           config:
  32.             storeType: bluestore
  33.     - name: "k8s-worker3"
  34.       devices: 
  35.         - name: "vdb2" # 可以通过lsblk查看磁盘信息
  36.           config:
  37.             storeType: bluestore

注意,name 不能够配置为IP,而应该是标签 kubernetes.io/hostname 的内容

  1. 修改operator.yaml,让CSI守护进程可以调度到主节点

默认情况下master节点是不允许调度的,但是ceph有些守护进程是需要调度到master去。这一步是为了解决后面出现的问题,如果此时不修改也可以在后面出现问题的时候再改。这些都是经验教训,网上的安装手册不会告诉你有这一步。

先查看一下master节点的污点设置


   
  1. [root@k8s-master1 ~]# kubectl describe no/sit-k8s-master1 | grep Taints
  2. Taints:             node-role.kubernetes.io/master:NoSchedule

然后修改rook operator的配置

vim /root/rook/deploy/examples/operator.yaml
  

   
  1. #原始位置在127行 原有注释去掉后,再往前缩进一格否则报错
  2. CSI_PLUGIN_TOLERATIONS: |
  3.   - effect: NoSchedule
  4.     key: node-role.kubernetes.io/master
  5.     operator: Exists

安装ceph集群

ceph 相关镜像较大,创建集群过程中可能会存在镜像拉取失败问题,可以在worker节点提前下载。所需镜像:rook/ceph:v1.8.8 quay.io/ceph/ceph: v16.2.7 quay.io/cephcsi/cephcsi:v3.5.1

  1. 创建ceph所需要的资源


   
  1. cd /root/rook/deploy/examples
  2. kubectl apply -f crds.yaml -f common.yaml -f operator.yaml

执行完成后等待容器启动,只有完全启动后才能执行进行下一步操作。


   
  1. [root@k8s-master1 examples]# kubectl -n rook-ceph get pod -o wide
  2. NAME                                  READY   STATUS    RESTARTS   AGE   IP              NODE              NOMINATED NODE   READINESS GATES
  3. rook-ceph-operator-84985d69d4-z5bkq   1/1     Running   0          18m   109.233.110.2   dev-k8s-worker3   <none>           <none>
  4. #此处注意是否启动成功,如果没有启动成功使用 kubectl describe pod rook-ceph-operator-84985d69d4-z5bkq -n -n rook-ceph 检查
  1. 安装ceph集群

需要先修改一下集群osd的资源限制,否则osd的内存使用率会无限增长(同样是经验教训)


   
  1. cd /root/rook/deploy/examples
  2. vim cluster.yaml

在186行处加入资源限制,建议内存设置4G以上,同时需要注意yaml文件的格式。


   
  1. resources:
  2.     osd:
  3.       limits:
  4.         cpu: "2"
  5.         memory: "8000Mi"
  6.       requests:
  7.           cpu: "2"
  8.           memory: "8000Mi"

修改保存后执行以下命令安装ceph集群

kubectl apply -f cluster.yaml
  

创建完成后,可以查看pod的状态:


   
  1. [root@k8s-master1 examples]# kubectl -n rook-ceph get pod
  2. NAME                                                        READY   STATUS      RESTARTS   AGE
  3. csi-cephfsplugin-gjmhv                                      3/3     Running     0          8m7s
  4. csi-cephfsplugin-l2vz6                                      3/3     Running     0          8m7s
  5. csi-cephfsplugin-provisioner-6f54f6c477-rnql9               6/6     Running     0          8m7s
  6. csi-cephfsplugin-provisioner-6f54f6c477-vgvnj               6/6     Running     0          8m7s
  7. csi-cephfsplugin-zplbg                                      3/3     Running     0          8m7s
  8. csi-rbdplugin-54cgx                                         3/3     Running     0          8m7s
  9. csi-rbdplugin-7795w                                         3/3     Running     0          8m7s
  10. csi-rbdplugin-dtnqk                                         3/3     Running     0          8m7s
  11. csi-rbdplugin-provisioner-6d765b47d5-g2lzc                  6/6     Running     0          8m7s
  12. csi-rbdplugin-provisioner-6d765b47d5-klk9n                  6/6     Running     0          8m7s
  13. rook-ceph-crashcollector-k8s-worker1-7598585c9b-49czg   1/1     Running     0          5m23s
  14. rook-ceph-crashcollector-k8s-worker2-675d7c66f-lzw4n    1/1     Running     0          5m11s
  15. rook-ceph-crashcollector-k8s-worker3-656f47985d-k4h96   1/1     Running     0          5m35s
  16. rook-ceph-mgr-a-c9bf8bb54-kvgbw                             1/1     Running     0          5m40s
  17. rook-ceph-mon-a-55b778d66d-dl8h6                            1/1     Running     0          8m1s
  18. rook-ceph-mon-b-65f6d54689-zxblk                            1/1     Running     0          7m26s
  19. rook-ceph-mon-c-dc947478f-2jt2r                             1/1     Running     0          5m53s
  20. rook-ceph-operator-84985d69d4-z5bkq                         1/1     Running     0          18h
  21. rook-ceph-osd-0-d77bf645f-mk9j7                             1/1     Running     0          5m12s
  22. rook-ceph-osd-1-b7d7c47d-2kz5p                              1/1     Running     0          5m11s
  23. rook-ceph-osd-2-78fbd4bdc7-zbjsz                            1/1     Running     0          5m11s
  24. rook-ceph-osd-prepare-k8s-worker1-hzq7l                 0/1     Completed   0          5m19s
  25. rook-ceph-osd-prepare-k8s-worker2-8pqlk                 0/1     Completed   0          5m19s
  26. rook-ceph-osd-prepare-k8s-worker3-kb2q9                 0/1     Completed   0          5m19s

以上是所有组件的 pod 完成后的状态,以rook-ceph-osd-prepare 开头的 pod 用于自动感知集群新挂载硬盘,只不过我们前面手动指定了节点,所以这个不起作用。osd-0、osd-1、osd-2容器必须是存在且正常的,如果上述pod均正常运行成功,则视为集群安装成功。

安装ceph dashboard

Ceph Dashboard 是一个内置的基于 Web 的管理和监视应用程序,它是开源 Ceph 发行版的一部分。通过 Dashboard 可以获取 Ceph 集群的各种基本状态信息。

默认的 ceph 已经安装的 ceph-dashboard,其 SVC 地址是 service clusterIP,并不能被外部访问,需要创建 service 服务

kubectl apply -f dashboard-external-https.yaml
  

创建NodePort类型就可以被外部访问了


   
  1. [root@k8s-master1 ~]# kubectl get svc -n rook-ceph|grep dashboard
  2. rook-ceph-mgr-dashboard                  ClusterIP   109.233.40.229   <none>        8443/TCP            8m28s
  3. rook-ceph-mgr-dashboard-external-https   NodePort    109.233.34.181   <none>        8443:32234/TCP      29s

浏览器访问(master1-ip换成自己的集群ip):https://master1-ip:32234/

用户名默认是admin,至于密码可以通过以下代码获取:

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

安装rook工具箱

Rook 工具箱是一个包含用于 Rook 调试和测试的常用工具的容器,安装很简单


   
  1. cd /root/rook/deploy/examples
  2. kubectl apply -f toolbox.yaml -n rook-ceph

待容器Running后,即可执行相关命令:


   
  1. [root@k8s-master1 ~]# kubectl get po -n rook-ceph | grep tools
  2. rook-ceph-tools-775f4f4468-dcg4x                            1/1     Running     0          2m12s
  3. [root@k8s-master1 ~]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- bash
  4. [rook@rook-ceph-tools-775f4f4468-dcg4x /]$ ceph -s
  5.   cluster:
  6.     id:     cea16e6d-ef51-4cfd-aa15-3a0e13075071
  7.     health: HEALTH_OK
  8.   services:
  9.     mon: 3 daemons, quorum a,b,c (age 28m)
  10.     mgr: a(active, since 27m)
  11.     osd: 3 osds: 3 up (since 28m), 3 in (since 28m)
  12.   data:
  13.     pools:   0 pools, 0 pgs
  14.     objects: 0 objects, 0 B
  15.     usage:   15 MiB used, 1.2 TiB / 1.2 TiB avail
  16.     pgs:
  17.     
  18. [rook@rook-ceph-tools-775f4f4468-dcg4x /]$ ceph osd status
  19. ID  HOST              USED  AVAIL  WR OPS  WR DATA  RD OPS  RD DATA  STATE
  20.  0  dev-k8s-worker3  4976k   399G      0        0       0        0   exists,up
  21.  1  dev-k8s-worker2  4976k   399G      0        0       0        0   exists,up
  22.  2  dev-k8s-worker1  4976k   399G      0        0       0        0   exists,up

工具箱相关查询命令


   
  1. ceph status
  2. ceph osd status
  3. ceph df
  4. rados df

部署 RBD StorageClass

Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS。RBD 即 RADOS Block Device 的简称,RBD 块存储是最稳定且最常用的存储类型。RBD 块设备类似磁盘可以被挂载。RBD 块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。注意:RBD只支持ReadWriteOnce存储类型

  1. 创建 StorageClass


   
  1. cd /root/rook/deploy/examples/csi/rbd
  2. kubectl  apply -f storageclass.yaml
  1. 校验pool安装情况


   
  1. [root@k8s-master1 ~]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') -- bash
  2. [root@rook-ceph-tools-775f4f4468-dcg4x /]# ceph osd lspools
  3. 1 device_health_metrics
  4. 2 replicapool
  1. 查看StorageClass


   
  1. [root@k8s-master1 rbd]# kubectl get sc
  2. NAME              PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  3. rook-ceph-block   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   43s
  1. 将Ceph设置为默认存储卷

[root@k8s-master1 ~]# kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
  

修改完成后再查看StorageClass状态(有个default标识


   
  1. [root@k8s-master1 rbd]# kubectl get sc  
  2. NAME                        PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE  
  3. rook-ceph-block (default)   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   108s

小结

通过上面的步骤我们已经给Kubernetes集群安装了Ceph存储,至此我们的高可用集群就已经搭建完毕,甚至可以直接在生产环境使用了。同时也可以看到使用Rook安装Ceph还是很简单的,只需要执行对应的yaml文件即可。

不过要注意的是我们目前给集群安装的StorageClass是基于RBD的块存储,只支持ReadWriteOnce存储类型,如果你要使用ReadWriteMany存储类型,还需要安装CephFs存储。

好了,今天的文章到这里就结束了,如果你喜欢这个系列,请不要吝啬你的一键三连。同时也欢迎你把这个系列分享给你的朋友,我们一起进步。。。我们下期再见。

最后说一句(别白嫖,求关注)

新开了一个纯技术交流群(一群已满),群里氛围还不错,无广告,无套路,单纯的吹牛逼,侃人生,想进的可以通过下方二维码加我微信,备注进群!

cb6eb1a6aaa71776b7e171ceb8202e12.jpeg

文章来源: jianzh5.blog.csdn.net,作者:飘渺Jam,版权归原作者所有,如需转载,请联系作者。

原文链接:jianzh5.blog.csdn.net/article/details/125942368

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。