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
中看到已经创建出了一个新的存储池
使用 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
引用与感谢
[1] : 博客园-taotaozh-Rook部署
评论