Kubernetes 使用 ceph-csi 消費(fèi) RBD 作為持久化存儲(chǔ)
本文詳細(xì)介紹了如何在 Kubernetes 集群中部署 ceph-csi(v3.1.0),并使用 RBD 作為持久化存儲(chǔ)。
需要的環(huán)境參考下圖:

本文使用的環(huán)境版本信息:
Kubernetes 版本:
$?kubectl?get?node
NAME???????STATUS???ROLES????AGE???VERSION
sealos01???Ready????master???23d???v1.18.8
sealos02???Ready????master???23d???v1.18.8
sealos03???Ready????master???23d???v1.18.8
Ceph 版本:
$?ceph?version
ceph?version?14.2.11?(f7fdb2f52131f54b891a2ec99d8205561242cdaf)?nautilus?(stable)
以下是詳細(xì)部署過(guò)程:
1. 新建 Ceph Pool
創(chuàng)建一個(gè)新的 ceph 存儲(chǔ)池(pool) 給 Kubernetes 使用:
$?ceph?osd?pool?create?kubernetes
pool?'?kubernetes'?created
查看所有的 pool:
$?ceph?osd?lspools
1?cephfs_data
2?cephfs_metadata
3?.rgw.root
4?default.rgw.control
5?default.rgw.meta
6?default.rgw.log
7?kubernetes
2. 新建用戶
為 Kubernetes 和 ceph-csi 單獨(dú)創(chuàng)建一個(gè)新用戶:
$?ceph?auth?get-or-create?client.kubernetes?mon?'profile?rbd'?osd?'profile?rbd?pool=kubernetes'?mgr?'profile?rbd?pool=kubernetes'
[client.kubernetes]
????key?=?AQBnz11fclrxChAAf8TFw8ROzmr8ifftAHQbTw==
后面的配置需要用到這里的 key,如果忘了可以通過(guò)以下命令來(lái)獲取:
$?ceph?auth?get?client.kubernetes
exported?keyring?for?client.kubernetes
[client.kubernetes]
?key?=?AQBnz11fclrxChAAf8TFw8ROzmr8ifftAHQbTw==
?caps?mgr?=?"profile?rbd?pool=kubernetes"
?caps?mon?=?"profile?rbd"
?caps?osd?=?"profile?rbd?pool=kubernetes"
3. 部署 ceph-csi
拉取 ceph-csi 的最新 release 分支(v3.1.0)[1]:
$?git?clone?--depth?1?--branch?v3.1.0?https://gitclone.com/github.com/ceph/ceph-csi
這里使用 gitclone[2] 來(lái)加速拉取。
修改 Configmap
獲取 Ceph 集群的信息:
$?ceph?mon?dump
dumped?monmap?epoch?1
epoch?1
fsid?154c3d17-a9af-4f52-b83e-0fddd5db6e1b
last_changed?2020-09-12?16:16:53.774567
created?2020-09-12?16:16:53.774567
min_mon_release?14?(nautilus)
0:?[v2:172.16.1.21:3300/0,v1:172.16.1.21:6789/0]?mon.sealos01
1:?[v2:172.16.1.22:3300/0,v1:172.16.1.22:6789/0]?mon.sealos02
2:?[v2:172.16.1.23:3300/0,v1:172.16.1.23:6789/0]?mon.sealos03
這里需要用到兩個(gè)信息:
fsid : 這個(gè)是 Ceph 的集群 ID。 監(jiān)控節(jié)點(diǎn)信息。目前 ceph-csi 只支持 v1版本的協(xié)議,所以監(jiān)控節(jié)點(diǎn)那里我們只能用v1的那個(gè) IP 和端口號(hào)(例如,172.16.1.21:6789)。
進(jìn)入 ceph-csi 的 deploy/rbd/kubernetes 目錄:
$?cd?deploy/rbd/kubernetes
$?ls?-l?./
total?36
-rw-r--r--?1?root?root??100?Sep?14?04:49?csi-config-map.yaml
-rw-r--r--?1?root?root?1686?Sep?14?04:49?csi-nodeplugin-psp.yaml
-rw-r--r--?1?root?root??858?Sep?14?04:49?csi-nodeplugin-rbac.yaml
-rw-r--r--?1?root?root?1312?Sep?14?04:49?csi-provisioner-psp.yaml
-rw-r--r--?1?root?root?3105?Sep?14?04:49?csi-provisioner-rbac.yaml
-rw-r--r--?1?root?root?5497?Sep?14?04:49?csi-rbdplugin-provisioner.yaml
-rw-r--r--?1?root?root?5852?Sep?14?04:49?csi-rbdplugin.yaml
將以上獲取的信息寫入 csi-config-map.yaml:
---
apiVersion:?v1
kind:?ConfigMap
data:
??config.json:?|-
????[
??????{
????????"clusterID":?"154c3d17-a9af-4f52-b83e-0fddd5db6e1b",
????????"monitors":?[
??????????"172.16.1.21:6789",
??????????"172.15.1.22:6789",
??????????"172.16.1.23:6789"
????????]
??????}
????]
metadata:
??name:?ceph-csi-config
創(chuàng)建一個(gè)新的 namespace 專門用來(lái)部署 ceph-csi:
$?kubectl?create?ns?ceph-csi
將此 Configmap 存儲(chǔ)到 Kubernetes 集群中:
$?kubectl?-n?ceph-csi?apply?-f?csi-config-map.yaml
新建 Secret
使用創(chuàng)建的 kubernetes 用戶 ID 和 cephx 密鑰生成 Secret:
cat?<?>?csi-rbd-secret.yaml
apiVersion:?v1
kind:?Secret
metadata:
name:?csi-rbd-secret
namespace:?ceph-csi
stringData:
userID:?kubernetes
userKey:?AQBnz11fclrxChAAf8TFw8ROzmr8ifftAHQbTw==
EOF
部署 Secret:
$?kubectl?apply?-f?csi-rbd-secret.yaml
RBAC 授權(quán)
將所有配置清單中的 namespace 改成 ceph-csi:
$?sed?-i?"s/namespace:?default/namespace:?ceph-csi/g"?$(grep?-rl?"namespace:?default"?./)
$?sed?-i?-e?"/^kind:?ServiceAccount/{N;N;a\??namespace:?ceph-csi??#?輸入到這里的時(shí)候需要按一下回車鍵,在下一行繼續(xù)輸入
??}"?$(egrep?-rl?"^kind:?ServiceAccount"?./)
創(chuàng)建必須的 ServiceAccount 和 RBAC ClusterRole/ClusterRoleBinding 資源對(duì)象:
$?kubectl?create?-f?csi-provisioner-rbac.yaml
$?kubectl?create?-f?csi-nodeplugin-rbac.yaml
創(chuàng)建 PodSecurityPolicy:
$?kubectl?create?-f?csi-provisioner-psp.yaml
$?kubectl?create?-f?csi-nodeplugin-psp.yaml
部署 CSI sidecar
將 csi-rbdplugin-provisioner.yaml 和 csi-rbdplugin.yaml 中的 kms 部分配置:


部署 csi-rbdplugin-provisioner:
$?kubectl?-n?ceph-csi?create?-f?csi-rbdplugin-provisioner.yaml
這里面包含了 6 個(gè) 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 中包含兩個(gè)容器:CSI node-driver-registrar 和 CSI RBD driver。
創(chuàng)建 Storageclass
$?cat?<?>?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對(duì)應(yīng)之前步驟中的fsid。imageFeatures用來(lái)確定創(chuàng)建的 image 特征,如果不指定,就會(huì)使用 RBD 內(nèi)核中的特征列表,但 Linux 不一定支持所有特征,所以這里需要限制一下。
3. 試用 ceph-csi
Kubernetes 通過(guò) PersistentVolume 子系統(tǒng)為用戶和管理員提供了一組 API,將存儲(chǔ)如何供應(yīng)的細(xì)節(jié)從其如何被使用中抽象出來(lái),其中 PV(PersistentVolume) 是實(shí)際的存儲(chǔ),PVC(PersistentVolumeClaim) 是用戶對(duì)存儲(chǔ)的請(qǐng)求。
下面通過(guò)官方倉(cāng)庫(kù)的示例來(lái)演示如何使用 ceph-csi。
先進(jìn)入 ceph-csi 項(xiàng)目的 example/rbd 目錄,然后直接創(chuàng)建 PVC:
$?kubectl?apply?-f?pvc.yaml
查看 PVC 和申請(qǐng)成功的 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
再創(chuàng)建示例 Pod:
$?kubectl?apply?-f?pod.yaml
進(jìn)入 Pod 里面測(cè)試讀寫數(shù)據(jù):
$?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
可以看到對(duì) image 的特征限制生效了,這里只有 layering。
實(shí)際上這個(gè) image 會(huì)被掛載到 node 中作為一個(gè)塊設(shè)備,可以通過(guò) 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
一切正常!
參考資料
最新 release 分支(v3.1.0): https://github.com/ceph/ceph-csi/tree/v3.1.0
[2]gitclone: https://gitclone.com


你可能還喜歡
點(diǎn)擊下方圖片即可閱讀

云原生是一種信仰??

掃碼關(guān)注公眾號(hào)
后臺(tái)回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點(diǎn)擊?"閱讀原文"?獲取更好的閱讀體驗(yàn)!
??給個(gè)「在看」,是對(duì)我最大的支持??

