Ceph 是一个高性能的分布式存储系统,支持对象存储、块存储和文件存储,广泛应用于云原生环境中。结合 Kubernetes,Ceph 可以为应用提供动态持久化存储卷(PV),实现高可用和弹性存储。
一、准备工作
1. 系统要求
• Kubernetes 集群:版本 1.22+,至少 3 个节点。
• Ceph 存储节点:每个节点至少 4GB 内存和 20GB 存储。
• 操作系统:CentOS 7+/Ubuntu 18.04+。
2. 安装必要工具
在所有 Kubernetes 节点安装以下工具:
• kubectl:管理 Kubernetes 集群。
• helm:用于安装 Ceph 的 Helm Chart。
安装 Helm:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
二、部署 Ceph Operator
1. 添加 Rook 的 Helm 仓库
Rook 是一个 Kubernetes 上的 Ceph Operator,可以简化 Ceph 的部署和管理:
helm repo add rook-release https://charts.rook.io/release
helm repo update
2. 部署 Ceph Operator
在 Kubernetes 中部署 Rook 的 Ceph Operator:
kubectl create namespace rook-ceph
helm install rook-ceph rook-release/rook-ceph --namespace rook-ceph
3. 验证 Operator 状态
确保 Operator 正常运行:
kubectl get pods -n rook-ceph
输出示例:
bash
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-xxxxxxxxxx-yyyyy 1/1 Running 0 2m
rook-ceph-agent-xxxxxxxxxx-yyyyy 1/1 Running 0 2m
rook-discover-xxxxxxxxxx-yyyyy 1/1 Running 0 2m
三、配置 Ceph 集群
1. 创建存储节点配置
为 Ceph 配置存储设备(假设 /dev/sdb 是空闲磁盘):
bash
kubectl apply -f - <<EOF
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: ceph/ceph:v16.2.6
allowUnsupported: false
dataDirHostPath: /var/lib/rook
storage:
useAllNodes: true
useAllDevices: false
devices:
- name: /dev/sdb
network:
hostNetwork: false
EOF
2. 验证 Ceph 集群状态
检查 Ceph 集群的健康状态:
kubectl -n rook-ceph get cephcluster
输出示例:
bash
NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE
rook-ceph /var/lib/rook 3 5m Ready Cluster created successfully
四、创建存储类
1. 配置 RBD 存储类
为 Kubernetes 创建一个基于 RBD 的存储类:
bash
kubectl apply -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
2. 验证存储类
检查存储类是否创建成功:
kubectl get storageclass
输出示例:
bash
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate 2m
五、测试存储功能
1. 创建测试 PVC
为测试应用创建一个 PVC:
bash
kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-pvc
namespace: default
spec:
storageClassName: rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
EOF
2. 验证 PVC 状态
确保 PVC 已成功绑定:
kubectl get pvc ceph-pvc
输出示例:
bash
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ceph-pvc Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 1Gi RWO rook-ceph-block 1m
3. 挂载 PVC 到测试 Pod
使用 PVC 创建一个测试 Pod:
bash
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
volumeMounts:
- mountPath: "/mnt"
name: ceph-vol
volumes:
- name: ceph-vol
persistentVolumeClaim:
claimName: ceph-pvc
EOF
4. 验证挂载成功
进入 Pod 并检查挂载:
kubectl exec -it test-pod -- sh
ls /mnt
六、扩展功能
1. 配置对象存储
为应用提供 S3 兼容的对象存储:
创建一个 CephObjectStore:
kubectl apply -f object-store.yaml
2. 配置 Bucket 和访问权限。
配置文件存储
通过 CephFS 提供共享文件存储服务:
创建一个 CephFilesystem:
kubectl apply -f filesystem.yaml