第28讲:Ceph集群使用RBD块存储与K8S Volumes集成

打印 上一主题 下一主题

主题 554|帖子 554|积分 1662

1.Ceph集群使用RBD块存储与K8S集成简介

在K8S集群中为Pod资源提供数据长期化,大致分为三种解决方案:


  • Volume

    • Volume长期化有三种类型分别是EmptyDir、HostPath、NFS。
    • Volume是K8S集群中较为简单的数据长期化方案,无需创建其他资源,直接在Pod资源编排文件中声明Volume卷,即可挂载使用。

  • PV、PVC

    • PV和PVC是一种高级类型的长期化存储费方案,PV负责与底层存储系统举行对接,PVC从PV中分配一定的资源,最后由PVC挂载到Pod中。

  • StorageClass

    • 更加高级的一种长期化存储方案,由StorageClass提供一个数据长期化资源池,当Pod需要长期化数据时,直接从StorageClass中主动创建出PV和PVC,最后挂载到Pod资源中。

无论使用哪种长期化方案,最常用的方式是通过NFS或者NAS来实现,本日通过Ceph分布式集群中的RBD块存储来实现Pod数据的长期化。
2.Ceph集群RBD块存储与K8S Volume集成

2.1.在Ceph集群中创建K8S集群使用的块存储

  1. 1.创建一个Pool资源池
  2. [root@ceph-node-1 ~]# ceph osd pool create kubernetes_data 16 16
  3. pool 'kubernetes_data' created
  4. 2.在资源池中创建块存储设备
  5. [root@ceph-node-1 ~]# rbd create --image-feature layering kubernetes_data/rbd_volume_data.img --size 10G
  6. 3.查看创建的块存储设备
  7. [root@ceph-node-1 ~]# rbd -p kubernetes_data ls
  8. rbd_volume_data.img
  9. 4.查看块存储设备的信息
  10. [root@ceph-node-1 ~]# rbd info kubernetes_data/rbd_volume_data.img
  11. rbd image 'rbd_volume_data.img':
  12.         size 10 GiB in 2560 objects
  13.         order 22 (4 MiB objects)
  14.         snapshot_count: 0
  15.         id: ad8a1b33e8b
  16.         block_name_prefix: rbd_data.ad8a1b33e8b
  17.         format: 2
  18.         features: layering
  19.         op_features:
  20.         flags:
  21.         create_timestamp: Mon Apr 11 23:00:30 2022
  22.         access_timestamp: Mon Apr 11 23:00:30 2022
  23.         modify_timestamp: Mon Apr 11 23:00:30 2022
复制代码
2.2.创建用于K8S访问Ceph RBD块设备的认证用户

K8S想要访问Ceph中的RBD块设备,必须通过一个认证用户才可以访问,如果没有认证用户则无法访问Ceph集群中的块设备。
命令格式:ceph auth get-or-create {用户名称} mon '{访问mon的方式}' osd '{访问osd的方式}'
  1. [root@ceph-node-1 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes_data'
  2. [client.kubernetes]
  3.         key = AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A==
复制代码
命令表明:创建了一个client.kubernetes名称的Ceph认证用户,访问mon的方式是以RBD块存储情势访问,访问OSD的方式也是以块存储RBD方式访问Pool资源池。
查看创建的认证用户。
  1. [root@ceph-node-1 ~]# ceph auth list
复制代码
可以看到Ceph的认证用户都是以client开头,每一个用户都有对mon和osd的访问方式。

2.3.将认证用户的Key存储在K8S Secret资源中

将认证用户的key通过Base64举行加密,存储在K8S的Secret资源中。
1)将key通过Base64举行加密
  1. [root@ceph-node-1 ~]# echo AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A== | base64
  2. QVFCbFJWUmliYnF6SlJBQUQzbGFjWWF4UmxvVFZUaW82ZSsxMEE9PQo=
复制代码
2)将加密后的Key存储在Secret资源中
  1. [root@k8s-master volumes]# vim rbd-volume-secret.yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5.   name: rbd-volume-secret
  6. type: "kubernetes.io/rbd"
  7. data:
  8.   key: QVFCbFJWUmliYnF6SlJBQUQzbGFjWWF4UmxvVFZUaW82ZSsxMEE9PQo=
复制代码
3)创建Secret资源
RBD的Secret要与Pod在同一Namespace下,如果不同的Namespace的Pod都需要使用RBD举行存储,则需要在每个Namespace下都举行创建。
  1. [root@k8s-master volumes]# kubectl apply -f rbd-volume-secret.yaml
  2. secret/rbd-volume-secret created
  3. [root@k8s-master volumes]# kubectl get secret
  4. NAME                  TYPE                                  DATA   AGE
  5. rbd-volume-secret     kubernetes.io/rbd                     1      16s
  6. default-token-fbknq   kubernetes.io/service-account-token   3      60d
复制代码
2.4.在K8S集群的全部节点中安装Ceph命令

不安装ceph命令将无法乐成挂载块设备。
  1. [root@k8s-master ~]# yum -y install ceph-common
  2. [root@k8s-node1 ~]# yum -y install ceph-common
  3. [root@k8s-node2 ~]# yum -y install ceph-common
复制代码
2.5.创建Pod资源使用Ceph集群的RBD块存储举行数据长期化

1)编写Pod资源使用RBD块存储的资源编排文件
  1. [root@k8s-master volumes]# vim rbd-volumes-pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: rbd-volumes-pod
  6. spec:
  7.   nodeName: k8s-node1
  8.   containers:
  9.   - name: rbd-volumes-pod
  10.     image: nginx:1.15
  11.     imagePullPolicy: IfNotPresent
  12.     ports:
  13.     - name: web
  14.       containerPort: 80
  15.       protocol: TCP
  16.     volumeMounts:
  17.     - name: rbd-volume
  18.       mountPath: /data
  19.   volumes:
  20.   - name: rbd-volume
  21.     rbd:
  22.       monitors:
  23.       - 192.168.20.20:6789
  24.       - 192.168.20.21:6789
  25.       - 192.168.20.22:6789
  26.       pool: kubernetes_data
  27.       image: rbd_volume_data.img
  28.       fsType: ext4
  29.       user: kubernetes
  30.       secretRef:
  31.         name: rbd-volume-secret
复制代码
2)创建Pod资源
  1. [root@k8s-master volumes]# kubectl apply -f rbd-volumes-pod.yaml
  2. pod/rbd-volumes-pod created
  3. [root@k8s-master ~]# kubectl get pod
  4. [root@k8s-master volumes]# kubectl get pod
  5. NAME              READY   STATUS              RESTARTS   AGE
  6. rbd-volumes-pod   1/1     Running                           0          3s
复制代码
2.6.查看Pod资源挂载的RBD信息

1)进入Pod中查看挂载的RBD信息
可以看到Pod乐成挂载上了RBD块存储,和之前做块设备映射一样,也是将块设备映射成了一块名为/dev/rbd0的裸磁盘,然后挂载到了/data目录中。
  1. [root@k8s-master volumes]# kubectl exec -it rbd-volumes-pod bash
  2. root@rbd-volumes-pod:/# df -hT /data
  3. Filesystem     Type  Size  Used Avail Use% Mounted on
  4. /dev/rbd0      ext4  9.8G   37M  9.7G   1% /data
复制代码
2)在宿主机上查看挂载的RBD信息
为什么会在Pod中看到挂载的RBD块设备映射的磁盘,其实是宿主机将块设备映射的磁盘挂载到了容器的某个路径中,这才导致在Pod里显示的是一块RBD磁盘挂载。
首先查看Pod运行在了哪个Node节点上,然后查看RBD块设备的挂载信息。
  1. [root@k8s-node1 ~]# df -HT /dev/rbd0
  2. 文件系统       类型  容量  已用  可用 已用% 挂载点
  3. /dev/rbd0      ext4   11G   38M   11G    1% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/kubernetes_data-image-rbd_volume_data.img
复制代码
3)当Pod资源被删除后观察NOde节点挂载的RBD状态
当Pod资源被删除后,Node节点挂载的RBD块设备主动删除。
  1. [root@k8s-master volumes]# kubectl delete -f rbd-volumes-pod.yaml
  2. pod "rbd-volumes-pod" deleted
  3. [root@k8s-node1 ~]# df -HT /dev/rbd0
  4. df: "/dev/rbd0": 没有那个文件或目录
复制代码
4)多个Pod同时使用一个块存储设备会有什么效果
一个块设备映射的磁盘只能被一个节点举行挂载,如果多个Pod资源分布在不同Node节点上,多个Node节点都要挂载这一个块存储映射的磁盘将会报错。
  1.   Warning  FailedMount             5s    kubelet                  MountVolume.WaitForAttach failed for volume "rbd-volume" : rbd image kubernetes_data/rbd_volume_data.img is still being used
复制代码
若是多个Pod都调度在同一个Node节点上,那么可以同时使用同一块块存储设备长期化Pod中的数据,而且也Pod可以启动乐成。
  1. [root@k8s-master volumes]# kubectl get pod -o wide
  2. NAME                      READY   STATUS    RESTARTS   AGE     IP                NODE        NOMINATED NODE   READINESS GATES
  3. rbd-volumes-pod           1/1     Running   0          7m12s   100.111.156.122   k8s-node1   <none>           <none>
  4. rbd-volumes-pod-2   1/1     Running   0          8s      100.111.156.120   k8s-node1   <none>           <none>
复制代码
类似于共享存储的效果,如下图所示,都是挂载的一块块设备,任何Pod在里面写数据,其他的Pod都可以读取。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表