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

原文链接:https://fuckcloudnative.io/posts/kubernetes-storage-using-ceph-rbd/

本文详细介绍了如何在 Kubernetes 集群中部署 ceph-csi(v3.1.0),并使用 RBD 作为久化存储。

需要的环境参考下图:

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

本文使用的环境版本信息:

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)

以下是详细部署过程:

1. 新建 Ceph Pool

创建一个新的 ceph 存储池(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 单独创建一个新用户:

$ 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,如果忘了可以通过以下命令来获取:

$ 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):

$ git clone --depth 1 --branch v3.1.0 https://gitclone.com/github.com/ceph/ceph-csi

这里使用 gitclone 来加速拉取。

修改 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

这里需要用到两个信息:

fsid : 这个是 Ceph 的集群 ID。

监控节点信息。目前 ceph-csi 只支 v1 版本的协议,所以监控节点那里我们只能用 v1 的那个 IP 和端口号(例如,172.16.1.21:6789)。

进入 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

创建一个新的 namespace 专门用来部署 ceph-csi:

$ kubectl create ns ceph-csi

将此 Configmap 存储到 Kubernetes 集群中:

$ kubectl -n ceph-csi apply -f csi-config-map.yaml 新建 Secret

使用创建的 kubernetes 用户 ID 和 cephx 密钥生成 Secret:

cat <<EOF > 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 授权

将所有配置清单中的 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 # 输入到这里的时候需要按一下回车键,在下一行继续输入 }" $(egrep -rl "^kind: ServiceAccount" ./)

创建必须的 ServiceAccount 和 RBAC ClusterRole/ClusterRoleBinding 资源对象:

$ kubectl create -f csi-provisioner-rbac.yaml $ kubectl create -f csi-nodeplugin-rbac.yaml

创建 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 部分配置注释掉:

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

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

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