1. 程式人生 > 其它 >05 定製 Rook 叢集(轉載)

05 定製 Rook 叢集(轉載)

目錄

定製 Rook 叢集

placement 排程概述

  • rook 藉助 kubernetes 的預設排程機制,Ceph 元件以 pods 的形式排程執行在 kubernetes 節點中
  • 然而每個節點因⻆色的不同,其機器的配置也有所不同
  • 比如 mdsCPU 計算要求較高,磁碟次之
  • 相反 osd 節點則對磁碟和記憶體要求較高,CPU 次之
  • 因此在規劃的時候需要根據覺得的不同而分配節點

最終效果:根據規劃來分配⻆色

rook 提供了多種排程策略

  • nodeAffinity 節點親和力排程,根據labels選擇合適的排程節點
  • podAffinity pods 親和力排程,將pods排程到具有相同性質型別的節點上
  • podAntiAffinity pods 反親和排程,將pods排程到與某些pods相反的節點
  • topologySpreadConstraints 拓撲選擇排程
  • tolerations 汙點容忍排程,允許排程到某些具有“汙點”的節點上

rook 支援的排程物件

  • mon
  • mgr
  • osd
  • cleanup

清理重建 rook 叢集

參考文件

刪除資源物件

[root@m1 ceph]# kubectl delete -f cluster.yaml
[root@m1 ceph]# kubectl delete -f operator.yaml
[root@m1 ceph]# kubectl delete -f common.yaml
[root@m1 ceph]# kubectl delete -f crds.yaml

刪除 rook 源資料目錄

[root@m1 ceph]# ansible all -m shell -a "rm -rf /var/lib/rook/"
n2 | CHANGED | rc=0 >>

n1 | CHANGED | rc=0 >>

n4 | CHANGED | rc=0 >>

n3 | CHANGED | rc=0 >>

m1 | CHANGED | rc=0 >>

[root@m1 ceph]# ls /var/lib/rook/
ls: cannot access /var/lib/rook/: No such file or directory

清理磁碟資訊,登陸到每個節點上,將 vgspv 刪除

如果存在需要刪除,此次清理 Rook 叢集無殘留項,無需執行

[root@node-1 ~]# vgremove ceph-1a17705e-abd6-4b9d-8eee-d0f57a62801a --yes #通過 vgs可以檢視
[root@node-1 ~]# pvremove /dev/vdb

刪除 devicemapper 對映,登陸到每個節點上,將 devicemapper 刪除

  • 刪除 m1 節點的 /mnt/ 掛載
[root@m1 ceph]# umount /mnt/
  • 刪除 devicemapper
[root@m1 ceph]# dmsetup ls
ceph--7d042c98--859f--4f48--9c9a--f6a2a39879fe-osd--block--43177789--5a9b--43bd--9d12--78896689215a     (253:2)
centos-swap     (253:1)
centos-root     (253:0)

[root@m1 ~]# dmsetup remove --force ceph--7d042c98--859f--4f48--9c9a--f6a2a39879fe-osd--block--43177789--5a9b--43bd--9d12--78896689215a

[root@m1 ~]# dmsetup ls
centos-swap     (253:1)
centos-root     (253:0)

# 格式化磁碟資料
[root@m1 ceph]# dd if=/dev/zero of=/dev/sdb bs=1G count=50

刪除 rook-ceph 名稱空間

如果存在需要刪除,此次清理 Rook 叢集直接刪除了 rook-ceph 名稱空間

參考文件

由於一些資源物件未能刪除,導致 rook-ceph 這個名稱空間無法刪除,解決方法可以找到 cephclusters.ceph.rook.io 自定義資源中的finalizers刪除

[root@m1 ~]# kubectl edit customresourcedefinitions.apiextensions.k8s.io

cephclusters.ceph.rook.io
...省略...
    finalizers:
    - kubernetes

定製 mon 排程引數

背景:生產環境有一些專⻔的節點用於 mon、mgr,儲存節點節點使用單獨的節點承擔,利用排程機制實現

122   placement:
123     mon:
124       nodeAffinity:
125         requiredDuringSchedulingIgnoredDuringExecution:
126           nodeSelectorTerms:
127           - matchExpressions:
128             - key: ceph-mon
129               operator: In
130               values:
131               - enabled

#設定磁碟的引數,調整為false,方便後面定製
185   storage: # cluster level storage configuration and selection
186     useAllNodes: false
187     useAllDevices: false

分別給節點打上標籤

[root@m1 ceph]# kubectl label node 192.168.100.133 ceph-mon=enabled
node/192.168.100.133 labeled
[root@m1 ceph]# kubectl label node 192.168.100.134 ceph-mon=enabled
node/192.168.100.134 labeled
[root@m1 ceph]# kubectl label node 192.168.100.135 ceph-mon=enabled
node/192.168.100.135 labeled

[root@m1 ceph]# kubectl get nodes --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.100.133   Ready    master   28h   v1.20.5   ...,ceph-mon=enabled,...
192.168.100.134   Ready    node     28h   v1.20.5   ...,ceph-mon=enabled,...
192.168.100.135   Ready    node     28h   v1.20.5   ...,ceph-mon=enabled,...
192.168.100.136   Ready    node     28h   v1.20.5   ......
192.168.100.137   Ready    node     28h   v1.20.5   ......

定製 mgr 排程引數

修改 mgr 的排程引數,修改完之後重新 kubectl apply -f cluster.yaml 配置使其載入到叢集中

122   placement:
123     mon:
            ......
132     mgr:
133       nodeAffinity:
134         requiredDuringSchedulingIgnoredDuringExecution:
135           nodeSelectorTerms:
136           - matchExpressions:
137             - key: ceph-mgr
138               operator: In
139               values:
140               - enabled
  • 部署 rook 叢集
[root@m1 ceph]# kubectl apply -f crds.yaml 
[root@m1 ceph]# kubectl apply -f common.yaml 
[root@m1 ceph]# kubectl apply -f operator.yaml

[root@m1 ceph]# kubectl get ns
NAME              STATUS   AGE
default           Active   28h
kube-node-lease   Active   28h
kube-public       Active   28h
kube-system       Active   28h
rook-ceph         Active   22s
[root@m1 ceph]# kubectl -n rook-ceph get pods
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7fdf75bb9d-7p695   1/1     Running   0          15s


[root@m1 ceph]# kubectl apply -f cluster.yaml

mon 節點排程到了對應的 m1,n1,n2 節點上

mgr 節點此時排程會失敗,給 m1n1 打上 ceph-mgr=enabled 的標籤

[root@m1 ceph]# kubectl label node 192.168.100.133 ceph-mgr=enabled
[root@m1 ceph]# kubectl label node 192.168.100.134 ceph-mgr=enabled

[root@m1 ceph]# kubectl get nodes --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.100.133   Ready    master   28h   v1.20.5   ...,ceph-mgr=enabled,ceph-mon=enabled,...
192.168.100.134   Ready    node     28h   v1.20.5   ...,ceph-mgr=enabled,ceph-mon=enabled,...
192.168.100.135   Ready    node     28h   v1.20.5   ...,ceph-mon=enabled,...
192.168.100.136   Ready    node     28h   v1.20.5   ......
192.168.100.137   Ready    node     28h   v1.20.5   ......

定製 osd 儲存節點

rook 預設會使用所有節點上的所有滿足條件的磁碟,並將其加入到 Ceph 叢集中作為 osd ⻆色,生產環境中磁碟有特定的功能和⻆色,需要根據磁碟型別來分配。同時生產中擴容會涉及到資料的均衡 (rebalance) 操作,因此需要在低峰期或者單次擴容較少的 osd ,避免擴容對生產業務造成影響

194   storage: # cluster level storage configuration and selection
195     useAllNodes: false
196     useAllDevices: false
        ......
207     nodes:
208     - name: "m1"
209       devices: 
210       - name: "sdb"
211         config:
212           storeType: bluestore
213           journalSizeMB: "4096"
214     - name: "n1"
215       devices:
216       - name: "sdb"
217         config:
218           storeType: bluestore
219           journalSizeMB: "4096"
220     - name: "n2"
221       devices:
222       - name: "sdb"
223         config:
224           storeType: bluestore
225           journalSizeMB: "4096"
226     - name: "n3"
227       devices:
228       - name: "sdb"
229         config:
230           storeType: bluestore
231           journalSizeMB: "4096"

修改配置完畢後重新 kubectl apply -f cluster.yaml ,會根據預先設定內容建立 osd

定製 osd 排程引數

結合排程演算法,將滿足條件的節點分配到特定節點上,同時使用節點上特定的磁碟

設定 osd 的排程引數

207     nodes:
        ......
232     - name: "192.168.100.137"
233       devices:
234       - name: "sdb"
235         config:
236           storeType: bluestore
237           journalSizeMB: "4096"

定製 osd 的磁碟引數

122   placement:
        ......
141     osd:
142       nodeAffinity:
143         requiredDuringSchedulingIgnoredDuringExecution:
144           nodeSelectorTerms:
145           - matchExpressions:
146             - key: ceph-osd
147               operator: In
148               values:
149               - enabled

重新 kubectl apply -f cluster.yaml 發現 n4 無法加入到叢集中,因為不滿足排程的引數,新增標籤使其滿足排程,同理將其他儲存節點打上 ceph-osd 的標籤(存量的暫時先不設定,後續調整磁碟引數後檢視效果)

[root@m1 ceph]# kubectl -n rook-ceph logs -f rook-ceph-operator-795594f4b4-n59s7
......
2022-11-24 03:31:57.376559 I | op-osd: no volume sources defined to configure OSDs on PVCs.
2022-11-24 03:31:57.376574 I | op-osd: start provisioning the osds on nodes, if needed
2022-11-24 03:31:57.571258 I | op-osd: 0 of the 5 storage nodes are valid
2022-11-24 03:31:57.571274 W | op-osd: no valid nodes available to run osds on nodes in namespace rook-ceph
2022-11-24 03:31:57.571278 I | op-osd: start osds after provisioning is completed, if needed
2022-11-24 03:31:57.601027 I | op-mgr: successful modules: prometheus
2022-11-24 03:31:58.629896 I | op-mgr: successful modules: balancer
2022-11-24 03:31:58.641230 I | op-mgr: successful modules: mgr module(s) from the spec
2022-11-24 03:31:58.681946 I | cephclient: successfully disallowed pre-octopus osds and enabled all new octopus-only functionality
2022-11-24 03:31:58.681965 I | op-osd: completed running osds in namespace rook-ceph
[root@m1 ceph]# kubectl label node 192.168.100.137 ceph-osd=enabled
node/192.168.100.137 labeled

定製資源限制

預設元件沒有設定資源分配,當出現資源爭搶的時候可能會出現驅逐,為了保證 Ceph 的核心元件能分配
到特定的資源,需要設定合理的資源分配

  • mon,記憶體推薦128G
  • mds
  • osd,每T磁碟建議需要有4G

確保元件能夠分配到足夠的資源

180   resources:
182     mon:
183       limits:
184         cpu: "300m"
185         memory: "512Mi"
186       requests:
187         cpu: "300m"
188         memory: "512Mi"
189     mgr:
190       limits:
191         cpu: "300m"
192         memory: "512Mi"
193       requests:
194         cpu: "300m"
195         memory: "512Mi"
196     osd:
197       limits:
198         cpu: "300m"
199         memory: "512Mi"
200       requests: 
201         cpu: "300m"
202         memory: "512Mi"

osd 啟動失敗排障

修改完資源配置之後, osd 會自動重啟以載入配置檔案內容, osd 啟動失敗,可以通過檢視 pods 日誌檔案內容定位

[root@m1 ceph]# kubectl -n rook-ceph logs rook-ceph-osd-4-566f4c5b4d-fqf5q 

檢視發現有大量堆疊導致的異常,修改 osd 的資源分配後重新 kubectl apply -f cluster.yaml 啟動正常

180   resources:
        ......
196     osd:
197       limits:
198         cpu: "1000m"
199         memory: "2048Mi"
200       requests: 
201         cpu: "1000m"
202         memory: "2048Mi"

健康檢查機制

kubernetes 預設提供了健康探測機制,通常包含有三種:

  • LivenessProbe 檢測是否存活
  • ReadinessProbe 檢測是否就緒
  • StartupProbe 檢測是否啟動

rook 提供了 daemonHealthlivenessProbe 健康探測機制,用於檢測守護程序和是否存活(用於 Ceph 內部檢測)

288   healthCheck:
289     daemonHealth:
290       mon:
291         disabled: false
292         interval: 45s
293       osd:
294         disabled: false
295         interval: 60s
296       status:
297         disabled: false
298         interval: 60s
299     # Change pod liveness probe, it works for all mon,mgr,osd daemons
300     livenessProbe:
301       mon:
302         disabled: false
303       mgr:
304         disabled: false
305       osd:
306         disabled: false

mon 存活探測機制

[root@m1 ~]# kubectl -n rook-ceph get pods rook-ceph-mon-a-74d9684d88-8k4rb -o yaml
    ......
    livenessProbe:
      exec:
        command:
        - env
        - -i
        - sh
        - -c
        - ceph --admin-daemon /run/ceph/ceph-mon.a.asok mon_status
      failureThreshold: 3
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

mgr 存活探測機制

[root@m1 ~]# kubectl -n rook-ceph get pods rook-ceph-mgr-a-8496fc5676-dtzkr -o yaml
    ......
    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /
        port: 9283
        scheme: HTTP
      initialDelaySeconds: 60
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

osd 存活探測機制

[root@m1 ~]# kubectl -n rook-ceph get pods rook-ceph-osd-1-6ff76dc6df-9k9fg -o yaml
    ......
    livenessProbe:
      exec:
        command:
        - env
        - -i
        - sh
        - -c
        - ceph --admin-daemon /run/ceph/ceph-osd.1.asok status
      failureThreshold: 3
      initialDelaySeconds: 45
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

如上的 livenessProbe 存活探測機制是根據開關設定開啟的探測方法,不同的⻆色其探測的方式有所區別。