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