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

相关推荐
Database_Cool_11 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
张忠琳12 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
Elastic 中国社区官方博客14 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
肥胖小羊20 小时前
解决企业微信 AccessToken 刷新并发冲突的分布式锁机制实践
分布式·企业微信
前端Baymax20 小时前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc20 小时前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
阿标在干嘛1 天前
从物理机到K8s:政策快报平台的容器化部署实践
云原生·容器·kubernetes
张青贤1 天前
Centos7离线部署K8s集群V1.28.8
云原生·容器·kubernetes·containerd·kubekey·离线部署
上海安当技术1 天前
K8S 里的密码去哪了?凭据管理系统在容器环境的四种集成实践
云原生·容器·kubernetes
晴空了无痕1 天前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes