Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储 (2)

Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储

部署 csi-rbdplugin-provisioner:

$ kubectl -n ceph-csi create -f csi-rbdplugin-provisioner.yaml

这里面包含了 6 个 Sidecar 容器,包括 external-provisioner、external-attacher、csi-resizer 和 csi-rbdplugin。

部署 RBD CSI driver

最后部署 RBD CSI Driver:

$ kubectl -n ceph-csi create -f csi-rbdplugin.yaml

Pod 中包含两个容器:CSI node-driver-registrar 和 CSI RBD driver。

创建 Storageclass $ cat <<EOF > storageclass.yaml --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-rbd-sc provisioner: rbd.csi.ceph.com parameters: clusterID: 154c3d17-a9af-4f52-b83e-0fddd5db6e1b pool: kubernetes imageFeatures: layering csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi csi.storage.k8s.io/fstype: ext4 reclaimPolicy: Delete allowVolumeExpansion: true mountOptions: - discard EOF

这里的 clusterID 对应之前步骤中的 fsid。

imageFeatures 用来确定创建的 image 特征,如果不指定,就会使用 RBD 内核中的特征列表,但 Linux 不一定支持所有特征,所以这里需要限制一下。

3. 试用 ceph-csi

Kubernetes 通过 PersistentVolume 子系统为用户和管理员提供了一组 API,将存储如何供应的细节从其如何被使用中抽象出来,其中 PV(PersistentVolume) 是实际的存储,PVC(PersistentVolumeClaim) 是用户对存储的请求。

下面通过官方仓库的示例来演示如何使用 ceph-csi。

先进入 ceph-csi 项目的 example/rbd 目录,然后直接创建 PVC:

$ kubectl apply -f pvc.yaml

查看 PVC 和申请成功的 PV:

$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE rbd-pvc Bound pvc-44b89f0e-4efd-4396-9316-10a04d289d7f 1Gi RWO csi-rbd-sc 8m21s $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-44b89f0e-4efd-4396-9316-10a04d289d7f 1Gi RWO Delete Bound default/rbd-pvc csi-rbd-sc 8m18s

再创建示例 Pod:

$ kubectl apply -f pod.yaml

进入 Pod 里面测试读写数据:

$ kubectl exec -it csi-rbd-demo-pod bash root@csi-rbd-demo-pod:/# cd /var/lib/www/ root@csi-rbd-demo-pod:/var/lib/www# ls -l total 4 drwxrwxrwx 3 root root 4096 Sep 14 09:09 html root@csi-rbd-demo-pod:/var/lib/www# echo "https://fuckcloudnative.io" > sealos.txt root@csi-rbd-demo-pod:/var/lib/www# cat sealos.txt https://fuckcloudnative.io

列出 kubernetes pool 中的 rbd images:

$ rbd ls -p kubernetes csi-vol-d9d011f9-f669-11ea-a3fa-ee21730897e6

查看该 image 的特征:

$ rbd info csi-vol-d9d011f9-f669-11ea-a3fa-ee21730897e6 -p kubernetes rbd image 'csi-vol-d9d011f9-f669-11ea-a3fa-ee21730897e6': size 1 GiB in 256 objects order 22 (4 MiB objects) snapshot_count: 0 id: 8da46585bb36 block_name_prefix: rbd_data.8da46585bb36 format: 2 features: layering op_features: flags: create_timestamp: Mon Sep 14 09:08:27 2020 access_timestamp: Mon Sep 14 09:08:27 2020 modify_timestamp: Mon Sep 14 09:08:27 2020

可以看到对 image 的特征限制生效了,这里只有 layering。

实际上这个 image 会被挂载到 node 中作为一个块设备,到运行 Pod 的 Node 上可以通过 rbd 命令查看映射信息:

$ rbd showmapped id pool namespace image snap device 0 kubernetes csi-vol-d9d011f9-f669-11ea-a3fa-ee21730897e6 - /dev/rbd0

在 node 上查看挂载信息:

$ lsblk -l|grep rbd rbd0 252:32 0 1G 0 disk /var/lib/kubelet/pods/15179e76-e06e-4c0e-91dc-e6ecf2119f4b/volumes/kubernetes.io~csi/pvc-44b89f0e-4efd-4396-9316-10a04d289d7f/mount

在 容器中查看挂载信息:

$ kubectl exec -it csi-rbd-demo-pod bash root@csi-rbd-demo-pod:/# lsblk -l|grep rbd rbd0 252:32 0 1G 0 disk /var/lib/www/html

一切正常!

4. 试用卷快照功能

要想使用卷快照(Volume Snapshot)功能,首先需要在 apiserver 的 --feature-gates 参数中加上 VolumeSnapshotDataSource=true,不过从 Kubernetes 1.17 开始这个特性已经默认开启了,不需要再手动添加。

卷快照功能不是 Kubernetes 的核心 API,它是通过 CRD 来实现的,同时还需要一个卷快照控制器(需要单独部署)。卷快照控制器和 CRD 独立于特定的 CSI 驱动,无论 Kubernetes 集群中部署了多少 CSI 驱动,每个集群都必须只运行一个卷快照控制器和一组卷快照 CRD。

卷快照 CRD 和控制器都在这个项目中:https://github.com/kubernetes-csi/external-snapshotter。

将 external-snapshotter 项目拉取到本地:

$ git clone --depth 1 https://github.com/kubernetes-csi/external-snapshotter

创建卷快照 CRD:

$ cd external-snapshotter $ kubectl create -f client/config/crd

将卷快照部署清单中的 namespace 改成 kube-system:

$ sed -i "s/namespace: default/namespace: kube-system/g" $(grep -rl "namespace: default" deploy/kubernetes/snapshot-controller)

部署卷快照控制器:

$ kubectl create -f deploy/kubernetes/snapshot-controller

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgdgz.html