Kubernetes 中部署 Ceph,构建高可用分布式存储服务

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

相关推荐
会周易的程序员32 分钟前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
LRL_6 小时前
深入浅出 Kubernetes 控制器:Deployment 与 StatefulSet 核心区别全景图
云原生·容器·kubernetes
想要打 Acm 的小周同学呀7 小时前
Kafka消息队列出现挤压如何解决?
分布式·kafka
MrSYJ7 小时前
Network Namespace 到底是个啥,别人再问你告诉他
docker·云原生·kubernetes
彬冷的心10 小时前
K8s 部署若依项目 + Harbor 私有仓库(双节点版)
云原生·容器·kubernetes
convee_ai10 小时前
Agent 执行为什么需要独立 Sandbox:拆解 Hullwork 的 gVisor 隔离
架构·kubernetes
想要成为老金高手10 小时前
Kubernetes Service 深度实践:从 ClusterIP 到 Ingress 七层代理
云原生·容器·kubernetes
stark张宇11 小时前
分布式事务最全图解(6种方案):从强一致的2PC到最终对账,彻底搞懂数据一致性
分布式·后端
IT大白鼠11 小时前
Kubernetes 持久化存储:PV、PVC、StorageClass 存储体系
云原生·容器·kubernetes
会周易的程序员11 小时前
5Draft使用说明书
服务器·c++·分布式·raft·共识