05 定製 Rook 叢集(轉載)
定製 Rook
叢集
placement
排程概述
-
rook
藉助kubernetes
的預設排程機制,Ceph
元件以pods
的形式排程執行在kubernetes
節點中 - 然而每個節點因⻆色的不同,其機器的配置也有所不同
- 比如
mds
對CPU
計算要求較高,磁碟次之 - 相反
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
清理磁碟資訊,登陸到每個節點上,將 vgs
和 pv
刪除
如果存在需要刪除,此次清理
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
節點此時排程會失敗,給m1
和n1
打上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
提供了 daemonHealth
和 livenessProbe
健康探測機制,用於檢測守護程序和是否存活(用於 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
存活探測機制是根據開關設定開啟的探測方法,不同的⻆色其探測的方式有所區別。