试用 Rook/Ceph
首先
Kubernetes 的 PersistentVolume 有多种类型可供选择。
迄今为止,我已在以下文章中尝试了2种类型。
-
- Longhorn(v1.0) with Rancher
- glusterfs on k8s
我想尝试一下 Ceph 这次。
我们将使用一个名为 Rook 的存储操作器来进行构建。
环境信息
在使用kubeadm搭建的Kubernetes上进行部署。
-
- OS:Ubuntu 18.04.5 LTS
-
- Kubernetes:v1.19.7
Node は3台構成です
Node にはルートディスクの他に PV 用の空ディスクをアタッチしています(※1)
Ceph:15.2.11
Rook:v1.6.1
只需一个选项,将以下内容用中文进行释义:
关于 Rook / Ceph 的详细前提条件,请参考以下内容。
由于本次满足了基本条件,因此没有进行额外设置。
-
- Rook Prerequisites
- Ceph Prerequisites
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sda1 8:1 0 10G 0 part /
sdb 8:16 0 10M 0 disk
sdc 8:32 0 50G 0 disk ★ 空のディスク
车轮/锤子部署
首先,先准备好 Rook 并进行 Ceph 部署的准备工作。
# Rook の資材をダウンロード
$ git clone --single-branch --branch v1.6.1 https://github.com/rook/rook.git
# example 内を確認
# Ceph 以外にも Cassandra / NFS を構築できます
$ ls rook/cluster/examples/kubernetes/
README.md cassandra ceph mysql.yaml nfs wordpress.yaml
# 資材の配置ディレクトリに移動
# 今回の資材以外にも様々なパターンの yaml が用意されている
$ cd rook/cluster/examples/kubernetes/ceph/
$ ls
ceph-client.yaml dashboard-external-http.yaml object-bucket-claim-delete.yaml pool-test.yaml
cluster-external-management.yaml dashboard-external-https.yaml object-bucket-claim-retain.yaml pool.yaml
cluster-external.yaml dashboard-ingress-https.yaml object-ec.yaml pre-k8s-1.16
cluster-on-pvc.yaml dashboard-loadbalancer.yaml object-external.yaml rbdmirror.yaml
cluster-stretched.yaml direct-mount.yaml object-multisite-pull-realm.yaml rgw-external.yaml
cluster-test.yaml filesystem-ec.yaml object-multisite.yaml scc.yaml
cluster.yaml filesystem-mirror.yaml object-openshift.yaml storageclass-bucket-delete.yaml
common-external.yaml filesystem-test.yaml object-test.yaml storageclass-bucket-retain.yaml
common-second-cluster.yaml filesystem.yaml object-user.yaml test-data
common.yaml flex object.yaml toolbox-job.yaml
crds.yaml import-external-cluster.sh operator-openshift.yaml toolbox.yaml
create-external-cluster-resources.py monitoring operator.yaml
create-external-cluster-resources.sh nfs-test.yaml osd-purge.yaml
csi nfs.yaml pool-ec.yaml
# 共通設定(Namespace / Role・RoleBindings など)を作成
$ kubectl create -f common.yaml
・・・
# Namespace が作成されていることを確認
$ kubectl get ns rook-ceph
NAME STATUS AGE
rook-ceph Active 6m54s
# Rook の CRD(CustomResourceDefinitions)を作成
$ kubectl create -f crds.yaml
・・・
# CRD が登録されていることを確認
$ kubectl api-resources | grep rook
cephblockpools ceph.rook.io true CephBlockPool
cephclients ceph.rook.io true CephClient
cephclusters ceph.rook.io true CephCluster
cephfilesystemmirrors ceph.rook.io true CephFilesystemMirror
cephfilesystems ceph.rook.io true CephFilesystem
cephnfses nfs ceph.rook.io true CephNFS
cephobjectrealms ceph.rook.io true CephObjectRealm
cephobjectstores ceph.rook.io true CephObjectStore
cephobjectstoreusers rcou,objectuser ceph.rook.io true CephObjectStoreUser
cephobjectzonegroups ceph.rook.io true CephObjectZoneGroup
cephobjectzones ceph.rook.io true CephObjectZone
cephrbdmirrors ceph.rook.io true CephRBDMirror
volumes rv rook.io true Volume
# Rook の Ceph 用 Operator をデプロイします
$ kubectl create -f operator.yaml
# Operator の起動を確認
$ kubectl get cm,po -n rook-ceph
NAME DATA AGE
configmap/rook-ceph-operator-config 13 87s
NAME READY STATUS RESTARTS AGE
pod/rook-ceph-operator-95f44b96c-zfbhv 1/1 Running 0 87s
由于准备工作已经完成,我们立即开始部署 Ceph 集群。
由于先前的 yaml 列表中包含了自定义资源定义(CRD)的示例,我们将使用它们进行部署。
顺便提一下,提供的 yaml 文件中有几个示例,可根据需求进行使用。
-
- cluster-test.yaml
開発環境用
ノードは1台から利用可能
Ceph のバージョンは v16 が指定されている
cluster.yaml
本番環境用
ノードは3台必要
Ceph のバージョンは v15.2.11 が指定されている
今回はこちらを利用する
cluster-on-pvc.yaml
パブクラ環境で PVC を利用する場合に利用?
参考了以下的 Ceph 部署文档,您可以根据提供的 yaml 进行适当的配置更改,来定制化地部署 Ceph。
- Ceph Examples
立即使用预先准备的 yaml 文件部署 Ceph。
# CR(CustomResource) である cephclusster のデプロイ
$ kubectl create -f cluster.yaml
cephcluster.ceph.rook.io/rook-ceph created
# しばらくするとコンテナが起動してくるので状況を確認
$ kubectl get po -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-7cm6r 0/3 ContainerCreating 0 2s
csi-cephfsplugin-krs4r 0/3 ContainerCreating 0 2s
csi-cephfsplugin-provisioner-5b989b9977-2t9dq 0/6 ContainerCreating 0 2s
csi-cephfsplugin-provisioner-5b989b9977-shwr9 0/6 ContainerCreating 0 2s
csi-cephfsplugin-xdnlf 0/3 ContainerCreating 0 2s
csi-rbdplugin-56rlt 3/3 Running 0 3s
・・・
# 作成された CR でも状況を確認できる
$ kubectl get cephclusters.ceph.rook.io -n rook-ceph
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL
rook-ceph /var/lib/rook 3 4m23s Progressing Configuring Ceph Mons
# デプロイ完了後の状態
$ kubectl get po -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-5qcsr 3/3 Running 0 3m29s
csi-cephfsplugin-8rh7q 3/3 Running 0 3m29s
csi-cephfsplugin-m5rwp 3/3 Running 0 3m29s
csi-cephfsplugin-provisioner-5b989b9977-2nfwd 6/6 Running 0 3m28s
csi-cephfsplugin-provisioner-5b989b9977-kmpzd 6/6 Running 0 3m28s
csi-rbdplugin-5vgnh 3/3 Running 0 3m30s
csi-rbdplugin-provisioner-55f998c984-dfjzt 6/6 Running 0 3m30s
csi-rbdplugin-provisioner-55f998c984-sbqd8 6/6 Running 0 3m30s
csi-rbdplugin-qtkf5 3/3 Running 0 3m30s
csi-rbdplugin-r2qm9 3/3 Running 0 3m30s
rook-ceph-crashcollector-nd01-5b6f6c8974-wgw9s 1/1 Running 0 69s
rook-ceph-crashcollector-nd02-84bc45b685-cvvvc 1/1 Running 0 91s
rook-ceph-crashcollector-nd03-66b4dd645b-nk22j 1/1 Running 0 102s
rook-ceph-mgr-a-5c67fd5c76-ggrlg 1/1 Running 0 79s
rook-ceph-mon-a-677c4fc69b-prvq7 1/1 Running 0 3m18s
rook-ceph-mon-b-5b86596d64-w7mk5 1/1 Running 0 111s
rook-ceph-mon-c-56598d55f5-g5559 1/1 Running 0 91s
rook-ceph-operator-95f44b96c-gzh69 1/1 Running 0 8m25s
rook-ceph-osd-0-7754f799b8-dcdl7 1/1 Running 0 70s
rook-ceph-osd-1-566b84474b-hzjht 1/1 Running 0 70s
rook-ceph-osd-2-85b456dd84-2grnl 1/1 Running 0 69s
rook-ceph-osd-prepare-nd01-gqbrq 0/1 Completed 0 52s
rook-ceph-osd-prepare-nd02-d98t8 0/1 Completed 0 49s
rook-ceph-osd-prepare-nd03-xg5z2 0/1 Completed 0 47s
$ kubectl get cephclusters
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL
rook-ceph /var/lib/rook 3 5m35s Ready Cluster created successfully HEALTH_WARN
Ceph已顺利启动。
若Ceph在中途出现挂起或初始化停止的情况,请尝试使用kubectl describe或kubectl log命令确认各个Pod的情况。另外,建议通过kubectl log命令查看rook-ceph-operator-XXXX的日志,以了解其进展情况等,也可以根据需要进行适时确认。
在无法解决问题时,尝试先删除,然后重新创建也是个办法。
以下是一些步骤供参考。我在遇到失败时也曾这样删除并重新创建过…
- Cleaning up a Cluster
确认行动
因为Ceph已经部署好了,所以我们立即开始试用。
首先,我们通过CLI访问Ceph。由于有一个被称为Toolbox的ceph命令可以执行的Pod的yaml文件,我们将部署并使用它。
# toolbox のデプロイ
$ kubectl apply -f toolbox.yaml
deployment.apps/rook-ceph-tools created
$ kubectl get po -l app=rook-ceph-tools
NAME READY STATUS RESTARTS AGE
rook-ceph-tools-57787758df-s596f 1/1 Running 0 2m38s
# ceph コマンドでバージョンと状態を確認
$ kubectl exec rook-ceph-tools-57787758df-s596f -- ceph version
ceph version 15.2.11 (e3523634d9c2227df9af89a4eac33d16738c49cb) octopus (stable)
$ kubectl exec rook-ceph-tools-57787758df-s596f -- ceph status
cluster:
id: 25b3fce4-14e3-46c9-a9ce-f753ccaff570
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
mons a,c are low on available space
services:
mon: 3 daemons, quorum a,b,c (age 13m)
mgr: a(active, since 12m)
osd: 3 osds: 3 up (since 12m), 3 in (since 12m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 147 GiB / 150 GiB avail
pgs: 1 active+clean
现在我们将使用Ceph来创建一个可以在容器上挂载的持久卷(PV)。
为了创建基于Ceph的PV,首先我们需要创建一个存储类(StorageClass)。
通过在PVC创建时指定存储类,我们可以动态地创建符合存储类定义的PV。
存储类的yaml文件已经准备好了,因此我们将使用该文件。
- rook/cluster/examples/kubernetes/ceph/csi/rbd
$ ls
pod.yaml pvc-restore.yaml snapshot.yaml storageclass-ec.yaml storageclass.yaml
pvc-clone.yaml pvc.yaml snapshotclass.yaml storageclass-test.yaml
# StorageClass / CephBlockPool を登録
$ kubectl create -f storageclass.yaml
cephblockpool.ceph.rook.io/replicapool created
storageclass.storage.k8s.io/rook-ceph-block created
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 103s
由于准备工作已完成,我们将创建实际的PV = Ceph块存储(RBD)。
这次我们将部署提供的WordPress示例。
示例yaml文件存储在以下路径中。
- rook/cluster/examples/kubernetes
$ ls
README.md cassandra ceph mysql.yaml nfs wordpress.yaml
# MySQL のデプロイ
$ kubectl apply -f mysql.yaml -n default
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress-mysql created
# WordPress 用の Web サーバをデプロイ
$ kubectl apply -f wordpress.yaml -n default
service/wordpress created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created
# デプロイしたコンテナを確認
$ kubectl get deploy,po -n default
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 1/1 1 1 60s
deployment.apps/wordpress-mysql 1/1 1 1 2m41s
NAME READY STATUS RESTARTS AGE
pod/wordpress-7b989dbf57-7zrln 1/1 Running 0 60s
pod/wordpress-mysql-6965fc8cc8-jd8bm 1/1 Running 0 2m41s
# 作成された PV/PVC を確認
$ kubectl get pvc,pv -n default
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-pv-claim Bound pvc-bd039533-b11e-415b-b2c6-d2f5a62c3cd0 20Gi RWO rook-ceph-block 2m41s
persistentvolumeclaim/wp-pv-claim Bound pvc-7617ba88-3fd1-4382-96b8-766510571dfa 20Gi RWO rook-ceph-block 60s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-7617ba88-3fd1-4382-96b8-766510571dfa 20Gi RWO Delete Bound default/wp-pv-claim rook-ceph-block 60s
persistentvolume/pvc-bd039533-b11e-415b-b2c6-d2f5a62c3cd0 20Gi RWO Delete Bound default/mysql-pv-claim rook-ceph-block 2m39s
# アクセス確認用に NodePort で定義されている Service を確認
# wordpress のポート(今回は 30541)を確認
$ kubectl get svc -n default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
service/wordpress LoadBalancer 10.111.139.194 <pending> 80:30541/TCP 60s
service/wordpress-mysql ClusterIP None <none> 3306/TCP 2m41s
你可以通过以下的NodePort端口号和Node的IP地址访问部署的WordPress。
- http://:/


总结
这次我们尝试使用 Rook 来部署 Ceph。
使用 Rook 进行部署非常简单。
由于有丰富的 YAML 示例,根据使用需求进行自定义也很容易。
此外,Ceph 不仅可以作为块存储,还可以作为对象存储和文件存储,因此可用于各种用途。
由于 Ceph 本身是一款非常深奥的软件,所以使用起来可能会有一些困难…
下一次,我打算确认一下引入的 Ceph 的各种情况。
请在中国在线购物平台上购买,只需一种选项。
我阅读了前辈们的资料来了解有关 Rook/Ceph 的详细说明。很易懂的内容…
而且,我們也參考了我們團隊成員的部落格。
对我们的先辈们心存感激。