Ceph介绍
Ceph官方文档:https://docs.ceph.com/en/quincy/
Ceph可以有
- Ceph对象存储:键值存储,其接口就是简单的GET,PUT,DEL等。如七牛,阿里云oss等
- Ceph块设备:AWS的EBS,青云的云硬盘和阿里云的盘古系统,还有Ceph的RBD(RBD是Ceph面向块存储的接口)
- Ceph文件系统:它比块存储具有更丰富的接口,需要考虑目录、文件属性等支持,实现一个支持并行化的文件存储应该是最困难的。
一个Ceph存储集群需要
- 至少一个Ceph监视器、Ceph管理器、Ceph OSD(对象存储守护程序)
- 需要运行Ceph文件系统客户端,则需要部署 Ceph Metadata Server。
- Monitors: Ceph Monitor (
ceph-mon
) 监视器:维护集群状态信息- 维护集群状态的映射,包括监视器映射,管理器映射,OSD映射,MDS映射和CRUSH映射。
- 这些映射是Ceph守护程序相互协调所必需的关键群集状态。
- 监视器还负责管理守护程序和客户端之间的身份验证。
- 通常至少需要三个监视器才能实现冗余和高可用性。
- Managers: Ceph Manager 守护进程(
ceph-mgr
) : 负责跟踪运行时指标和Ceph集群的当前状态- Ceph Manager守护进程(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态
- 包括存储利用率,当前性能指标和系统负载。
- Ceph Manager守护程序还托管基于python的模块,以管理和公开Ceph集群信息,包括基于Web的Ceph Dashboard和REST API。
- 通常,至少需要两个管理器才能实现高可用性。
- Ceph OSDs: Ceph OSD (对象存储守护进程,
ceph-osd
) 【存储数据】- 通过检查其他Ceph OSD守护程序的心跳来存储数据,处理数据复制,恢复,重新平衡,并向Ceph监视器和管理器提供一些监视信息。
- 通常至少需要3个Ceph OSD才能实现冗余和高可用性。
- MDSs: Ceph Metadata Server (MDS,
ceph-mds
ceph元数据服务器)- 存储能代表 Ceph File System 的元数据(如:Ceph块设备和Ceph对象存储不使用MDS).
- Ceph元数据服务器允许POSIX文件系统用户执行基本命令(如ls,find等),而不会给Ceph存储集群带来巨大负担
Ceph架构:
官方推荐的安装方式:通过Cephadm或者Rook安装,而在官方文档中直接说明在k8s中用rook安装运行ceph。
rook和ceph是什么关系?
Rook 是一个开源云原生存储编排器,为各种存储解决方案提供平台、框架和支持,以便与云原生环境进行原生集成。
Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务。它通过自动化部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理来实现这一点。 Rook 使用底层云原生容器管理、调度和编排平台提供的设施来履行其职责。 Rook 利用扩展点深度集成到云原生环境中,并为调度、生命周期管理、资源管理、安全性、监控和用户体验提供无缝体验。
准备环境环境
我这里准备了一个三主三从的k8s集群:k8s版本1.21.1
安装ceph的前提条件:https://rook.io/docs/rook/v1.9/Getting-Started/Prerequisites/prerequisites/#ceph-prerequisites
需要准备空的硬盘,无格式化文件系统。
我已经提前准备好:三个node节点都分别挂载了一个空的磁盘,设备名叫做sdb。(不会的自行百度,这里不介绍)
[root@k8s-node1 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
sr0 iso9660 CentOS 7 x86_64 2019-09-11-19-02-53-00
sda
├─sda2 LVM2_member TyxKHQ-OqOq-21je-Gvij-5sRm-S4oh-nwkXl8
│ ├─centos-swap swap ee0f3f30-eea1-4b21-a06c-7e0eb57bfde7
│ ├─centos-home xfs cf60f3b7-3dc8-4722-b621-8780560994f0 /home
│ └─centos-root xfs bc9c74aa-8c31-4302-bce4-198aaf9429de /
└─sda1 xfs 369d0015-8436-42ec-a5e3-0996759efe95 /boot
安装
部署&修改operator
在k8s主节点执行;
git clone --single-branch --branch v1.6.3 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/ceph/
下载完官方给的源码后,修改operator.yaml
,把默认镜像改成阿里云加速的镜像
ROOK_CSI_CEPH_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/cephcsi:v3.3.1"
ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-node-driver-registrar:v2.0.1"
ROOK_CSI_RESIZER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-resizer:v1.0.1"
ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-provisioner:v2.0.4"
ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-snapshotter:v4.0.0"
ROOK_CSI_ATTACHER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-attacher:v3.0.2"
kubectl create -f crds.yaml -f common.yaml -f operator.yaml #注意修改operator.yaml
# verify the rook-ceph-operator is in the `Running` state before proceeding
kubectl -n rook-ceph get pod
部署集群
修改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: "3" # this value can be overridden at the node or device level
# encryptedDevice: "true" # the default value for this option is "false"
nodes:
- name: "k8s-node3"
devices:
- name: "sdb"
- name: "k8s-node1"
devices:
- name: "sdb"
- name: "k8s-node2"
devices:
- name: "sdb"
这里需要注意nodes里面name和devices.name要对应上。
然后osds的数目我改成了3.
第二处修改:改成由阿里云加速的镜像
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ceph-ceph:v15.2.11
第三处修改:count由1改成2,这样mgr会自动变成主从架构。
修改完成后,执行
kubectl apply -f cluster.yaml
watch -n 1 kubectl get pod -n rook-ceph #要确保一定要有以下组件,具体pod数目可能与我不一样,与node节点数目已经配置文件中配置的数目有关。(各种pod数目可能和我不一样,但要确保各种pod都有)
我这里大概花了十几分钟,最后部署好了。具体看服务器配置和网速。
安装ceph官方工具
kubectl create -f toolbox.yaml -n rook-ceph
#查看pod
kubectl get pod -n rook-ceph -l app=rook-ceph-tools
#进入pod
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
#查看集群状态
ceph status
#查看osd状态
ceph osd status
#集群空间用量
ceph df
暴露dashboard
暴露ceph的dashboard成svc:
vi mysvc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: rook-ceph-mgr
ceph_daemon_id: a
rook_cluster: rook-ceph
name: rook-ceph-mgr-dashboard-active
namespace: rook-ceph
spec:
ports:
- name: dashboard
port: 8443
protocol: TCP
targetPort: 8443
selector: #service选择哪些Pod
app: rook-ceph-mgr
ceph_daemon_id: a
rook_cluster: rook-ceph
sessionAffinity: None
type: NodePort
kubectl apply -f mysvc.yaml
kubectl get svc -n rook-ceph
浏览器访问32515端口,https://192.168.1.121:32515/
ceph控制台默认账号 admin
获取默认密码:
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
进入首页:
去除警告:AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED
#进入toolbox
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
ceph config set mon auth_allow_insecure_global_id_reclaim false
配置完成后,状态立马就改变了。
部分参考:https://blog.csdn.net/qq_14999375/article/details/118110564
基本使用
块存储(RDB)
RDB: RADOS Block Devices
RADOS: Reliable, Autonomic Distributed Object Store
不能是RWX模式。
cd rook/cluster/examples/kubernetes/ceph/csi/rbd
#创建存储类和CephBlockPool
kubectl apply -f storageclass.yaml
#查看存储类
kubectl get sc
测试:
创建一个statefulSet:
vi sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-nginx
namespace: default
spec:
selector:
matchLabels:
app: sts-nginx # has to match .spec.template.metadata.labels
serviceName: "sts-nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: sts-nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: sts-nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "rook-ceph-block" #使用块存储存储类
resources:
requests:
storage: 20Mi
---
apiVersion: v1
kind: Service
metadata:
name: sts-nginx
namespace: default
spec:
selector:
app: sts-nginx
type: ClusterIP
ports:
- name: sts-nginx
port: 80
targetPort: 80
protocol: TCP
kubectl apply -f sts.yaml
kubectl get pvc
kubectl get pvc www-sts-nginx-0
查看pvc,都是Bound
状态。
kubectl get pvc -A
查看dashboard: