การลบ/แทนที่ OSD ใน Rook Ceph


กรณีที่อุปกรณ์ (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 ใหม่ขึ้นมาโดยอัตโนมัติ

อ้างอิง

แสดงความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *