Hướng dẫn bắt đầu nhanh với Rook - Điều phối lưu trữ cloud-native

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.Members củ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:

  1. 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
  2. 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

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

  1. Cần có Kubernetes cluster để chạy Rook NFS operator
  2. 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...
  3. 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

Thẻ: rook ceph Cassandra NFS cloud-native

Đăng vào ngày 5 tháng 6 lúc 21:19