K8s 上的分佈式存儲集羣搭建(Rook-ceph)

作者:王三歲

靈雀雲後端工程師

1 環境準備

1.1 基礎環境

默認 k8s 已安裝完成,採用 kubeadm 容器化安裝

1.2 所安裝 rook/ceph 版本:

ceph:v15.2.11

rook:1.6.3

1.3 前提

lsblk -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
vda                                                      
└─vda1 xfs          6f15c206-f516-4ee8-a4b7-89ad880647db /
vdb

2 搭建流程

2.1Rook 是什麼?

2.2 ceph-rook 與 k8s 集成方式

3 安裝部署

3.1 安裝前準備

#確認安裝lvm2
yum install lvm2 -y
#啓用rbd模塊
modprobe rbd
cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules
do
  [ -x \$file ] && \$file
done
EOF
cat > /etc/sysconfig/modules/rbd.modules << EOF
modprobe rbd
EOF
chmod 755 /etc/sysconfig/modules/rbd.modules
lsmod |grep rbd

3.2 下載 Rook 安裝文件

git clone --single-branch --branch v1.6.3 https://github.com/rook/rook.git

更改配置

cd rook/cluster/examples/kubernetes/ceph

修改 Rook CSI 鏡像地址,原本的地址可能是 gcr 的鏡像,但是 gcr 的鏡像無法被國內訪問,所以需要同步 gcr 的鏡像到阿里雲鏡像倉庫,本文檔已經爲大家完成同步,可以直接修改如下:

vim operator.yaml

改爲:

ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-node-driver-registrar:v2.0.1"
 ROOK_CSI_RESIZER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-resizer:v1.0.1"
 ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-provisioner:v2.0.4"
 ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-snapshotter:v4.0.0"
 ROOK_CSI_ATTACHER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-attacher:v3.0.2"

還是 operator 文件,新版本 rook 默認關閉了自動發現容器的部署,可以找到 ROOK_ENABLE_DISCOVERY_DAEMON 改成 true 即可:

3.4 部署 ROOK

cd cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

等待容器啓動,只有都 running 才能進行下一步

[root@k8s-master01 ceph]# kubectl -n rook-ceph get pod
NAME                                                     READY   STATUS      RESTARTS   AGE
rook-ceph-operator-675f59664d-b9nch                      1/1     Running     0          32m
rook-discover-4m68r                                      1/1     Running     0          40m
rook-discover-chscc                                      1/1     Running     0          40m
rook-discover-mmk69                                      1/1     Running     0          40m

3.5 創建 ceph 集羣

kubectl create -f cluster.yaml

創建完成後,可以查看 pod 的狀態:

[root@k8s-master01 ceph]# kubectl -n rook-ceph get pod
NAME                                                     READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-8d6zn                                   3/3     Running     0          39m
csi-cephfsplugin-dr6wd                                   3/3     Running     0          39m
csi-cephfsplugin-gblpg                                   3/3     Running     0          39m
csi-cephfsplugin-provisioner-846ffc6cb4-qjv7s            6/6     Running     0          39m
csi-cephfsplugin-provisioner-846ffc6cb4-wbjzg            6/6     Running     0          39m
csi-rbdplugin-6bd9t                                      3/3     Running     0          39m
csi-rbdplugin-9b6gt                                      3/3     Running     0          39m
csi-rbdplugin-9vtpp                                      3/3     Running     0          39m
csi-rbdplugin-provisioner-75fd5c779f-9989z               6/6     Running     0          39m
csi-rbdplugin-provisioner-75fd5c779f-zx49t               6/6     Running     0          39m
rook-ceph-crashcollector-k8s-master01-75bb6c6dd9-lnncg   1/1     Running     0          38m
rook-ceph-crashcollector-k8s-node-90-84b555c8c8-5vt72    1/1     Running     0          38m
rook-ceph-crashcollector-k8s-node-94-798667dd4b-dzvbw    1/1     Running     0          31m
rook-ceph-mgr-a-86d4459f5b-8bk49                         1/1     Running     0          38m
rook-ceph-mon-a-847d986b98-tff45                         1/1     Running     0          39m
rook-ceph-mon-b-566894d545-nbw2t                         1/1     Running     0          39m
rook-ceph-mon-c-58c5789c6-xz5l7                          1/1     Running     0          38m
rook-ceph-operator-675f59664d-b9nch                      1/1     Running     0          32m
rook-ceph-osd-0-76db9d477d-dz9kf                         1/1     Running     0          38m
rook-ceph-osd-1-768487dbc8-g7zq9                         1/1     Running     0          31m
rook-ceph-osd-2-5d9f8d6fb-bfwtk                          1/1     Running     0          31m
rook-ceph-osd-prepare-k8s-master01-4b4mp                 0/1     Completed   0          31m
rook-ceph-osd-prepare-k8s-node-90-7jg4n                  0/1     Completed   0          31m
rook-ceph-osd-prepare-k8s-node-94-4mb7g                  0/1     Completed   0          31m
rook-discover-4m68r                                      1/1     Running     0          40m
rook-discover-chscc                                      1/1     Running     0          40m
rook-discover-mmk69                                      1/1     Running     0          40m

其中 osd-0、osd-1、osd-2 容器必須是存在且正常的,如果上述 pod 均正常運行成功,則視爲集羣安裝成功。

3.6 安裝 ceph 客戶端工具

這個文件的路徑還是在 ceph 文件夾下

kubectl  create -f toolbox.yaml -n rook-ceph

待容器 Running 後,即可執行相關命令:

[root@k8s-master01 ~]# kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
[root@rook-ceph-tools-fc5f9586c-m2wf5 /]# ceph status
  cluster:
    id:     9016340d-7f90-4634-9877-aadc927c4e81
    health: HEALTH_WARN
            mons are allowing insecure global_id reclaim
            clock skew detected on mon.b

  services:
    mon: 3 daemons, quorum a,b,c (age 3m)
    mgr: a(active, since 44m)
    osd: 3 osds: 3 up (since 38m), 3 in (since 38m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 57 GiB / 60 GiB avail
    pgs:     1 active+clean

常用命令:

ceph status
ceph osd status
ceph df 
rados df

3.7 配置 ceph dashboard

默認的 ceph 已經安裝的 ceph-dashboard,但是其 svc 地址爲 service clusterIP,並不能被外部訪問

kubectl apply -f dashboard-external-https.yaml

創建 NodePort 類型就可以被外部訪問了

[root@k8s-master01 ~]# kubectl get svc -n rook-ceph|grep dashboard
rook-ceph-mgr-dashboard                  ClusterIP   192.168.204.219   <none>        8443/TCP            49m
rook-ceph-mgr-dashboard-external-https   NodePort    192.168.34.227    <none>        8443:32529/TCP      49m

瀏覽器訪問 (master01-ip 換成自己的集羣 ip):

https://master01-ip:32529/#/login?returnUrl=%2Fdashboard

用戶名默認是 admin,至於密碼可以通過以下代碼獲取:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"|base64 --decode && echo

4 刪除集羣並清除數據

4.1 刪除 Cephcluster CRD

kubectl -n rook-ceph delete cephcluster rook-ceph

確認上一步刪除之後,查詢一下

kubectl -n rook-ceph get cephcluster

4.2 刪除 Operator 和相關的資源

kubectl delete -f operator.yaml
kubectl delete -f common.yaml
kubectl delete -f crds.yaml

4.3 刪除主機上的數據

rook 創建 cluster 的時候會把部分數據卸載本機的 / var/lib/rook(dataDirHostPath 指定的目錄) 中,如果不刪除會影響下次集羣部署,rook 據說下個版本會增加 k8s 本地存儲調用的功能,就不會直接存在硬盤上了

rm -rf /var/lib/rook

4.4 擦除硬盤上的數據

創建 osd 時被寫入了數據,需要擦除,否則無法再次創建 ceph 集羣,腳本中有各種硬盤的擦除命令,不需要全部執行成功,根據當前機器的硬盤情況確定。

vim clean-ceph.sh

#!/usr/bin/env bash
DISK="/dev/vdb"

sgdisk --zap-all $DISK

dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync

blkdiscard $DISK

ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %

rm -rf /dev/ceph-*
rm -rf /dev/mapper/ceph--*

5 FAQ

5.1 卸載刪除 ceph-rook,kubectl get ns ,rook-ceph 顯示未 Terminating,無法刪除

NAMESPACE=rook-ceph

kubectl proxy &

kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json

curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize

5.2 卸載 osd 或者卸載集羣另外一個後遺症,rook-ceph 名稱空間刪除了,但是 cephcluster 無法刪除

#查看名稱空間,已經刪除
[root@k8s-master01 ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   22h
kube-node-lease   Active   22h
kube-public       Active   22h
kube-system       Active   22h
#查看集羣依然存在
[root@k8s-master01 ~]# kubectl -n rook-ceph get cephcluster
NAME        DATADIRHOSTPATH MONCOUNT AGE PHASE       MESSAGE                HEALTH
rook-ceph   /var/lib/rook   3        20h Progressing Configuring Ceph Mons
[root@k8s-master01 ~]# kubectl api-resources --namespaced=true -o name|xargs -n 1 kubectl get --show-kind --ignore-not-found -n rook-ceph
Error from server (MethodNotAllowed): the server does not allow this method on the requested resource
NAME                         TYPE                                  DATA   AGE
secret/default-token-lz6wh   kubernetes.io/service-account-token   3      8m34s
NAME                     SECRETS   AGE
serviceaccount/default   1         8m34s
Error from server (MethodNotAllowed): the server does not allow this method on the requested resource
NAME                                 DATADIRHOSTPATH   MONCOUNT   AGE   PHASE         MESSAGE                 HEALTH
cephcluster.ceph.rook.io/rook-ceph   /var/lib/rook     3          20h   Progressing   Configuring Ceph Mons   

#解決辦法:
kubectl edit  cephcluster.ceph.rook.io -n rook-ceph
把finalizers的值刪掉,cephcluster.ceph.rook.io便會自己刪除

5.3 打開 dashboard 顯示 HEALTH_WARN 警告

進入 ceph-tools 執行以下命令:

ceph config set mon auth_allow_insecure_global_id_reclaim false

其他常見警告解決鏈接:

https://docs.ceph.com/en/octopus/rados/operations/health-checks/

雲原生技術社區 雲原生技術社區爲 CNBPA 雲原生技術實踐聯盟旗下技術社區,專注雲原生前沿技術和落地實踐的佈道。分享容器、Kubernetes、DevOps、Service Mesh 等雲原生技術乾貨、案例、活動 / Meetup 信息,及 CNBPA 聯盟動態等。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/4EGwsE9Gzl21VQtN8TDK8A