K8s 上的分佈式存儲集羣搭建(Rook-ceph)
作者:王三歲
靈雀雲後端工程師
1 環境準備
1.1 基礎環境
-
3 臺配置一致的虛擬機:
-
虛擬機配置:4c 8g
-
虛擬機操作系統:cents7
-
硬盤:vda:40G vdb:20G
-
Kubernete 版本:1.20.0
-
Docker 版本:20.10.7
默認 k8s 已安裝完成,採用 kubeadm 容器化安裝
1.2 所安裝 rook/ceph 版本:
ceph:v15.2.11
rook:1.6.3
1.3 前提
-
正常運行的多節點 k8s 集羣,兩個子節點及以上
-
rook 的版本大於 1.3,無法使用目錄創建集羣,要使用單獨的裸盤進行創建,也就是創建一個新的磁盤,掛載到宿主機,不進行格式化,直接使用即可。檢查步驟:
lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
vda
└─vda1 xfs 6f15c206-f516-4ee8-a4b7-89ad880647db /
vdb
-
FSTYPE 爲空的磁盤爲可用磁盤,該磁盤需要清除數據(不能格式化)。
-
做這個實驗需要高配置,每個子節點配置不能低於 2 核 4G,主節點不低於 4 核 8G
2 搭建流程
2.1Rook 是什麼?
-
Rook 本身並不是一個分佈式存儲系統,而是利用 Kubernetes 平臺的強大功能,通過 Kubernetes Operator 爲每個存儲提供商提供服務。它是一個存儲 “編排器”,可以使用不同的後端(例如 Ceph、EdgeFS 等)執行繁重的管理存儲工作,從而抽象出很多複雜性。
-
Rook 將分佈式存儲系統轉變爲自我管理、自我擴展、自我修復的存儲服務。它自動執行存儲管理員的任務:部署、引導、配置、供應、擴展、升級、遷移、災難恢復、監控和資源管理
-
Rook 編排了多個存儲解決方案,每個解決方案都有一個專門的 Kubernetes Operator 來實現自動化管理。目前支持 Ceph、Cassandra、NFS。
-
目前主流使用的後端是 Ceph ,Ceph 提供的不僅僅是塊存儲;它還提供與 S3/Swift 兼容的對象存儲和分佈式文件系統。Ceph 可以將一個卷的數據分佈在多個磁盤上,因此可以讓一個卷實際使用比單個磁盤更多的磁盤空間,這很方便。當向集羣添加更多磁盤時,它會自動在磁盤之間重新平衡 / 重新分配數據。
2.2 ceph-rook 與 k8s 集成方式
-
Rook 是一個開源的 cloud-native storage 編排, 提供平臺和框架;爲各種存儲解決方案提供平臺、框架和支持,以便與雲原生環境本地集成。
-
Rook 將存儲軟件轉變爲自我管理、自我擴展和自我修復的存儲服務,它通過自動化部署、引導、配置、置備、擴展、升級、遷移、災難恢復、監控和資源管理來實現此目的。
-
Rook 使用底層雲本機容器管理、調度和編排平臺提供的工具來實現它自身的功能。
-
Rook 目前支持 Ceph、NFS、Minio Object Store 和 CockroachDB。
-
Rook 使用 Kubernetes 原語使 Ceph 存儲系統能夠在 Kubernetes 上運行
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