如何在 Kubernetes 集群中部署ceph-csi

写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

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

需要的环境参考下图:

如何在 Kubernetes 集群中部署ceph-csi

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

Kubernetes 版本:

$ kubectl get node
NAME       STATUS   ROLES    AGE   VERSIONsealos01   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_data2 cephfs_metadata3 .rgw.root4 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) [1] :

$ git clone --depth 1 --branch v3.1.0 https://gitclone.com/github.com/ceph/ceph-csi
  • 这里使用 gitclone [2] 来加速拉取。

修改 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。
  • v1 v1 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: v1kind: Secretmetadata:name: csi-rbd-secretnamespace: ceph-csistringData:userID: kubernetesuserKey: 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
如何在 Kubernetes 集群中部署ceph-csi

部署 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/v1kind: StorageClassmetadata:   name: csi-rbd-scprovisioner: rbd.csi.ceph.comparameters:   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: ext4reclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:   - discardEOF
  • 这里的 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 pvNAME                                       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 kubernetescsi-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 中作为一个块设备,可以通过 rbd 命令查看映射信息:

$ rbd showmapped
id pool       namespace image                                        snap device0  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

一切正常!

来源:https://www.tuicool.com/articles/rMJzuib

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361