
กรณีที่อุปกรณ์ (HDD, SSD, ฯลฯ) ล้มเหลว จะต้องลบ OSD ของอุปกรณ์ที่มีปัญหาออก อาการหนึ่งของอุปกรณ์ล้มเหลวที่สังเกตได้คือ pod
ของ OSD ที่จัดการอุปกรณ์นั้น มี STATUS
เป็น CrashLoopBackoff
เมื่อใช้คำสั่ง kubectl -n rook-ceph get pod -l app=rook-ceph-osd

pod
ของ osd.0
ที่มีสถานะเป็น CrashLoopBackOff
โดยบทความนี้จะอธิบายถึงขั้นตอนในการลบ OSD ออกจากคลัสเตอร์
ข้อควรระวัง
- ตรวจสอบให้แน่ใจว่าถ้าเนื้อที่เหลือเพียงพอหลังนำ OSD อันเดิมออก
- ตรวจสอบให้แน่ใจว่า OSD และ PG ที่เหลือมีสถานะ healthy เพื่อให้สามารถ rebalance ได้
- อย่านำ OSD จำนวนมากออกพร้อมกันในคราวเดียว
- รอการ rebalance ให้เสร็จก่อนที่จะเพิ่ม OSD ชุดถัดไป
นำอุปกรณ์ที่มีปัญหาออกจาก CephCluster
(หากตั้ง useAllDevices: true
ใน CephCluster
ไว้ ให้ข้ามขั้นตอนนี้)
แก้ไข CephCluster
โดยนำรายการอุปกรณ์ที่มีปัญหาออก ด้วยคำสั่ง
kubectl -n rook-ceph edit CephCluster rook-ceph
บทความนี้จะยกตัวอย่าง OSD ที่มีปัญหา คือ osd.0
ซึ่งใช้อุปกรณ์ sdb
ที่อยู่ในโนด worker01.k8s.example.com
เพราะฉะนั้น เราจะแก้ไข CephCluster
จาก
spec:
...
storage:
nodes:
- config:
deviceClass: vsan
deviceFilter: ^sd.
name: worker01.k8s.example.com
resources: {}
ให้ยกเว้น sdb
ดังนี้
spec:
...
storage:
nodes:
- config:
deviceClass: vsan
deviceFilter: ^sd[^b]
name: worker01.k8s.example.com
resources: {}
หมายเหตุ: การตั้งค่าอาจแตกต่างกันไปในแต่ละคลัสเตอร์
ปิด Rook Operator
กรณีที่ใช้ Host-based cluster ให้ปิด Rook Operator เพื่อป้องกันไม่ให้ Rook Operator นำอุปกรณ์ที่มีปัญหากลับเข้าไปในคลัสเตอร์ โดยใช้คำสั่ง
kubectl -n rook-ceph scale deployment rook-ceph-operator --replicas=0
ลบ OSD
ควรลองลบ OSD ด้วยวิธีสร้าง job ก่อน หากไม่สำเร็จจึงลบ OSD ด้วยตนเอง
ลบ OSD ด้วยวิธีสร้าง job
ดาวน์โหลดไฟล์ osd-purge.yaml
มา จากนั้นเปิดไฟล์เพื่อแก้ไข <OSD-IDs>
ให้เป็นหมายเลข OSD ที่ต้องการลบ เช่น 0
จากนั้นใช้คำสั่ง
kubectl create -f osd-purge.yaml
จากนั้นตรวจสอบสถานะโดยใช้คำสั่ง
kubectl -n rook-ceph logs -f -l app=rook-ceph-purge-osd
ถ้าลบสำเร็จแล้ว (หรือไม่สำเร็จ) ให้ปิดการทำงานของ job โดยใช้คำสั่ง
kubectl delete -f osd-purge.yaml
กรณีที่ลบไม่สำเร็จ จะต้องเข้าไปลบด้วยตนเอง ตามรายละเอียดในหัวข้อถัดไป
ลบ OSD ด้วยตนเอง
กรณีที่จะลบ OSD ด้วยตนเอง ให้เข้าไปใน Rook Toolbox โดยใช้คำสั่ง
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
จากนั้นรันคำสั่งดังต่อไปนี้
ceph osd out osd.<ID>
ceph status # ดูเรื่อย ๆ จนกว่า PG ทั้งหมดเป็น active+clean หมดแล้ว จึงจะใช้คำสั่งต่อไป
ceph osd purge <ID> --yes-i-really-mean-it
ceph osd tree # ดูว่า osd ถูกลบไปแล้ว
ลบ Deployment ของ OSD เดิมออก
(ถ้าตั้ง removeOSDsIfOutAndSafeToRemove: true
ใน CephCluster
ไว้ ให้ข้ามขั้นตอนนี้)
ลบ deployment ของ OSD เดิมออก โดยใช้คำสั่ง
kubectl delete deployment -n rook-ceph rook-ceph-osd-<ID>
ล้างข้อมูลในอุปกรณ์เดิม
ถ้าอุปกรณ์เดิมยังใช้ได้อยู่ ให้ล้างข้อมูลโดย ssh เข้าไปในโนดแล้วใช้คำสั่งต่อไปนี้
export DISK="/dev/sdX" # เปลี่ยน sdX ให้เป็นชื่ออุปกรณ์ที่ถูกต้อง
wipefs -af $DISK
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync
blkdiscard $DISK # เฉพาะกรณีที่เป็น SSD
partprobe $DISK
เปิด Rook Operator
กรณีที่ใช้ Host-based cluster ให้เปิด Rook Operator โดยใช้คำสั่ง
kubectl -n rook-ceph scale deployment rook-ceph-operator --replicas=1
เพิ่มอุปกรณ์ทดแทนเข้าไปใน CephCluster
(หากตั้ง useAllDevices: true
ใน CephCluster
ไว้ ให้ข้ามขั้นตอนนี้)
แก้ไข CephCluster
โดยเพิ่มอุปกรณ์ที่ติดตั้งเข้ามาใหม่ (หรืออุปกรณ์เดิมที่ผ่านการล้างข้อมูลแล้ว) ด้วยคำสั่ง
kubectl -n rook-ceph edit CephCluster rook-ceph
และแก้ไขให้ CephCluster
มองเห็นอุปกรณ์ที่ติดตั้งเข้ามาใหม่ เช่น จากเดิมที่เรายกเว้นอุปกรณ์ sdb
ในโนด worker01.k8s.example.com
:
spec:
...
storage:
nodes:
- config:
deviceClass: vsan
deviceFilter: ^sd[^b]
name: worker01.k8s.example.com
resources: {}
แก้ไข deviceFilter
ให้กลับมาตรวจจับอุปกรณ์ที่มีชื่อ sd?
เหมือนเดิม
spec:
...
storage:
nodes:
- config:
deviceClass: vsan
deviceFilter: ^sd.
name: worker01.k8s.example.com
resources: {}
หลังจากผ่านไปสักพัก rook-ceph-operator
จะมองเห็นอุปกรณ์ใหม่ และเพิ่มเข้าไปในคลัสเตอร์โดยอัตโนมัติ
หากเวลาผ่านไปนานแล้วแต่ยังไม่มีการสร้าง pod
ของ OSD ใหม่ขึ้นมา ให้ลบ pod
ของ Rook Operator โดยใช้คำสั่ง
kubectl -n rook-ceph delete pod -l app=rook-ceph-operator
หมายเหตุ: pod
ของ Rook Operator ถูกสร้างขึ้นมาโดย deployment
เพราะฉะนั้น ทันทีที่เราลบ pod
Kubernetes จะสร้าง pod
ใหม่ขึ้นมาโดยอัตโนมัติ