十、云原生存储之ceph集群部署(一)
1. ceph集群部署
1.1 准备环境
k8s集群要求:
- 最低版本支持Kubernetes v1.21或更高版本
- 至少五个节点,每个节点的内存不低于5G,CPU不低于2核。
- 至少有三个存储节点,并且每个节点至少有一个裸盘。
- K8s集群所有的节点时间必须一致
分区或设备不能使用文件系统进行格式化(存储节点都新添加一块裸盘)
Tips:Rook 的版本大于 1.3,不要使用目录创建集群,要使用单独的裸盘进行创建,所以不能进行格式化。
1.2 部署Rook
克隆Rook相关代码(本次使用Rook 1.6版本)
git clone --single-branch --branch v1.6.11 https://gitee.com/dukuan/rook.git
修改operator.yaml
[root@k8s-master01 ceph]# pwd
/root/rook/cluster/examples/kubernetes/ceph
[root@k8s-master01 ceph]# vim operator.yaml
#v1.6.11版本可用镜像地址
ROOK_CSI_CEPH_IMAGE: "registry.cn-shanghai.aliyuncs.com/yinjay/github:cephcsi-v3.3.1"
ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-shanghai.aliyuncs.com/yinjay/github:csi-node-driver-registrar-v2.2.0"
ROOK_CSI_RESIZER_IMAGE: "registry.cn-shanghai.aliyuncs.com/yinjay/github:csi-resizer-v1.2.0"
ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-shanghai.aliyuncs.com/yinjay/github:csi-provisioner-v2.2.2"
ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-shanghai.aliyuncs.com/yinjay/github:csi-snapshotter-v4.1.1"
ROOK_CSI_ATTACHER_IMAGE: "registry.cn-shanghai.aliyuncs.com/yinjay/github:csi-attacher-v3.2.1"
#Rook镜像,应该在370行左右
image: registry.cn-shanghai.aliyuncs.com/yinjay/github:rook-ceph-v1.6.11
开启自动添加新节点或自动发现和添加新的Ceph存储服务。
部署Rook,等待 Operator 容器和 Discover 容器启动好了,Running状态了才能进行创建ceph集群。
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
1.3 创建ceph集群
cluster.yaml配置修改
#修改ceph镜像
image: registry.cn-shanghai.aliyuncs.com/yinjay/github:ceph-v15.2.13
#跳过升级检查以及何时要升级群集
skipUpgradeChecks: true
#关闭Dashboard SSL
ssl: false
#关闭选择所有节点和设备
storage:
useAllNodes: false
useAllDevices: false
#修改useAllNodes和useAllDevices为false,其中useAllNodes选项指示Ceph 是否应该使用集群中的所有节点作为存储节点。当设置为 true 时,Ceph 将使用所有节点作为存储节点。这意味着每个节点都可以被用作存储设备的托管节点,并参与存储池和数据的管理。当设置为 false 时,只有在 storage 部分中显式定义的节点才会被用作存储节点;
#useAllDevices选项指示 Ceph 是否应该使用节点上的所有可用设备作为存储设备。当设置为 true 时,Ceph 将使用节点上的所有可用设备作为存储设备。这包括硬盘、固态驱动器 (SSD) 等。当设置为 false 时,只有在 storage 部分中显式定义的设备才会被用作存储设备。
#指定节点作为存储资源(对齐config)
nodes:
- name: "k8s-master01"
devices:
- name: "nvme0n2"
- name: "k8s-master02"
devices:
- name: "nvme0n2"
- name: "k8s-master03"
devices:
- name: "nvme0n2"
#devices下面的name指的是新加的空白磁盘的名字,nodes下面的name指的是label标签的http://kubernetes.io/hostname的value值。
创建集群,开始漫长的等待!最好将镜像仓库同步到本地Harbor镜像仓库,会更快!或者同步到一台节点后导出所有相关镜像到其他节点进行导入。
kubectl create -f cluster.yaml
直到rook-ceph命名空间下的容器都Running、Completed,主要rook-ceph-osd要能够起来。
查看cephcluster集群状态,观察到正常,Ready!
1.4 安装ceph客户端工具
[root@k8s-master01 ceph]# pwd
/root/rook/cluster/examples/kubernetes/ceph
[root@k8s-master01 ceph]# kubectl create -f toolbox.yaml -n rook-ceph
deployment.apps/rook-ceph-tools created
待容器 Running 后,即可执行相关命令。
查看ceph状态,3个OSD都up,以及存储池信息。
查看OSD状态,ceph磁盘使用率。
1.5 安装ceph snapshot控制器
k8s 1.19 版本以上需要单独安装 snapshot 控制器,才能完成 pvc 的快照功能。
#拉取项目文件
git pull https://gitee.com/dukuan/k8s-ha-install.git
#进入到项目目录中,切换分支(k8s版本自己替换)
git checkout manual-installation-v1.23.x
创建 snapshot controller
kubectl create -f snapshotter/ -n kube-system
查看该Pod的状态,Running即可。
1.6 暴露Dashboard服务
ceph的Dashboard默认是已经安装完成的,只是只能内部访问。现在如果我们想要从外部访问必须要修改服务类型为Nodeport。
新版本修改服务类型为Nodeport的文件已存在,此时我们只需要直接创建即可,查看service就能看到暴露的端口啦。
然后通过任意 k8s 节点的 IP+该端口即可访问该Dashboard(这里我访问的是VIP)
登录,账号为 admin,查看密码。
[root@k8s-master01 ceph]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
w0f[C7JKL;CJ.Ao/G=Nq
1.7 创建StorageClass和Ceph的存储池
首先进入Ceph的代码目录,找到RBD目录的StorageClass配置,然后根据需求修改对应参数。
[root@k8s-master01 ceph]# pwd
/root/rook/cluster/examples/kubernetes/ceph
[root@k8s-master01 ceph]# vim csi/rbd/storageclass.yaml
replicated的size生产环境最少为 3,且要小于等于 osd 的数量。
[root@k8s-master01 ceph]# cat csi/rbd/storageclass.yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool #定义了一个名为replicapool的块池
namespace: rook-ceph #属于rook-ceph命名空间
spec:
failureDomain: host #使用主机作为故障域,也就是副本是按主机分布,非按OSD进行分布。
replicated:
size: 3 #3副本的复制块池
requireSafeReplicaSize: true
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com #指定用于创建和管理卷的 CSI(Container Storage Interface)插件的提供者,这里使用Rook-Ceph RBD CSI插件来创建和管理与该StorageClass关联的持久卷。
parameters: #指定了一些特定于Rook-Ceph的参数
clusterID: rook-ceph # namespace:cluster
pool: replicapool #指定要使用的Ceph块池的名称。
imageFormat: "2" #指定创建的RBD镜像的格式,设置为2表示使用RBD镜像格式版本2。
imageFeatures: layering #指定RBD镜像的特性。在示例中,设置为layering表示启用镜像分层特性。
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
csi.storage.k8s.io/fstype: ext4 #定要在挂载卷时使用的文件系统类型。
allowVolumeExpansion: true #指定是否允许卷进行扩展。在示例中,设置为true表示允许扩展卷的大小。
reclaimPolicy: Delete #指定在卷被释放后如何处理底层存储资源。在示例中,设置为Delete表示删除底层存储资源。
Tips:根据上述文件内容进行修改!
开始创建StorageClass和Ceph的存储池
kubectl create -f csi/rbd/storageclass.yaml
Tips:推荐使用kubectl get sc,命令短!
查看存储池,也有了!
Tips:StorageClass没有Namespace隔离性!