Rook Ceph 安装

我们公司先前购买了一套 Kubernetes 软件,但由于存储系统的高成本超出了预算,因此没有采用推荐的方案,而是选择了 NFS 作为 Kubernetes 的存储后端。虽然供应商建议使用其他方案,但我们当时认为 NFS 是一个更具成本效益的选择。

迁移了 20 多个系统到 Kubernetes 后,我们发现数据库的 IO 问题显著,导致性能严重下降,且缺乏高可用性。这让我们意识到当前的存储方案无法满足需求。

因此,我们考虑重新评估 Ceph 软件作为存储解决方案。虽然起初认为 Ceph 较为冷门,但它在分布式存储方面具有强大的性能和高可用性特性。Ceph 支持对象存储、块存储和文件系统存储,非常适合需要高性能和稳定性的数据库应用。

接下来,我们计划对 Ceph 进行深入研究和部署,以解决当前的性能瓶颈和高可用性缺失问题。在这个过程中,可能需要专业的支持以确保 Ceph 的有效集成和管理。长期来看,这将有助于提升整个系统的性能和可靠性。

相关内容

前置内容

一个 Kubernetes集群.在特定的服务器上挂载不同的磁盘该磁盘不需要被格式化.

安装Ceph

下载Rook 安装包

git clone --single-branch --branch v1.15.6 https://github.com/rook/rook.git

缓存镜像

打开 rook/deploy/examples/operator.yaml因为众所周知的原因这里的镜像不一定能下载成功,所以需要将这些镜像缓存下来,并提交到国内的一些中介平台上,例如 阿里云 华为云 Harbor 等...

# ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.2"
# ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1"
# ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.11.1"
# ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v5.0.1"
# ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.k8s.io/sig-storage/csi-snapshotter:v8.0.1"
# ROOK_CSI_ATTACHER_IMAGE: "registry.k8s.io/sig-storage/csi-attacher:v4.6.1"

(我电脑是Arm的拉下来的Docker镜像就是Arm版本的,所以在这里需要指定)

下载 Image

docker pull registry.k8s.io/sig-storage/csi-attacher:v4.6.1  --platform linux/amd64
docker pull registry.k8s.io/sig-storage/csi-snapshotter:v8.0.1 --platform linux/amd64
docker pull registry.k8s.io/sig-storage/csi-provisioner:v5.0.1 --platform linux/amd64
docker pull registry.k8s.io/sig-storage/csi-resizer:v1.11.1 --platform linux/amd64
docker pull registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1 --platform linux/amd64
docker pull quay.io/cephcsi/cephcsi:v3.12.2 --platform linux/amd64

修改 Tag

docker tag registry.k8s.io/sig-storage/csi-attacher:v4.6.1  selfserver/sig-storage/csi-attacher:v4.6.1 
docker tag registry.k8s.io/sig-storage/csi-snapshotter:v8.0.1 selfserver/sig-storage/csi-snapshotter:v8.0.1
docker tag registry.k8s.io/sig-storage/csi-provisioner:v5.0.1 selfserver/sig-storage/csi-provisioner:v5.0.1
docker tag registry.k8s.io/sig-storage/csi-resizer:v1.11.1 selfserver/sig-storage/csi-resizer:v1.11.1
docker tag registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1 selfserver/sig-storage/csi-node-driver-registrar:v2.11.1
docker tag quay.io/cephcsi/cephcsi:v3.12.2 selfserver/cephcsi/cephcsi:v3.12.2

上传 Image

docker push selfserver/sig-storage/csi-attacher:v4.6.1 
docker push selfserver/sig-storage/csi-snapshotter:v8.0.1
docker push selfserver/sig-storage/csi-provisioner:v5.0.1
docker push selfserver/sig-storage/csi-resizer:v1.11.1
docker push selfserver/sig-storage/csi-node-driver-registrar:v2.11.1
docker push selfserver/cephcsi/cephcsi:v3.12.2
如果你还是没有办法拿到该内容,可以与我联系我可以提供相应的镜像.☎️

然后修改 rook/deploy/examples/operator.yaml 内容

...
ROOK_CSI_CEPH_IMAGE: "selfserver/cephcsi/cephcsi:v3.12.2"
ROOK_CSI_REGISTRAR_IMAGE: "selfserver/sig-storage/csi-node-driver-registrar:v2.11.1"
ROOK_CSI_RESIZER_IMAGE: "selfserver/sig-storage/csi-resizer:v1.11.1"
ROOK_CSI_PROVISIONER_IMAGE: "selfserver/sig-storage/csi-provisioner:v5.0.1"
ROOK_CSI_SNAPSHOTTER_IMAGE: "selfserver/sig-storage/csi-snapshotter:v8.0.1"
ROOK_CSI_ATTACHER_IMAGE: "selfserver/sig-storage/csi-attacher:v4.6.1"
...

配置Secret(可选)

因为我采用的平台并非公开平台所以需要在 rook/deploy/examples/common.yaml配置 imagePullSecrets 该文件下的每个都创建下 Secret

...
apiVersion: v1
kind: ServiceAccount
metadata:
  name: objectstorage-provisioner
  namespace: rook-ceph # namespace:operator
  labels:
    app.kubernetes.io/part-of: container-object-storage-interface
    app.kubernetes.io/component: driver-ceph
    app.kubernetes.io/name: cosi-driver-ceph
imagePullSecrets:
- name: xxx-secret  << 修改这里
...

安装 Rook Operator

kubectl create -f crds.yaml -f common.yaml -f operator.yaml

执行完该内容后,会创建一个 namespace rook-ceph 的 Deployment 等待该 Pod运行成功后我们将配置Cluster

kubectl get pods -n rook-ceph

安装 Cluster

这里配置了Ceph是否安装在全部的节点上和全部的驱动器上.

...
  storage:
    # cluster level storage configuration and selection
    useAllNodes: false
    useAllDevices: false
...

选择对应的Node,可以在对应的 Node节点上使用 fdisk -l 查看挂载的硬盘数量

...
	nodes:
    - name: worker1
      devices:
      - name: sdb
      - name: sdc
    - name: worker2
      devices:
      - name: sdb
    - name: worker3
      devices:
      - name: sdb
      - name: sdc
...

开始安装集群

kubectl create -f cluster.yaml

安装 Ceph客户端

Ceph 客户端可以命令行操作客户端.

kubectl create -f toolbox.yaml -n rook-ceph

kubectl get po -n rook-ceph -l app=rook-ceph-tools

kubectl exec -i -t -n rook-ceph rook-ceph-tools-7b67b65bd-4k2bs -c rook-ceph-tools -- sh -c "clear; (bash || ash || sh)"
sh: line 1: clear: command not found

bash-5.1$ ceph osd status
ID  HOST      USED  AVAIL  WR OPS  WR DATA  RD OPS  RD DATA  STATE    
 0  worker1  1256M  30.7G      0        0       0        0   exists,up  
 1  worker2  4896M  27.2G      0        0       0        0   exists,up  
 2  worker3  3364M  28.7G      0        0       0        0   exists,up  
 3  worker1  3551M  60.5G      0        0       0        0   exists,up  
 4  worker3  2793M  29.2G      0        0       0        0   exists,up  

暴露Dashboard

Ceph 控制面板默认是 ClusterIP 访问 为了我们可以正常访问我们需要创建一个 Service 如果你有一个 Ingress 你也可以用 Ingress 配置内容.

kubectl create -f dashboard-external-https.yaml -n rook-ceph

kubectl -n rook-ceph get service rook-ceph-mgr-dashboard

# 查看密码
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

在Kubernetes上使用 Ceph

创建StoreClass 和 Ceph 存储池

进入``rook/deploy/examples/csi/rbd/storageclass.yaml`

kubectl apply -f storageclass.yaml -n rook-ceph

安装完后我们就可以在 Dashborad 中看到已经创建出了一个新的存储池

58768952-BDB4-469F-B1F8-AFCEEF40024F.png

使用 Ceph PVC

在此我们使用 busybox 来验证 pvc 是否可用.

创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc-claim
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

创建Deployments

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        command: ['sleep', '3600'] # 让 Busybox 运行,保持容器持续运行
        volumeMounts:
        - mountPath: "/mnt/data"
          name: mypvc
      volumes:
      - name: mypvc
        persistentVolumeClaim:
          claimName: mypvc-claim # 这里引用了 PVC 的名字

就可以在Ceph Dashborad 中创建出相应的 Image

2A7B994D-6849-4A1B-8585-49BB415945BC.png

引用与感谢

[1] : 博客园-taotaozh-Rook部署