Giới thiệu

Trong bài viết này, tôi sẽ thiết lập Kubernetes Storage Volume với Ceph. Ở đây tôi đang có một cụm K8s với 1 master và 3 worker. Tôi sẽ tận dụng luôn 3 worker node để cài Ceph Cluster trên đó, bạn cần thêm ổ cứng vào các node ceph chưa được sử dụng để dùng riêng cho ceph.

Ceph là một hệ thống tập tin mạng có thể mở rộng. Điều này cho phép bạn tạo một giải pháp lưu trữ phân tán lớn trên phần cứng thông thường. Bạn có thể kết nối bộ lưu trữ Ceph với Kubernetes để trừu tượng hóa khối lượng từ các dịch vụ của mình.

Trong ví dụ này, tôi sẽ thiết lập Hệ thống tệp Ceph (CephFS) để sử dụng làm storage volume cho kubernetes.

Cài đặt ceph-deploy

Trước tiên hãy cài đặt ceph-deploy trên master node. ceph-deploy sẽ được sử dụng để cài đặt phần mềm ceph trên các node worker của bạn.

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo deb https://download.ceph.com/debian-luminous/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt-get update && sudo apt-get install ceph-deploy ntp
sudo /etc/init.d/ntp restart

Kiểm tra phiên bản ceph-deploy

ceph-deploy --version

Tạo Ceph Deploy User

Tiện ích ceph-deploy phải đăng nhập vào Ceph node với tư cách là passwordless sudo, vì nó sẽ cài đặt phần mềm và tệp cấu hình tự động. 

Nếu bạn không có người dùng non-previleged cluster, hãy làm theo các bước tiếp theo và thay thế ‘{username}’ bằng tên người dùng mà bạn đã chọn.

useradd -m {username} -s /bin/bash
passwd {username}
echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
sudo chmod 0440 /etc/sudoers.d/{username}

Tiếp theo, tạo khóa SSH trên nút chính và phân phối khóa chung cho từng nút công nhân.

su {username}
ssh-keygen

Các khóa sẽ được lưu trữ trong thư mục .ssh/. Bây giờ bạn có thể sao chép khóa vào tất cả các worker node

ssh-copy-id {username}@node1
ssh-copy-id {username}@node2
ssh-copy-id {username}@node3

Cài đặt Ceph Cluster

Sau khi đã cài đặt ceph-deply và tạo quyền truy cập ssh vào các node ceph, bạn có thể tạo một cụm ceph mới.

Đầu tiên hãy tạo một thư mục làm việc để lưu trữ cấu hình và tạo cụm.

mkdir ceph-cluster
cd ceph-cluster
ceph-deploy new node1 node2 node3

Tệp cấu hình được lưu trữ trong file ceph.conf

cat ceph.conf

Tiếp theo cài đặt Ceph packages:

ceph-deploy install --release luminous node1 node2 node3

Tiện ích ceph-deploy sẽ cài đặt Ceph trên mỗi node nên bạn không cần truy cập vào các worker node.

Triển khai các monitor và thu thập khóa:

ceph-deploy mon create-initial

Sử dụng ceph-deploy để sao chép tệp cấu hình và khóa quản trị vào các Ceph node của bạn

ceph-deploy admin node1 node2 node3

Triển khai daemon quản lý. (Chỉ bắt buộc đối với các bản dựng luminous+)

ceph-deploy mgr create node1

Tiếp theo tạo máy chủ siêu dữ liệu

ceph-deploy mds create node1 node2 node3

Tại thời điểm này, bạn có thể kiểm tra trạng thái cụm của mình.. SSH vào một trong các nút ceph và chạy:

sudo ceph status

Tạo Object Store Daemons (OSDs)

Bây giờ bạn có thể tạo OSD trên các nút ceph của mình. Tôi giả sử bạn có một đĩa chưa được sử dụng trong mỗi node có tên là /dev/vdb. Hãy đảm bảo rằng thiết bị hiện không được sử dụng và không chứa bất kỳ dữ liệu quan trọng nào.

Bạn có thể tìm nạp danh sách các đĩa có sẵn trên một nút cụ thể:

ceph-deploy disk list node-1

Lưu ý: thiết bị chưa được mount vào một thư mục cụ thể

Bạn có thể chạy nhiều OSD trên cùng một máy chủ, nhưng sử dụng cùng một ổ lưu trữ cho nhiều phiên bản là một ý tưởng tồi vì tốc độ I/O của ổ đĩa có thể hạn chế hiệu suất của trình nền OSD.

Vì vậy, chỉ cần tạo trên OSD trên mỗi node.

ceph-deploy osd create --data {device} {ceph-node}

Ví dụ:

ceph-deploy osd create --data /dev/vdb node1
ceph-deploy osd create --data /dev/vdb node2
ceph-deploy osd create --data /dev/vdb node3

Kiểm tra tình trạng của cluster.

ssh node1 sudo ceph health
HEALTH_OK

Cụm ceph của bạn hiện đã sẵn sàng để sử dụng!

Quản lý Ceph Dashboard

Ceph đi kèm với một web dashboard cho phép bạn kiểm soát cụm của mình từ trình duyệt web. Để bật bảng điều khiển, hãy kết nối với các cluster node của bạn và chạy:

sudo ceph mgr module enable dashboard

Sau đó bạn có thể truy cập bảng điều khiển từ trình duyệt với http://<ip-node>:7000/

Để tắt tính năng bảng điều khiển:

sudo ceph mgr module disable dashboard

Troubleshoot

Đối với tôi, quá trình cài đặt của tôi không thành công nhiều lần và tôi buộc phải xóa sạch các ổ đĩa logic được tạo trong lần cài đặt trước đó.

Nếu tại bất kỳ thời điểm nào bạn gặp rắc rối và bạn có thể xóa mọi thứ và bắt đầu lại. Thực hiện thao tác sau để xóa các gói Ceph và xóa tất cả dữ liệu cũng như cấu hình của nó:

sudo ceph-deploy purge node1 node2 node3
sudo ceph-deploy purgedata node1 node2 node3
sudo ceph-deploy forgetkeys
rm ceph.*

Nếu bạn thực hiện purge, bạn phải cài đặt lại Ceph. Lệnh rm cuối cùng sẽ xóa mọi tệp được viết ra bởi ceph-deploy cục bộ trong quá trình cài đặt trước đó.

Nếu bạn cần xóa ổ đĩa logic khỏi nút ceph, bạn có thể sử dụng quy trình sau (Lưu ý: thao tác này sẽ xóa tất cả nội dung khỏi thiết bị của bạn!)

Liệt kê tất cả các logical volume trên một node:

sudo ceph-volume lvm list

Xóa sạch một thiết bị logic. (thay thế [device-name] bằng thiết bị của bạn, ví dụ: sdb)

sudo ceph-volume lvm zap /dev/[device-name] --destroy
# this should done it. If you still have problems wipe out the disk:
sudo dmsetup info -C
# copy the ceph dm name
sudo dmsetup remove [dm_map_name]
sudo wipefs -fa /dev/[device-name]
sudo dd if=/dev/zero of=/dev/[device-name] bs=1M count=1

Tạo CephFS cho Kubernetes

Để thiết lập CephFS để Cụm Kubernetes sử dụng, bạn cần tạo hai RADOS pools, một cho actual data và một cho metadata. Kết nối với một trong các ceph node và tạo pool:

sudo ceph osd pool create cephfs_data 64
sudo ceph osd pool create cephfs_metadata 64

Pool sẽ được sao chép tự động sang các node khác.

Tiếp theo bạn có thể kích hoạt tính năng filesystem

sudo ceph fs new cephfs cephfs_metadata cephfs_data

Quá trình thiết lập ceph hiện đã hoàn tất để bạn có thể triển khai cái gọi là ceph-provisioner và ceph-storageclass.

CephFS-Provisioner và Ceph-StorageClass

Trước khi có thể triển khai trình cung cấp CephFS vào cụm kubernetes, trước tiên bạn cần tạo secret. Với lệnh sau, bạn có thể lấy khóa quản trị ceph từ một trong các nút ceph của mình:

sudo ssh node1 ceph auth get-key client.admin
ABCyWw9dOUm/FhABBK0A9PXkPo6+OXpOj9N2ZQ==

Sao chép khóa và tạo kubernetes secret có tên “ceph-secret”:

kubectl create secret generic ceph-secret-admin \
    --from-literal=key='ABCyWw9dOUm/FhABBK0A9PXkPo6+OXpOj9N2ZQ==' \
    --namespace=kube-system

Tôi đang chạy cephfs trong namespace “kube-sytem”. Nhưng bạn cũng có thể chạy nó trong một namespace riêng.

Tiếp theo hãy tạo tệp cephfs-provisoner.yaml chứa các ràng buộc vai trò:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
  namespace: kube-system
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"]
    resourceNames: ["kube-dns","coredns"]
    verbs: ["list", "get"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
subjects:
  - kind: ServiceAccount
    name: cephfs-provisioner
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cephfs-provisioner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cephfs-provisioner
  namespace: kube-system
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["create", "get", "delete"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cephfs-provisioner
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cephfs-provisioner
subjects:
- kind: ServiceAccount
  name: cephfs-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cephfs-provisioner
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cephfs-provisioner
  namespace: kube-system
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: cephfs-provisioner  
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: cephfs-provisioner
    spec:
      containers:
      - name: cephfs-provisioner
        image: "quay.io/external_storage/cephfs-provisioner:latest"
        env:
        - name: PROVISIONER_NAME
          value: ceph.com/cephfs
        - name: PROVISIONER_SECRET_NAMESPACE
          value: kube-system
        command:
        - "/usr/local/bin/cephfs-provisioner"
        args:
        - "-id=cephfs-provisioner-1"
      serviceAccount: cephfs-provisioner

Tạo provisioner với kubectl:

kubectl create -n kube-system -f ceph/cephfs-provisioner.yaml

Tiếp theo tạo tệp cephfs-storageclass.yaml:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: cephfs
provisioner: ceph.com/cephfs
parameters:
  # replace the {node-1}.. with the IP addresses of you ceph nodes
  monitors: {node-1}:6789, {node-2}:6789, {node-3}:6789
  adminId: admin
  # replace the ceph-admin-secret with a kubernetes secret holding your ceph client.admin key
  adminSecretName: {ceph-admin-secret}
  adminSecretNamespace: kube-system
  claimRoot: /pvc-volumes

Thay thế các node-1-3 bằng địa chỉ IP của cụm ceph của bạn.

Tạo storageclass với:

kubectl create -n kube-system -f cephfs-storageclass.yaml

Để kiểm tra quá trình triển khai mới của bạn:

kubectl get pods -l app=cephfs-provisioner -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
cephfs-provisioner-7ab15bd-rnxx8   1/1     Running   0          96s

Tạo PVC và áp dụng cho Pod

PVC là một phần trong pod, nó sẽ tự động tạo ra persistence volume được liên kết với pod của bạn.

Sau đây là ví dụ về cách tạo volume claim cho CephFS trong pod. Tạo file volumeclaim.yaml:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mydata
#  namespace: cephfs
spec:
  storageClassName: cephfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

Trong quá trình triển khai, bạn có thể gắn một ổ đĩa dựa trên yêu cầu này.

kubectl create -f volumeclaim.yaml

Cuối cùng kiểm tra trạng thái của PVC:

kubectl get pvc
NAME          STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mydata     Bound     pvc-060e5142-f915-4385-8e86-4166fe2980f6   1Gi        RWO            fast-rbd       27m

Trong quá trình triển khai pod deployment (VD: database server), bạn có thể chỉ định volume dựa trên PVC.

apiVersion: apps/v1
kind: Deployment
.....
spec:
  ....
  template:
    ....
    spec:
      containers:
      .....
        volumeMounts:
        - mountPath: /var/lib/myapp/data
          name: mydata
      restartPolicy: Always
      volumes:
      - name: mydata
        persistentVolumeClaim:
          claimName: mydata
....

Leave a Reply

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.