文章目录
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.创建一个Pool资源池 [root@ceph-node-1 ~]# ceph osd pool create kubernetes_data 16 16 pool 'kubernetes_data' created 2.在资源池中创建块存储设备 [root@ceph-node-1 ~]# rbd create --image-feature layering kubernetes_data/rbd_volume_data.img --size 10G 3.查看创建的块存储设备 [root@ceph-node-1 ~]# rbd -p kubernetes_data ls rbd_volume_data.img 4.查看块存储设备的信息 [root@ceph-node-1 ~]# rbd info kubernetes_data/rbd_volume_data.img rbd image 'rbd_volume_data.img': size 10 GiB in 2560 objects order 22 (4 MiB objects) snapshot_count: 0 id: ad8a1b33e8b block_name_prefix: rbd_data.ad8a1b33e8b format: 2 features: layering op_features: flags: create_timestamp: Mon Apr 11 23:00:30 2022 access_timestamp: Mon Apr 11 23:00:30 2022 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的方式}'
[root@ceph-node-1 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes_data' [client.kubernetes] key = AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A==
命令解释:创建了一个client.kubernetes名称的Ceph认证用户,访问mon的方式是以RBD块存储形式访问,访问OSD的方式也是以块存储RBD方式访问Pool资源池。
查看创建的认证用户。
[root@ceph-node-1 ~]# ceph auth list
可以看到Ceph的认证用户都是以client开头,每一个用户都有对mon和osd的访问方式。
2.3.将认证用户的Key存储在K8S Secret资源中
将认证用户的key通过Base64进行加密,存储在K8S的Secret资源中。
1)将key通过Base64进行加密
[root@ceph-node-1 ~]# echo AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A== | base64 QVFCbFJWUmliYnF6SlJBQUQzbGFjWWF4UmxvVFZUaW82ZSsxMEE9PQo=
2)将加密后的Key存储在Secret资源中
[root@k8s-master volumes]# vim rbd-volume-secret.yaml apiVersion: v1 kind: Secret metadata: name: rbd-volume-secret type: "kubernetes.io/rbd" data: key: QVFCbFJWUmliYnF6SlJBQUQzbGFjWWF4UmxvVFZUaW82ZSsxMEE9PQo=
3)创建Secret资源
RBD的Secret要与Pod在同一Namespace下,如果不同的Namespace的Pod都需要使用RBD进行存储,则需要在每个Namespace下都进行创建。
[root@k8s-master volumes]# kubectl apply -f rbd-volume-secret.yaml secret/rbd-volume-secret created [root@k8s-master volumes]# kubectl get secret NAME TYPE DATA AGE rbd-volume-secret kubernetes.io/rbd 1 16s default-token-fbknq kubernetes.io/service-account-token 3 60d
2.4.在K8S集群的所有节点中安装Ceph命令
不安装ceph命令将无法成功挂载块设备。
[root@k8s-master ~]# yum -y install ceph-common [root@k8s-node1 ~]# yum -y install ceph-common [root@k8s-node2 ~]# yum -y install ceph-common
2.5.创建Pod资源使用Ceph集群的RBD块存储进行数据持久化
1)编写Pod资源使用RBD块存储的资源编排文件
[root@k8s-master volumes]# vim rbd-volumes-pod.yaml apiVersion: v1 kind: Pod metadata: name: rbd-volumes-pod spec: nodeName: k8s-node1 containers: - name: rbd-volumes-pod image: nginx:1.15 imagePullPolicy: IfNotPresent ports: - name: web containerPort: 80 protocol: TCP volumeMounts: - name: rbd-volume mountPath: /data volumes: - name: rbd-volume rbd: monitors: - 192.168.20.20:6789 - 192.168.20.21:6789 - 192.168.20.22:6789 pool: kubernetes_data image: rbd_volume_data.img fsType: ext4 user: kubernetes secretRef: name: rbd-volume-secret
2)创建Pod资源
[root@k8s-master volumes]# kubectl apply -f rbd-volumes-pod.yaml pod/rbd-volumes-pod created [root@k8s-master ~]# kubectl get pod [root@k8s-master volumes]# kubectl get pod NAME READY STATUS RESTARTS AGE rbd-volumes-pod 1/1 Running 0 3s
2.6.查看Pod资源挂载的RBD信息
1)进入Pod中查看挂载的RBD信息
可以看到Pod成功挂载上了RBD块存储,和之前做块设备映射一样,也是将块设备映射成了一块名为/dev/rbd0的裸磁盘,然后挂载到了/data目录中。
[root@k8s-master volumes]# kubectl exec -it rbd-volumes-pod bash root@rbd-volumes-pod:/# df -hT /data Filesystem Type Size Used Avail Use% Mounted on /dev/rbd0 ext4 9.8G 37M 9.7G 1% /data
2)在宿主机上查看挂载的RBD信息
为什么会在Pod中看到挂载的RBD块设备映射的磁盘,其实是宿主机将块设备映射的磁盘挂载到了容器的某个路径中,这才导致在Pod里显示的是一块RBD磁盘挂载。
首先查看Pod运行在了哪个Node节点上,然后查看RBD块设备的挂载信息。
[root@k8s-node1 ~]# df -HT /dev/rbd0 文件系统 类型 容量 已用 可用 已用% 挂载点 /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块设备自动删除。
[root@k8s-master volumes]# kubectl delete -f rbd-volumes-pod.yaml pod "rbd-volumes-pod" deleted [root@k8s-node1 ~]# df -HT /dev/rbd0 df: "/dev/rbd0": 没有那个文件或目录
4)多个Pod同时使用一个块存储设备会有什么效果
一个块设备映射的磁盘只能被一个节点进行挂载,如果多个Pod资源分布在不同Node节点上,多个Node节点都要挂载这一个块存储映射的磁盘将会报错。
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可以启动成功。
[root@k8s-master volumes]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES rbd-volumes-pod 1/1 Running 0 7m12s 100.111.156.122 k8s-node1 <none> <none> rbd-volumes-pod-2 1/1 Running 0 8s 100.111.156.120 k8s-node1 <none> <none>
类似于共享存储的效果,如下图所示,都是挂载的一块块设备,任何Pod在里面写数据,其他的Pod都可以读取。