Kubernetes儲存——rook-ceph
一、搭建 rook-ceph(叢集)版本:v6
1.1 服務規劃(4c3g)
k8s-master(k8s叢集) | k8s-node01(k8s叢集) | k8s-node02(k8s叢集) |
---|---|---|
192.168.99.1 | 192.168.99.2 | 192.168.99.3 |
1.2 掃描新磁碟
所有 k8s 節點另外準備一塊磁碟(裸盤)(/dev/sdb)
在所有節點新增1塊100GB的新磁碟:/dev/sdb,作為OSD盤,提供儲存空間,新增完成後掃描磁碟,確保主機能夠正常識別到:
$ for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done # 掃描 SCSI 匯流排並新增 SCSI 裝置 $ for scsi_device in $(ls /sys/class/scsi_device/); do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done # 重新掃描 SCSI 匯流排 $ lsblk # 檢視已新增的磁碟,能夠看到sdb說明新增成功
1.3 部署rook-ceph叢集
因為這裡k8s叢集只有三臺,所以必須配置k8s的master執行pod
[root@k8s-master ~]# kubectl describe node k8s-master |grep Taints Taints: node-role.kubernetes.io/k8s-master:NoSchedule # 檢視master表示不執行pod [root@k8s-master ~]# kubectl describe node k8s-master |grep Taints Taints: <none> # 檢視master表示執行pod [root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/k8s-master- # 讓master節點參與pod負載 [root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/k8s-master=:NoSchedule # 讓master節點恢復不參與pod負載
rook-ceph映象下載連結:https://pan.baidu.com/s/1SPK7K3NAWKhGTV_-A2tSOQ
提取碼:cjmx
$ https://github.com/rook/rook.git (https://gitee.com)
$ git clone https://gitee.com/huanhui/rook.git
$ git clone --single-branch --branch v1.6.7 https://github.com/rook/rook.git
# 根據自身網路情況,任選其中一種即可
$ cd rook/cluster/examples/kubernetes/ceph
# 進入對應的目錄
$ grep image operator.yaml # 檢視所需映象
$ grep image cluster.yaml
$ mkdir rook-ceph-images && cd rook-ceph-images
$ unzip '*.zip'
$ ls *tar |xargs -i docker load -i {} && docker images
$ rm -rf rook-ceph-images
# 離線匯入映象
$ kubectl create -f crds.yaml -f common.yaml -f operator.yaml
$ kubectl create -f cluster.yaml
# 修改cluster.yaml檔案
$ kubectl get pod -n rook-ceph -o wide
$ kubectl get deployment -n rook-ceph
$ kubectl get svc -n rook-ceph
1.4 配置ceph dashboard
在cluster.yaml檔案中預設已經啟用了ceph dashboard!
rook-ceph-mgr-dashboard監聽的埠是8443,建立nodeport型別的service以便叢集外部訪問!
$ cd ~/rook/cluster/examples/kubernetes/ceph
$ kubectl apply -f dashboard-external-https.yaml
$ kubectl get svc -n rook-ceph
rook-ceph-mgr-dashboard-external-https NodePort 10.105.9.199 <none> 8443:30077/TCP 13s
1.5 獲取dashboard登陸賬號、密碼
預設使用者名稱為:admin
$ kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
# 獲取密碼
1.6 部署 ceph toolbox
$ cd ~/rook/cluster/examples/kubernetes/ceph
$ kubectl apply -f toolbox.yaml
進入該pod,檢視ceph叢集狀態
[root@k8s-master ~]# kubectl exec -it rook-ceph-tools-78cdfd976c-z4ps4 -n rook-ceph /bin/bash
[root@rook-ceph-tools-78cdfd976c-z4ps4 /]# ceph -s
二、k8s使用 rook-ceph 的塊儲存
2.1 rook提供RBD服務
rook可以提供以下3型別的儲存:
- Block:Create block storage to be consumed by a pod
- Object:Create an object store that is accessible inside or outside the Kubernetes cluster
- Shared File System:Create a file system to be shared across multiple pods
2.2 使用rook-ceph的塊儲存
1、基於 CSI 驅動程式建立卷
2、基於 flex 驅動程式建立卷
1、此示例使用 CSI 驅動程式,它是 K8s 1.13 和更新版本的首選驅動程式。
2、flex 驅動程式(K8s 1.12 或更早版本需要)的儲存類
要基於 flex 驅動程式建立卷,確保通過 Ceph CSI 啟用了 flex 驅動程式。為此,您需要在您的操作員部署檔案
operator.yaml
中設定ROOK_ENABLE_FLEX_DRIVER
為true
,與 CSI 驅動程式相同。
注意:CSI 驅動程式,此示例要求每個節點至少有 1 個 OSD,每個 OSD 位於3 個不同的節點上。因為
failureDomain
設定為host
並且replicated.size
設定為3
。
在kubernetes叢集裡,要提供rbd塊裝置服務,需要有如下步驟:
1、建立 rbd-provisione
2、建立 pool
3、建立對應的 storageclass
4、使用rbd對應的storageclass建立pvc,然後動態申請pv
5、建立pod使用pv( 使用儲存 )
通過rook建立Ceph Cluster叢集之後,rook自身提供了rbd-provisioner服務,所以不需要再部署其provisioner(供應商,就是提供儲存的)。
2.2.1 使用CSI驅動程式
# 1、CSI 驅動程式 (2、3步驟可以直接使用下面命令執行)
$ kubectl create -f ~/rook/cluster/examples/kubernetes/ceph/csi/rbd/storageclass.yaml
# 2、flex 驅動程式
$ kubectl create -f cluster/examples/kubernetes/ceph/flex/storageclass.yaml
2.2.2 建立pool
# 建立一個自己的工作目錄
$ cd /root/rook/cluster/examples/kubernetes/ceph
$ mkdir my_yaml
$ cat > pool.yaml << EOF
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool # operator會監聽並建立一個pool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 3
requireSafeReplicaSize: true
EOF
$ kubectl apply -f pool.yaml
# 建立了一個名為 replicapool 的儲存池
apply執行完後,登入 ceph dashboard 介面上能看到對應的pool!
2.2.3 建立對應的storageclass
$ cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block # 這裡建立一個storage class, 在pvc中指定這個storage class即可實現動態建立PV
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
Pool: replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # 必須與rook-ceph叢集ns相同
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
csi.storage.k8s.io/fstype: ext4 # 指定卷的檔案系統型別。如果沒有指定,它將使用ext4
allowVolumeExpansion: true
reclaimPolicy: Delete # 不寫預設值為Delete,其他選項包括“保留(Retain)”、“回收(Recycle)”
EOF
如果您在“rook-ceph”以外的名稱空間中部署了 Rook operator ,請更改配置器中的字首以匹配您使用的名稱空間。例如,如果 Rook operator 在名稱空間“my-namespace”中執行,則供應商值應為“my-namespace.rbd.csi.ceph.com”。
$ kubectl apply -f storageclass.yaml
$ kubectl get storageclass
# 建立了一個名為 rook-ceph-block 的storageClass
2.2.4 建立pvc測試
$ cat > test-pvc.yaml << EOF
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
storageClassName: rook-ceph-block # 指定storage class
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi # 需要一個20G的盤
EOF
$ kubectl apply -f test-pvc.yaml
# 建立一個名為wp-pv-claim的pvc
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wp-pv-claim Bound pvc-8ca4b37a-bfdf-49eb-ad46-c39309115664 20Gi RWO rook-ceph-block 16s
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-8ca4b37a-bfdf-49eb-ad46-c39309115664 20Gi RWO Delete Bound default/wp-pv-claim rook-ceph-block 17s
kubectl exec -it rook-ceph-tools-656b876c47-2mffd -n rook-ceph /bin/bash #進入容器檢視相關資訊
[root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd showmapped
[root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd list replicapool
[root@rook-ceph-tools-78cdfd976c-5wpmv /]# rbd info -p replicapool xxxxxxx
2.2.5 清理塊建立的所有工件
$ kubectl delete -f test-pvc.yaml
$ kubectl delete -n rook-ceph cephblockpools.ceph.rook.io replicapool
$ kubectl delete storageclass rook-ceph-block
*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************