สำหรับระบบงานที่เป็นระบบแบบกระจาย (distributed system) หรือเป็นระบบที่มีคุณสมบัติเกี่ยวกับการทำสำเนาข้อมูล (replication) อยู่แล้ว เราอาจจะจัดเก็บข้อมูลโดยใช้คุณสมบัติ Local Persistent Volumes ของ Kubernetes หรือใช้ Local Path Provisioner เพื่อจัดเก็บข้อมูลของแต่ละ Pod ไว้ให้กระจายไปตามโนดของคลัสเตอร์ได้ แต่สำหรับระบบงานทั่วไปที่ไม่มีกลไกเหล่านี้ การจัดเก็บข้อมูลไว้บนโนดใดโนดหนึ่งมีความเสี่ยงที่ข้อมูลจะสูญหายเมื่อโนดที่ใช้เก็บข้อมูลนั้น ๆ ล้มเหลว ส่งผลให้ระบบงานหยุดชะงัก เราจึงจำเป็นต้องเลือกวิธีเก็บข้อมูลอื่นที่มีกลไกสำหรับลดความเสี่ยงดังกล่าว ซึ่งการติดตั้งและใช้งาน Rook Ceph บน Kubernetes Cluster ก็เป็นวิธีหนึ่งที่ช่วยป้องกันไม่ให้ระบบงานหยุดชะงักเมื่อมีโนดใดโนดหนึ่งล้มเหลวได้
คำเตือน: เป้าหมายของการนำ Rook Ceph มาใช้ คือ เพื่อให้ระบบงานสามารถทำงานได้อย่างต่อเนื่อง ไม่หยุดชะงักเมื่อมีโนดใดโนดหนึ่งล้มเหลวเท่านั้น ไม่สามารถใช้เพื่อทดแทนการสำรองข้อมูล (backup) ได้
Ceph คืออะไร
Ceph เป็นระบบจัดเก็บข้อมูลแบบกระจาย (distributed storage system) โอเพนซอร์สที่สามารถนำมาติดตั้งและใช้งานกับเครื่องคอมพิวเตอร์หรือเครื่องแม่ข่ายทั่วไปแบบไม่เจาะจงยี่ห้อได้ โดย Ceph จะใช้อัลกอริทึม CRUSH (Controlled Replication Under Scalable Hashing) เพื่อเลือกว่าจะอ่าน/เขียนข้อมูลลงบน ฮาร์ดดิสก์ โนด ตู้แร็ค หรือศูนย์ข้อมูลใด โดยมีจุดเด่นคือทนทานต่อการเปลี่ยนแปลงของจำนวนอุปกรณ์ที่ใช้จัดเก็บข้อมูล ต่างจากวิธีกระจายการจัดเก็บข้อมูลด้วยแฮชอย่างง่าย (simple hash-based distribution) ที่มักจะต้องย้ายข้อมูลใหม่ทั้งหมดเมื่อมีการ เพิ่ม/ลด หรือเกิดการล้มเหลวของอุปกรณ์จัดเก็บข้อมูล ในขณะที่อัลกอริทึม CRUSH จะเคลื่อนย้ายข้อมูลเท่าที่จำเป็นเท่านั้น
Ceph รองรับส่วนต่อประสาน (interface) 3 รูปแบบ ได้แก่ RADOS Block Device, Ceph File System, และ Ceph Object Gateway รายละเอียดดังนี้
- RADOS Block Device : RBD เป็นการต่อประสานเพื่อให้บริการพื้นที่จัดเก็บข้อมูลแบบบล็อก (block storage) เหมาะสำหรับระบบงานที่ต้องการพื้นที่จัดเก็บข้อมูลประสิทธิภาพสูง เช่น ระบบจัดการฐานข้อมูล ตัวอย่างส่วนต่อประสานที่มีลักษณะเดียวกัน ได้แก่ Fibre Channel : FC และ Internet Small Computer Systems Interface : iSCSI เป็นต้น
- Ceph File System : CephFS เป็นการต่อประสานเพื่อให้บริการพื้นที่จัดเก็บข้อมูลแบบระบบไฟล์ (file system storage) เหมาะสำหรับระบบแชร์ไฟล์ หรือระบบที่มีการทำงานร่วมกัน ตัวอย่างส่วนต่อประสานที่มีลักษณะเดียวกัน ได้แก่ Network File System : NFS, Common Internet File System : CIFS, และ Server Message Block : SMB เป็นต้น
- Ceph Object Gateway เป็นการต่อประสานเพื่อให้บริการพื้นที่จัดเก็บข้อมูลเชิงวัตถุ (object storage) เหมาะสำหรับระบบงานที่ต้องการความทนทานของข้อมูล (durability) และมีความต้องการขยายขนาด (scalability) หรือกระบวนการสำรองข้อมูล โดยในขณะที่เขียนบทความนี้ Ceph รองรับส่วนต่อประสาน 2 รูปแบบ คือ Amazon S3 และ OpenStack Swift
Rook คืออะไร
จากเอกสารการติดตั้ง Ceph มีวิธีติดตั้งที่แนะนำ 2 วิธี ได้แก่ Cephadm สำหรับการติดตั้งทั่วไป และ Rook สำหรับการติดตั้งเพื่อใช้งานร่วมกับ Kubernetes cluster ซึ่งบทความนี้จะแนะนำวิธีติดตั้งโดยใช้ Rook
คำอธิบายเกี่ยวกับ Rook ในเว็บไซต์ rook.io คือ เป็น Storage Operators for Kubernetes ซึ่งความหมายของ operator ตามศัพท์บัญญัติสำนักงานราชบัณฑิตยสภา หมายถึง ผู้ควบคุมเครื่อง จึงอาจแปลได้เป็น “ผู้ควบคุมที่จัดเก็บข้อมูลสำหรับ Kubernetes” โดย Rook จะทำหน้าที่ติดตั้ง ตั้งค่า และจัดการส่วนประกอบของ Ceph ที่จำเป็นให้เราโดยอัตโนมัติ ช่วยลดภาระของผู้ดูแลระบบเกี่ยวกับการจัดการ Ceph cluster
สิ่งที่ต้องจัดเตรียม
ฮาร์ดแวร์
ควรเครื่องแม่ข่ายอย่างน้อย 3 เครื่อง โดยในกรณีที่เป็นการจัดหาเครื่องแม่ข่ายใหม่ สามารถประมาณความต้องการ CPU และ RAM ได้จาก เอกสารแนะนำการจัดเตรียมฮาร์ดแวร์ของ Ceph เช่น หากเครื่องแม่ข่ายนั้นมี
- SSD 6 ลูก (ต้องรัน
ceph-osd
6 daemon) ใช้ RAM อย่างน้อย 2 * 6 = 12 GB ความเร็วรวม 3,000 MB/s ใช้ CPU อย่างน้อย 3,000/500 = 6 core - หากเป็นเครื่องที่จะใช้รัน
ceph-mon
ด้วย จำเป็นต้องใช้ RAM อย่างน้อย 2 GB และ CPU อย่างน้อย 2 core - หากเป็นเครื่องที่จะใช้รัน
ceph-mds
ด้วย (สำหรับ CephFS) จำเป็นต้องใช้ RAM อย่างน้อย 2 GB และ CPU อย่างน้อย 2 core
ควรจะเลือกเครื่องแม่ข่ายที่มี RAM อย่างน้อย 12 + 2 + 2 = 16 GB และมี CPU อย่างน้อย 6 + 2 + 2 = 10 core เป็นต้น
และควรเลือกใช้เครือข่ายที่รองรับปริมาณงาน (throughput) อย่างน้อย 10 Gb/s
ซอฟต์แวร์
ติดตั้งระบบปฏิบัติการที่ใช้ Linux kernel และเพิ่มเครื่องแม่ข่ายนั้นเข้าไปเป็นส่วนหนึ่งของ Kubernetes cluster
ติดตั้ง Helm
Helm เป็น package manager สำหรับ Kubernetes ที่ช่วยให้ติดตั้งระบบที่มีความซับซ้อนได้ง่ายขึ้น โดยให้ติดตั้งลงบนเครื่องคอมพิวเตอร์ของผู้ดูแลคลัสเตอร์ (เครื่องเดียวกันกับที่เราเข้าไปใช้คำสั่ง kubectl
) สำหรับวิธีติดตั้ง Helm สามารถศึกษาได้จากบทความ How To Install Helm On Ubuntu, Mac And Windows
ติดตั้ง Rook Ceph
การติดตั้ง Rook Ceph มีขั้นตอนหลัก ๆ 2 ขั้นตอน คือ ติดตั้ง operator และติดตั้ง cluster รายละเอียดดังนี้
ติดตั้ง operator
สร้างไฟล์ values-operator.yaml
ให้มีเนื้อหาดังนี้
enableDiscoveryDaemon: true
เพื่อเปิดการใช้งาน discovery daemon ซึ่งจะคอยค้นหาฮาร์ดดิสก์ใหม่เป็นระยะ เช่น ทุก ๆ 1 ชั่วโมง หากพบฮาร์ดดิสก์ใหม่ และเงื่อนตรงตาม deviceFilter
ที่ตั้งไว้ (หากมี) discovery daemon จะเพิ่มฮาร์ดดิสก์นั้นเข้ามาเป็นส่วนหนึ่งของ Ceph cluster โดยอัตโนมัติ
จากนั้นใช้คำสั่ง
helm repo add rook-release https://charts.rook.io/release
helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph -f values-operator.yaml
เพื่อติดตั้งและเริ่มการทำงานของ operator
ติดตั้ง cluster
สร้างไฟล์ values-cluster.yaml
ให้มีเนื้อหาดังนี้
toolbox:
enabled: true
เพื่อเปิดใช้งาน Rook Toolbox ซึ่งเป็นเครื่องมือสำหรับให้ผู้ดูแลคลัสเตอร์เข้าไปจัดการ Ceph cluster โดยใช้คำสั่ง เช่น ceph status
, ceph osd status
, ceph df
, rados df
, ฯลฯ
จากนั้นใช้คำสั่ง
helm install --create-namespace --namespace rook-ceph rook-ceph-cluster --set operatorNamespace=rook-ceph rook-release/rook-ceph-cluster -f values-cluster.yaml
เพื่อติดตั้งคลัสเตอร์ โดยค่าเริ่มต้นจะเป็นการสร้าง Ceph cluster ที่ใช้ทุกโนดที่มีใน Kubernetes cluster และสร้างบริการที่มีคุณสมบัติดังนี้
- Ceph block pool ที่ทำสำเนาข้อมูล 3 ชุด โดยสำเนาข้อมูลจะไม่อยู่ในเครื่องแม่ข่ายเครื่องเดียวกัน
- Ceph file system ที่ทำสำเนา metadata 3 ชุด และทำสำเนาข้อมูล 3 ชุด โดยสำเนาข้อมูลจะไม่อยู่ในเครื่องแม่ข่ายเครื่องเดียวกัน
- Ceph object store ที่ทำสำเนา metadata 3 ชุด และจัดเก็บข้อมูลแบบ erasure coding ที่มี data chunk 2 ชุด และ coding chunk อีก 1 ชุด
ซึ่งสามารถดูการตั้งค่าเริ่มต้น (default settings) ได้จากไฟล์ https://github.com/rook/rook/blob/v1.11.7/deploy/charts/rook-ceph-cluster/values.yaml และอ่านรายละเอียดการตั้งค่าได้จากเอกสาร Ceph Cluster Helm Chart หากต้องการแก้ส่วนใดจะต้องคัดลอกส่วนนั้นจากไฟล์ values.yaml
มาไว้ในไฟล์ values-cluster.yaml
และแก้ไขให้ตรงความต้องการก่อนที่จะใช้คำสั่ง helm install
เช่น หากต้องการใช้ Ceph ทำงานเฉพาะในโนดที่มี label role=storage-node
และมี taint storage-node
จะต้องแก้ไขไฟล์ values-cluster.yaml
ให้มีเนื้อหาดังนี้
toolbox:
enabled: true
cephClusterSpec:
placement:
all:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: role
operator: In
values:
- storage-node
podAffinity:
podAntiAffinity:
topologySpreadConstraints:
tolerations:
- key: storage-node
operator: Exists
หลังจากที่ใช้คำสั่ง helm install
แล้ว สามารถติดตามสถานะการติดตั้งระบบได้โดยใช้คำสั่งตามตัวอย่างด้านล่าง
$ kubectl -n rook-ceph get cephcluster
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH EXTERNAL FSID
rook-ceph /var/lib/rook 3 1d Ready Cluster created successfully HEALTH_OK 8******7-****-****-****-3**********6
ข้อความในคอลัมน์ MESSAGE จะแสดงสถานะการติดตั้งคลัสเตอร์ จากตัวอย่างด้านบนระบุว่า Cluster created successfully แสดงว่าติดตั้ง Ceph cluster เรียบร้อยแล้ว