rook-ceph部署
官方文档:https://rook.io/docs/rook/v1.9/quickstart.html
分布式存储系统是一个有效的解决有状态工作负载高可用问题的方案。Ceph 就是一个分布式存储系统,近年来其影响主键扩大。Rook 是一个编排器,能够支持包括 Ceph 在内的多种存储方案。Rook 简化了 Ceph 在 Kubernetes 集群中的部署过程。
Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、配置、调配、扩展、升级、迁移、灾难恢复、监控和资源管理
Ceph 存储提供程序
Ceph 是一种高度可扩展的分布式存储解决方案,适用于块存储、对象存储和共享文件系统,具有多年的生产部署经验。
Rook 自动部署和管理 Ceph,以提供自我管理、自我扩展和自我修复的存储服务。Rook Operator 通过构建 Kubernetes 资源来部署、配置、配置、扩展、升级和监控 Ceph。
Ceph operator 于 2018 年 12 月在 Rook v0.9 版本中宣布稳定,多年来一直提供生产存储平台。Rook 由云原生计算基金会 (CNCF) 托管,是一个毕业级项目。
Rook 编排 Ceph 存储解决方案,并由专门的 Kubernetes Operator 进行自动化管理。Rook 确保 Ceph 在 Kubernetes 上运行良好,并简化部署和管理体验。
rook架构介绍
上面显示了三种受支持的存储类型的示例应用程序:
- 块存储由一个蓝色应用表示,该应用已挂载卷。应用程序可以读取和写入 RWO 卷,而 Ceph 管理 IO。
ReadWriteOnce (RWO)
- 共享文件系统由共享 ReadWriteMany (RWX) 卷的两个紫色应用表示。两个应用程序可以同时主动读取或写入卷。Ceph 将确保使用 MDS 守护程序为多个写入器安全地保护数据。
- 对象存储由一个橙色应用程序表示,该应用程序可以使用标准 S3 客户端读取和写入存储桶。
在上图中的虚线下方,组件分为三类:
- Rook 算子(蓝色层):算子自动配置 Ceph
- CSI 插件和置备程序(橙色层):Ceph-CSI 驱动程序提供卷的置备和挂载
- Ceph 守护进程(红色层):Ceph 守护进程运行核心存储体系结构。请参阅词汇表以了解有关每个守护程序的更多信息。
生产集群必须具有三个或更多节点才能实现弹性存储平台。
块存储¶
在上图中,使用 RWO 卷创建应用程序的流程为:
- (蓝色)应用程序创建 PVC 以请求存储
- PVC 定义用于置备存储的 Ceph RBD 存储类 (sc)
- K8s 调用 Ceph-CSI RBD 配置程序来创建 Ceph RBD 镜像。
- kubelet 调用 CSI RBD 卷插件将卷挂载到 App 中
- 该卷现在可用于读取和写入。
ReadWriteOnce 卷一次可以装载在一个节点上。
共享文件系统¶
在上图中,使用 RWX 卷创建应用程序的流程为:
- (紫色)应用程序创建 PVC 以请求存储
- PVC 定义用于配置存储的 CephFS 存储类 (sc)
- K8s 调用 Ceph-CSI CephFS 配置程序来创建 CephFS 子卷
- kubelet 调用 CSI CephFS 卷插件在应用中挂载卷
- 该卷现在可用于读取和写入。
ReadWriteMany 卷可以挂载到多个节点上供应用程序使用。
对象存储 S3¶
在上图中,创建有权访问 S3 存储桶的应用程序的流程为:
- (橙色)应用程序创建一个 ObjectBucketClaim (OBC) 来请求存储桶
- Rook 操作员创建一个 Ceph RGW 存储桶(通过 lib-bucket-provisioner)
- Rook 操作员使用用于访问存储桶的凭证创建一个密钥,并使用存储桶信息创建一个 configmap
- 应用从机密中检索凭据
- 该应用程序现在可以使用 S3 客户端读取和写入存储桶
兼容 S3 的客户端可以使用凭证 () 和存储桶信息 () 立即使用 S3 存储桶。
install
资源配置
k8s集群,最底一主两从(2C4G)
#128、129、130作为存储节点
#查看128
for i in $(kubectl get nodes|awk 'NR>1''{print $1}');\
do \
kubectl describe nodes ${i} |egrep -i "taint";\
echo "===================================================";\
echo "${i}";\
echo "===================================================";\
echo;\
done
#允许master节点调度
kubectl taint nodes k8s-master-01 node-role.kubernetes.io/control-plane:NoSchedule-
for i in $(kubectl get nodes|awk 'NR>1''{print $1}');\
do \
kubectl describe nodes ${i} |egrep -i -B 100 "Annotations";\
echo "===================================================";\
echo "${i}";\
echo "===================================================";\
echo;\
done
部署操作128节点
#拉取rook-ceph的代码
git clone --single-branch --branch v1.9.2 https://github.com/rook/rook.git
cd ~/rook/deploy/examples/
#更换国外镜像阿里云的,替换镜像,并取消注释
egrep -i "(# ROOK_CSI(.*)_IMAGE|image:)" operator.yaml
=============================================================
# ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.6.1"
# ROOK_CSI_REGISTRAR_IMAGE: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.5.0"
# ROOK_CSI_RESIZER_IMAGE: "k8s.gcr.io/sig-storage/csi-resizer:v1.4.0"
# ROOK_CSI_PROVISIONER_IMAGE: "k8s.gcr.io/sig-storage/csi-provisioner:v3.1.0"
# ROOK_CSI_SNAPSHOTTER_IMAGE: "k8s.gcr.io/sig-storage/csi-snapshotter:v5.0.1"
# ROOK_CSI_ATTACHER_IMAGE: "k8s.gcr.io/sig-storage/csi-attacher:v3.4.0"
# ROOK_CSI_NFS_IMAGE: "k8s.gcr.io/sig-storage/nfsplugin:v3.1.0"
# CSI_VOLUME_REPLICATION_IMAGE: "quay.io/csiaddons/volumereplication-operator:v0.3.0"
# ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.2.1"
image: rook/ceph:v1.9.2
部署资源
kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
kubectl -n rook-ceph get pod
添加磁盘,需要干净的磁盘
这里在所有节点添加 1 块 100GB 的新磁盘:/dev/sdb,作为 OSD 盘,提供存储空间,添加完成后扫描磁盘,确保主机能够正常识别到:
#批量128
for i in 192.168.10.{128..130};\
do \
ssh root@${i} sudo yum install -y lvm2;\
ssh root@${i} sudo lsblk;\
echo "===================================================";\
echo "${i}";\
echo "===================================================";\
echo;\
done
修改配置文件
egrep -i "(IMAGE|image:)" cluster.yaml
=========================================================
# The container image used to launch the Ceph daemon pods (mon, mgr, osd, mds, rgw).
image: quay.io/ceph/ceph:v16.2.7
#替换为阿里云的镜像
#修改配置添加机器
vim cluster.yaml
storage: # cluster level storage configuration and selection
useAllNodes: false
useAllDevices: false
#deviceFilter:
config:
# crushRoot: "custom-root" # specify a non-default root label for the CRUSH map
# metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore.
# databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB
# journalSizeMB: "1024" # uncomment if the disks are 20 GB or smaller
# osdsPerDevice: "1" # this value can be overridden at the node or device level
# encryptedDevice: "true" # the default value for this option is "false"
# Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named
# nodes below will be used as storage resources. Each node's 'name' field should match their 'kubernetes.io/hostname' label.
nodes:
- name: "k8s-master-01"
devices: # specific devices to use for storage can be specified for each node
- name: "sdb" # multiple osds can be created on high performance devices
config:
databaseSizeMB: "1024"
journalSizeMB: "1024"
- name: "k8s-node-01"
devices: # specific devices to use for storage can be specified for each node
- name: "sdb" # multiple osds can be created on high performance devices
config:
databaseSizeMB: "1024"
journalSizeMB: "1024"
- name: "k8s-node-02"
devices: # specific devices to use for storage can be specified for each node
- name: "sdb" # multiple osds can be created on high performance devices
config:
databaseSizeMB: "1024"
journalSizeMB: "1024"
部署ceph集群128、
cluster.yaml:此文件包含生产存储集群的常用设置。至少需要三个k8s工作节点。
cluster-test.yaml:未配置冗余的测试集群的设置。只需要一个节点。
cluster-on-pvc.yaml:此文件包含用于通过 PV 支持 Ceph Mons 和 OSD 的常用设置。在云环境中运行或已创建本地 PV 供 Ceph 使用时很有用。
cluster-external:以最小的访问权限连接到外部 Ceph 集群,以监控集群的运行状况并连接到存储。
cluster-external-management:使用外部集群的 admin 密钥连接到外部 Ceph 集群,以启用远程创建池并配置对象存储或共享文件系统等服务。
kubectl apply -f cluster.yaml
kubectl -n rook-ceph get pod -owide
#要有以下pod运行证明成功
=============================================================
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-cephfsplugin-gdkln 3/3 Running 0 4m48s 192.168.44.203 k8s-192-168-44-203.host.com <none> <none>
csi-cephfsplugin-mx6j2 3/3 Running 0 4m52s 192.168.44.204 k8s-192-168-44-204.host.com <none> <none>
csi-cephfsplugin-provisioner-574495c75b-f8nxt 6/6 Running 0 96m 10.244.172.196 k8s-192-168-44-203.host.com <none> <none>
csi-cephfsplugin-provisioner-574495c75b-wd5db 6/6 Running 0 96m 10.244.238.194 k8s-192-168-44-204.host.com <none> <none>
csi-cephfsplugin-vmn7k 3/3 Running 0 9m33s 192.168.44.201 k8s-192-168-44-201.host.com <none> <none>
csi-cephfsplugin-vzcbt 3/3 Running 0 4m44s 192.168.44.202 k8s-192-168-44-202.host.com <none> <none>
csi-rbdplugin-54kq5 3/3 Running 0 9m33s 192.168.44.201 k8s-192-168-44-201.host.com <none> <none>
csi-rbdplugin-6xmjq 3/3 Running 0 4m50s 192.168.44.203 k8s-192-168-44-203.host.com <none> <none>
csi-rbdplugin-drxtc 3/3 Running 0 4m46s 192.168.44.202 k8s-192-168-44-202.host.com <none> <none>
csi-rbdplugin-jgvd7 3/3 Running 0 4m53s 192.168.44.204 k8s-192-168-44-204.host.com <none> <none>
csi-rbdplugin-provisioner-79c9fcd8cb-9w8p6 6/6 Running 0 96m 10.244.172.195 k8s-192-168-44-203.host.com <none> <none>
csi-rbdplugin-provisioner-79c9fcd8cb-ztkvd 6/6 Running 0 96m 10.244.76.3 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-crashcollector-k8s-192-168-44-202.host.com-79d8bkf4w4 1/1 Running 0 71m 10.244.76.9 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-crashcollector-k8s-192-168-44-203.host.com-5fbffg9ccs 1/1 Running 0 71m 10.244.172.199 k8s-192-168-44-203.host.com <none> <none>
rook-ceph-crashcollector-k8s-192-168-44-204.host.com-5995cs54qw 1/1 Running 0 71m 10.244.238.203 k8s-192-168-44-204.host.com <none> <none>
rook-ceph-mgr-a-75cc789ccf-69bfn 2/2 Running 0 71m 10.244.238.199 k8s-192-168-44-204.host.com <none> <none>
rook-ceph-mgr-b-588db8cb7f-xbr7c 2/2 Running 0 71m 10.244.76.6 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-mon-a-659fc96b47-jmtnf 1/1 Running 0 93m 10.244.76.5 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-mon-b-5584ccd58c-plgpw 1/1 Running 0 73m 10.244.238.198 k8s-192-168-44-204.host.com <none> <none>
rook-ceph-mon-c-5b545789cd-rmvmh 1/1 Running 0 72m 10.244.172.198 k8s-192-168-44-203.host.com <none> <none>
rook-ceph-operator-6b87cd9d48-xpfg8 1/1 Running 0 4h32m 10.244.76.2 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-osd-0-86db846df7-ndk6x 1/1 Running 0 71m 10.244.172.201 k8s-192-168-44-203.host.com <none> <none>
rook-ceph-osd-1-7d786c4c75-hmptk 1/1 Running 0 71m 10.244.238.202 k8s-192-168-44-204.host.com <none> <none>
rook-ceph-osd-2-688786c57d-jwfq8 1/1 Running 0 71m 10.244.76.10 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-osd-prepare-k8s-192-168-44-202.host.com-jsv94 0/1 Completed 0 70m 10.244.76.11 k8s-192-168-44-202.host.com <none> <none>
rook-ceph-osd-prepare-k8s-192-168-44-203.host.com-2r6qq 0/1 Completed 0 70m 10.244.172.203 k8s-192-168-44-203.host.com <none> <none>
rook-ceph-osd-prepare-k8s-192-168-44-204.host.com-hdfbx 0/1 Completed 0
验证集群
kubectl apply -f toolbox.yaml
kubectl -n rook-ceph get pod -l "app=rook-ceph-tools"
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash
================================================
$ ceph -s
cluster:
id: 4cf329c1-ab1a-4ad7-8838-c4d18ecf9a0b
health: HEALTH_OK
services:
mon: 3 daemons, quorum b,a,c (age 14m)
mgr: b(active, since 13m), standbys: a
osd: 3 osds: 3 up (since 13m), 3 in (since 13m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 14 MiB used, 60 GiB / 60 GiB avail
pgs: 1 active+clean
$ ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 300 GiB 300 GiB 354 MiB 354 MiB 0.12
TOTAL 300 GiB 300 GiB 354 MiB 354 MiB 0.12
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 0 0 B 0 95 GiB
replicapool 2 32 35 MiB 156 104 MiB 0.04 95 GiB
块存储使用
cd ~/rook/deploy/examples
kubectl apply -f csi/rbd/storageclass.yaml
##验证
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: mysql-nacos
type: Opaque
stringData:
mysql-root-password: "123456"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
namespace: mysql-nacos
spec:
selector:
matchLabels:
app: mysql
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:latest
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
volumeMounts:
- name: mysql-home
mountPath: /var/lib/mysql
volumes:
- name: mysql-home
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: mysql-nacos
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: rook-ceph-block
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: mysql-nacos
spec:
type: NodePort
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
nodePort: 30336
##查看
[root@021rjsh216161s lkltest]# kubectl get pvc -n mysql-nacos
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound pvc-ea6d97a0-28f1-40ac-8115-1de55b5d02e0 2Gi RWO rook-ceph-block 66d
[root@021rjsh216161s lkltest]# kubectl get po -n mysql-nacos
NAME READY STATUS RESTARTS AGE
mysql-deployment-74ffdf8d6d-vgzc7 1/1 Running 1 (21d ago) 66d