Giới thiệu về Rook
Rook là một giải pháp điều phối lưu trữ mã nguồn mở được thiết kế cho môi trường cloud-native. Dự án này cung nấp nền tảng và khung làm việc cho nhiều giải pháp lưu trữ khác nhau, cho phép tích hợp liền mạch với hệ sinh thái cloud-native.
Rook chuyển đổi phần mềm lưu trữ thành các dịch vụ tự quản lý, tự mở rộng và tự phục hồi. Dự án thực hiện điều này thông qua việc tự động hóa quá trình triển khai, khởi tạo, cấu hình, cung cấp, mở rộng, nâng cấp, di chuyển, khôi phục sau thảm họa, giám sát và quản lý tài nguyên.
Rook tận dụng các tính năng từ nền tảng quản lý container, lập lịch và điều phối cloud-native để thực hiện các nhiệm vụ của mình. Dự án tích hợp sâu vào môi trường cloud-native thông qua các điểm mở rộng, mang đến trải nghiệm liền mạch cho việc lập lịch, quản lý vòng đời, quản lý tài nguyên, bảo mật, giám sát và trải nghiệm người dùng.
Hướng dẫn sử dụng nhanh Cassandra
Cassandra là một NoSQL database phân tán với tính sẵn sàng cao, khả năng chịu lỗi và hiệu suất vượt trội. Hệ thống cung cấp khả năng mở rộng quy mô lớn mà không có điểm lỗi đơn lẻ, cùng với tính nhất quán có thể điều chỉnh.
Scylla là phiên bản viết lại gần như hoàn toàn bằng C++ của Cassandra, sử dụng kiến trúc không chia sẻ (shared-nothing) cho phép mở rộng tuyến tính thực sự và tối ưu hóa phần cứng, đạt được độ trễ cực thấp và throughput cao. Scylla tương thích hoàn toàn với giao diện Cassandra, do đó Rook cũng hỗ trợ nó.
Yêu cầu trước khi bắt đầu
Để chạy Rook Cassandra operator, bạn cần có một Kubernetes cluster. Đảm bảo rằng cluster đã được chuẩn bị sẵn sàng cho Rook - lưu ý rằng Cassandra không yêu cầu flexvolume plugin.
Triển khai Cassandra Operator
Sử dụng các lệnh sau để triển khai Rook Cassandra Operator:
git clone --single-branch --branch v1.6.8 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/cassandra
kubectl apply -f operator.yaml
Operator sẽ được cài đặt trong namespace rook-cassandra-system. Kiểm tra trạng thái của operator:
kubectl -n rook-cassandra-system get pod
Tạo và khởi tạo Cassandra/Scylla Cluster
Sau khi operator đã chạy, bạn có thể tạo Cassandra/Scylla cluster bằng cách tạo một instance của resource clusters.cassandra.rook.io. Bạn có thể tùy chỉnh các tham số trong file cluster.yaml theo nhu cầu.
Để tạo cluster:
kubectl create -f cluster.yaml
Kiểm tra các Kubernetes objects đã được tạo để đại diện cho cluster mới:
kubectl -n rook-cassandra get clusters.cassandra.rook.io
Để xác nhận tất cả các members đang chạy, kiểm tra số lượng pods khớp với số lượng được chỉ định trong cluster.yaml:
kubectl -n rook-cassandra get pod -l app=rook-cassandra
Theo dõi trạng thái của cluster:
kubectl -n rook-cassandra describe clusters.cassandra.rook.io rook-cassandra
Truy cập Database
Từ kubectl:
Để truy cập cqlsh trong cluster mới:
kubectl exec -n rook-cassandra -it rook-cassandra-east-1-east-1a-0 -- cqlsh
> DESCRIBE KEYSPACES;
Từ bên trong Pod:
Khi tạo cluster mới, Rook tự động tạo một service để client truy cập cluster. Service tuân theo quy ước đặt tên <cluster-name>-client. Kiểm tra service này:
kubectl -n rook-cassandra describe service rook-cassandra-client
Các Pods chạy trong Kubernetes cluster có thể kết nối đến Cassandra thông qua service này. Ví dụ sử dụng Python Driver:
from cassandra.cluster import Cluster
cluster = Cluster(['rook-cassandra-client.rook-cassandra.svc.cluster.local'])
session = cluster.connect()
Mở rộng quy mô (Scale Up)
Operator hỗ trợ mở rộng rack và thêm rack mới. Để thực hiện thay đổi:
kubectl edit clusters.cassandra.rook.io rook-cassandra
- Để mở rộng rack: thay đổi trường
Spec.Memberscủa rack - Để thêm rack mới: thêm rack mới vào danh sách racks với tên khác
Sau khi lưu file yaml, kiểm tra trạng thái cluster:
kubectl -n rook-cassandra describe clusters.cassandra.rook.io rook-cassandra
Thu nhỏ quy mô (Scale Down)
Operator cũng hỗ trợ thu nhỏ rack. Sử dụng cùng lệnh edit và thay đổi trường Spec.Members:
kubectl edit clusters.cassandra.rook.io rook-cassandra
kubectl -n rook-cassandra describe clusters.cassandra.rook.io rook-cassandra
Dọn dẹp tài nguyên
Để xóa tất cả tài nguyên liên quan đến demo này:
kubectl delete -f cluster.yaml
kubectl delete -f operator.yaml
Lưu ý: Thao tác này sẽ xóa database và tất cả dữ liệu liên quan.
Xử lý sự cố
Nếu cluster không xuất hiện, kiểm tra logs của operator trước:
kubectl -n rook-cassandra-system logs -l app=rook-cassandra-operator
Nếu logs của operator bình thường, kiểm tra logs của một instance Cassandra:
kubectl -n rook-cassandra logs rook-cassandra-0
Giám sát Cassandra
Để bật jmx_exporter cho cassandra rack, cần chỉ định tùy chọn jmxExporterConfigMapName trong CassandraCluster CRD:
apiVersion: cassandra.rook.io/v1alpha1
kind: Cluster
metadata:
name: my-cassandra
namespace: rook-cassandra
spec:
...
datacenter:
name: my-datacenter
racks:
- name: my-rack
members: 3
jmxExporterConfigMapName: jmx-exporter-settings
storage:
volumeClaimTemplates:
- metadata:
name: rook-cassandra-data
spec:
storageClassName: my-storage-class
resources:
requests:
storage: 200Gi
Ví dụ ConfigMap đơn giản để lấy metrics:
apiVersion: v1
kind: ConfigMap
metadata:
name: jmx-exporter-settings
namespace: rook-cassandra
data:
jmx_exporter_config.yaml: |
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["org.apache.cassandra.metrics:*"]
ConfigMap cần chứa key jmx_exporter_config.yaml với cấu hình jmx exporter. Khi ConfigMap được cập nhật, Pods không tự động reload - cần restart thủ công:
NAMESPACE=<namespace>
CLUSTER=<cluster_name>
RACKS=$(kubectl get sts -n ${NAMESPACE} -l "cassandra.rook.io/cluster=${CLUSTER}")
echo ${RACKS} | xargs -n1 kubectl rollout restart -n ${NAMESPACE}
Hướng dẫn sử dụng nhanh Ceph Storage
Hướng dẫn này sẽ giúp bạn thiết lập Ceph cluster cơ bản và sử dụng block, object và file storage từ các pods khác trong cluster.
Yêu cầu phiên bản tối thiểu
Rook hỗ trợ Kubernetes phiên bản v1.11 trở lên.
Quan trọng: Nếu sử dụng Kubernetes 1.15 hoặc cũ hơn, cần tạo CRD với phiên bản khác. Tham khảo file crds.yaml trong thư mục pre-k8s-1.16 của examples.
Yêu cầu tiên quyết
Để cấu hình Ceph storage cluster, cần ít nhất một trong các tùy chọn local storage sau:
- Thiết bị thô (không phân vùng, không định dạng) - yêu cầu cài đặt lvm2 hoặc tạo partition đầy đủ
- Phân vùng thô (không định dạng)
- Persistent volumes có sẵn trong storage class ở chế độ block
Kiểm tra xem phân vùng/thiết bị đã được định dạng filesystem chưa:
lsblk -f
Nếu trường FSTYPE không trống, thiết bị đã có filesystem. Có thể sử dụng thiết bị đó cho Ceph.
Cài đặt nhanh
Sử dụng lệnh kubectl và file yaml mẫu để tạo Rook cluster đơn giản:
git clone --single-branch --branch v1.6.8 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl create -f cluster.yaml
Cấu hình Cluster
Tài liệu Rook tập trung vào việc khởi động Rook trong môi trường production. Một số examples có thể được điều chỉnh cho môi trường test:
- cluster.yaml: Cấu hình cho production cluster chạy trên bare metal (tối thiểu 3 worker nodes)
- cluster-on-pvc.yaml: Cấu hình cho production cluster trong môi trường cloud động
- cluster-test.yaml: Cấu hình cho môi trường test như minikube
Triển khai Rook Operator
Bước đầu tiên là triển khai Rook operator:
cd cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl -n rook-ceph get pod
Trước khi khởi động Operator trong production, cần xem xét một số cấu hình:
- Nếu sử dụng Kubernetes v1.15 hoặc cũ hơn, tạo CRD từ
/cluster/examples/kubernetes/ceph/pre-k8s-1.16/crd.yaml - Xem xét bật một số tính năng mặc định bị vô hiệu hóa trong operator.yaml:
- Device discovery: Nếu bật
ROOK_ENABLE_DISCOVERY_DAEMON, Rook sẽ giám sát thiết bị mới - Flex driver: Đã bị deprecated, thay thế bằng CSI driver nhưng vẫn có thể bật qua
ROOK_ENABLE_FLEX_DRIVER - Node affinity and tolerations: Mặc định CSI driver chạy trên bất kỳ node nào
- Device discovery: Nếu bật
Tạo Rook Ceph Cluster
Sau khi Rook operator đang chạy, tạo Ceph cluster. Đảm bảo thiết lập dataDirHostPath phù hợp để cluster tồn tại sau khi restart:
kubectl create -f cluster.yaml
Liệt kê các pods trong namespace rook-ceph:
kubectl -n rook-ceph get pod
Số lượng OSD pods phụ thuộc vào số nodes và thiết bị được cấu hình. Nếu không sửa đổi cluster.yaml, mỗi node sẽ tạo một OSD.
Để xác nhận cluster khỏe mạnh, kết nối đến Rook toolbox và chạy lệnh ceph status:
- Tất cả monitors cần đạt quorum
- Manager cần ở trạng thái active
- Ít nhất một OSD ở trạng thái active
- Nếu trạng thái không phải
HEALTH_OK, cần kiểm tra warnings hoặc errors
ceph status
Các loại Storage
Rook cung cấp ba loại storage:
- Block Storage: Tạo block storage cho Pods
- Object Storage: Tạo object storage có thể truy cập từ trong hoặc ngoài Kubernetes cluster
- Shared Filesystem: Tạo filesystem chia sẻ giữa nhiều pods
Các tính năng bổ sung
- Ceph Dashboard: Giao diện web để xem trạng thái cluster
- Toolbox: Container với đầy đủ Ceph client để debug và troubleshoot
- Monitoring: Tích hợp sẵn collectors/exporters cho Prometheus
Xóa Cluster
Sau khi test xong, tham khảo hướng dẫn để cleanup cluster.
Hướng dẫn sử dụng nhanh NFS
NFS cho phép mount filesystem từ xa qua network và tương tác như thể được mount cục bộ. Điều này giúp admin tập trung tài nguyên trên server trung tâm.
Yêu cầu tiên quyết
- Cần có Kubernetes cluster để chạy Rook NFS operator
- Cần một PVC để gắn vào NFS server pod. Có thể sử dụng nhiều loại PVC như Host Path, AWS EBS, GCP Persistent Disk, CephFS, Ceph RBD...
- Package NFS client phải được cài đặt trên tất cả các nodes mà Kubernetes có thể chạy pods mount NFS. Cài đặt nfs-utils trên CentOS hoặc nfs-common trên Ubuntu.
Triển khai NFS Operator
Triển khai Rook NFS operator:
git clone --single-branch --branch v1.6.8 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/nfs
kubectl create -f common.yaml
kubectl create -f operator.yaml
Kiểm tra trạng thái operator:
kubectl -n rook-nfs-system get pod
Triển khai NFS Admission Webhook (Tùy chọn)
Admission webhooks là HTTP callbacks để nhận requests từ API server. NFS Operator hỗ trợ validation admission webhook để xác thực NFSServer objects trước khi lưu vào etcd.
Để bật admission webhook, đầu tiên cần cài đặt cert-manager:
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.1/cert-manager.yaml
Kiểm tra cert-manager đã chạy:
kubectl get -n cert-manager pod
Triển khai NFS webhook:
kubectl create -f webhook.yaml
kubectl -n rook-nfs-system get pod
Tạo Pod Security Policy (Khuyến nghị)
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: rook-nfs-policy
spec:
privileged: true
fsGroup:
rule: RunAsAny
allowedCapabilities:
- DAC_READ_SEARCH
- SYS_RESOURCE
runAsUser:
rule: RunAsAny
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
volumes:
- configMap
- downwardAPI
- emptyDir
- persistentVolumeClaim
- secret
- hostPath
Lưu file này với tên psp.yaml và tạo:
kubectl create -f psp.yaml
Tạo và khởi tạo NFS Server
Sau khi operator đang chạy, tạo NFS server bằng cách tạo một instance của resource nfsservers.nfs.rook.io.
Đầu tiên, tạo ServiceAccount và RBAC rules:
---
apiVersion: v1
kind: Namespace
metadata:
name: rook-nfs
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: rook-nfs-server
namespace: rook-nfs
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rook-nfs-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get"]
- apiGroups: ["policy"]
resources: ["podsecuritypolicies"]
resourceNames: ["rook-nfs-policy"]
verbs: ["use"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups:
- nfs.rook.io
resources:
- "*"
verbs:
- "*"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rook-nfs-provisioner-runner
subjects:
- kind: ServiceAccount
name: rook-nfs-server
namespace: rook-nfs
roleRef:
kind: ClusterRole
name: rook-nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
Lưu file này với tên rbac.yaml và tạo:
kubectl create -f rbac.yaml
Ví dụ sử dụng StorageClass mặc định
Ví dụ đầu tiên tạo NFS server sử dụng StorageClass mặc định của môi trường:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-default-claim
namespace: rook-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: nfs.rook.io/v1alpha1
kind: NFSServer
metadata:
name: rook-nfs
namespace: rook-nfs
spec:
replicas: 1
exports:
- name: share1
server:
accessMode: ReadWrite
squash: "none"
persistentVolumeClaim:
claimName: nfs-default-claim
annotations:
rook: nfs
Lưu file này với tên nfs.yaml và tạo:
kubectl create -f nfs.yaml
Ví dụ sử dụng XFS StorageClass
Rook NFS hỗ trợ disk quota thông qua xfs_quota. Tạo StorageClass với xfs filesystem và mount options prjquota:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-xfs
parameters:
type: pd-standard
fsType: xfs
mountOptions:
- prjquota
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
Sau đó tạo NFS server với PVC sử dụng StorageClass này:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-xfs-claim
namespace: rook-nfs
spec:
storageClassName: "standard-xfs"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: nfs.rook.io/v1alpha1
kind: NFSServer
metadata:
name: rook-nfs
namespace: rook-nfs
spec:
replicas: 1
exports:
- name: share1
server:
accessMode: ReadWrite
squash: "none"
persistentVolumeClaim:
claimName: nfs-xfs-claim
annotations:
rook: nfs
Lưu file này với tên nfs-xfs.yaml và tạo:
kubectl create -f nfs-xfs.yaml
Ví dụ sử dụng Rook Ceph Volume
Ví dụ này sử dụng Ceph RBD block volume làm underlying volume cho NFS server:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-ceph-claim
namespace: rook-nfs
spec:
storageClassName: rook-ceph-block
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
---
apiVersion: nfs.rook.io/v1alpha1
kind: NFSServer
metadata:
name: rook-nfs
namespace: rook-nfs
spec:
replicas: 1
exports:
- name: share1
server:
accessMode: ReadWrite
squash: "none"
persistentVolumeClaim:
claimName: nfs-ceph-claim
annotations:
rook: nfs
Lưu file này với tên nfs-ceph.yaml và tạo:
kubectl create -f nfs-ceph.yaml
Xác nhận NFS Server
Kiểm tra NFS server đã được tạo:
kubectl -n rook-nfs get nfsservers.nfs.rook.io
Kiểm tra NFS server pod đang chạy:
kubectl -n rook-nfs get pod -l app=rook-nfs
Nếu NFS server pod ở trạng thái Running, NFS share đã được tạo thành công.
Truy cập Export với Dynamic Provisioning
Từ phiên bản v1.0, Rook hỗ trợ dynamic provisioning cho NFS. Tạo StorageClass sau khi triển khai NFS operator và NFSServer:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
labels:
app: rook-nfs
name: rook-nfs-share1
parameters:
exportName: share1
nfsServerName: rook-nfs
nfsServerNamespace: rook-nfs
provisioner: nfs.rook.io/rook-nfs-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
StorageClass cần 3 tham số:
- exportName: Tên export để provision volume
- nfsServerName: Tên của NFSServer instance
- nfsServerNamespace: Namespace chạy NFSServer
Tạo PVC sử dụng StorageClass này:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rook-nfs-pv-claim
spec:
storageClassName: "rook-nfs-share1"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
Sử dụng Export
Tạo ứng dụng demo để sử dụng NFS share vừa tạo:
kubectl create -f busybox-rc.yaml
kubectl create -f web-rc.yaml
kubectl create -f web-service.yaml
Xác nhận pods đang chạy:
kubectl get pod -l app=nfs-demo
Kiểm tra web server đang phục vụ dữ liệu:
echo; kubectl exec $(kubectl get pod -l app=nfs-demo,role=busybox -o jsonpath='{.items[0].metadata.name}') -- wget -qO- http://$(kubectl get services nfs-web -o jsonpath='{.spec.clusterIP}'); echo
Dọn dẹp tài nguyên
Xóa tất cả tài nguyên liên quan:
kubectl delete -f web-service.yaml
kubectl delete -f web-rc.yaml
kubectl delete -f busybox-rc.yaml
kubectl delete -f pvc.yaml
kubectl delete -f pv.yaml
kubectl delete -f nfs.yaml
kubectl delete -f nfs-xfs.yaml
kubectl delete -f nfs-ceph.yaml
kubectl delete -f rbac.yaml
kubectl delete -f psp.yaml
kubectl delete -f scc.yaml
kubectl delete -f operator.yaml
kubectl delete -f webhook.yaml
kubectl delete -f common.yaml
Xử lý sự cố
Nếu NFS server pod không xuất hiện, kiểm tra logs của operator:
kubectl -n rook-nfs-system logs -l app=rook-nfs-operator