Ceph集群部署
#### 一、Ceph环境准备
> ##### Ceph概述
>
> - 是一种分布式存储系统,具有高扩展、高可用、高性能等特点
> - Ceph可以提供块存储(类似硬盘)、文件存储(MDS)、对象存储(RGW)
> - Ceph支持EB级别的存储空间
>
> ##### 核心组件
>
> - 监视器:MON(Monitor)
> - Monitor负责管理Ceph集群的整体状态、配置信息和监控数据
> - 维护集群状态图和管理守护程序和客户端之间的身份验证
> - 它们定期选举一个Leader来协调集群中的其他节点,并接收和处理客户端和OSD的请求
> - 为了冗余和高可用性,通常至少需要三台Monitor,奇数配置
> - 管理器:MGR(Manager)
> - Manager提供集群管理功能,包括集群状态监控、元数据管理、REST API接口等
> - 托管基于python的模块来管理和公开Ceph集群信息,包括基于web的Ceph仪表板和REST API
> - 以便管理员和用户可视化地管理和操作Ceph集群
> - 高可用性通常需要至少两台Manager,主备配置
> - OSD(Object Storage Daemon)
> - OSD是Ceph存储集群的核心组件
> - 负责存储数据和处理数据的复制、恢复和再平衡
> - 通过检查其他Ceph OSD守护进程的心跳来为Ceph监视器和管理器提供一些监视信息
> - 每个OSD节点都有一个或多个OSD进程来管理对应的存储设备
> - 为了实现冗余和高可用性,通常至少需要三个Ceph OSD
> - MDS(Metadata Server)
> - MDS用于支持Ceph文件系统 (CephFS)
> - 负责维护文件系统的元数据
> - 回答客户端的访问请求,负责文件名到inode的映射,以及跟踪文件锁
> - RGW(RADOS Gateway)
> - RGW是Ceph提供的对象存储网关,兼容S3和Swift协议
> - 它为用户提供了通过RESTful API与Ceph存储集群进行交互的能力
>
> ##### Ceph数据存储
>
> - Object:对象
> - Ceph最底层的存储单元
> - 每个Object包含元数据和数据
> - Pool:存储池
> - 规定了数据冗余的类型和对应的副本分布策略
> - 支持两种类型:副本和纠删码,目前基本上使用的都是3副本类型
> - PG(Placement Groups):数据放置组
> - 作为一个逻辑概念,能更好的分配和定位数据
> - CRUSH:算法
> - Ceph使用数据分布算法
> - 容灾级别的控制策略
> - 支持Ceph存储集群动态扩展、重新平衡和恢复
>
> 三大概念:容器、镜像、仓库,容器从镜像复制,镜像从仓库下载、
>
> ##### Ceph架构图

> 创建虚拟机磁盘:qemu-img create -f qcow2 ecph1-1.qcow2 20G
##### 实验环境准备
```shell
## 实验环境准备,Ceph集群节点添加硬盘(每个节点添加3块至少20G硬盘),调整内存大小(建议4G)
ceph1 --> 192.168.88.11 #额外3块硬盘
ceph2 --> 192.168.88.12 #额外3块硬盘
ceph3 --> 192.168.88.13 #额外3块硬盘
client --> 192.168.88.10
# ansible.cfg配置
[defaults]
inventory = inventory
module_name = shell
host_key_checking = false
roles_path = roles
# inventory配置
[ceph]
ceph1 ansible_ssh_host=192.168.88.11
ceph2 ansible_ssh_host=192.168.88.12
ceph3 ansible_ssh_host=192.168.88.13
[clients]
client ansible_ssh_host=192.168.88.10
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=a
# 验证Ansible配置,确认CEPH节点内存和硬盘信息
ansible all -m ping
ansible ceph -m shell -a "free -h"
ansible ceph -m shell -a "lsblk"
# 更新自定义yum源,加入Ceph相关软件,在pubserver机器上操作
createrepo --update /var/ftp/rpms/ #更新yum源repodata信息
yum clean all; yum repoinfo
## 配置所有节点主机名解析 update_hosts.yml
- name: update hosts
hosts: all
tasks:
- name: add host resolv #修改/etc/hosts文件添加主机名映射
blockinfile: #blockinfile模块类似lineinfile,添加一段内容到指定文件
path: /etc/hosts
block: |
192.168.88.10 client
192.168.88.11 ceph1
192.168.88.12 ceph2
192.168.88.13 ceph3
192.168.88.240 quay.io # 192.168.88.240必须解析为quay.io!!!
# 涉及到cephadm
# 配置所有节点yum源 update_yum.yml
- name: update yum
hosts: all
tasks:
- name: remove dir #删除目录
file:
path: /etc/yum.repos.d/
state: absent
- name: create dir #创建目录
file:
path: /etc/yum.repos.d/
state: directory
- name: upload file #发送repo文件
copy:
src: files/local88.repo
dest: /etc/yum.repos.d/ftpYum_88.repo
## 配置时间同步服务Chronyd,将240主机配置成时间同步服务器
# 配置服务端 修改配置文件:/etc/chrony.conf
25 allow 192.168.88.0/24 #允许88网段主机同步时间
26
27 # Serve time even if not synchronized to a time source.
28 local stratum 10
修改配置文件后重启服务并设置开机自启
# 验证服务启动,端口123,chrony是utp服务
ss -anlup | grep 123
# 配置客户端(使用系统角色)
yum -y install rhel-system-roles
这是一个系统角色集合,提供了一系列预定义的、标准化的Ansible角色;系统角色(System Roles)是一组预定义的Ansible角色,用于自动化配置和管理Linux系统的特定功能,由RedHat官方维护的系统角色集合。
将目录/usr/share/ansible/roles/rhel-system-roles.timesync/*复制到roles目录下
# 利用timesync角色配置时间服务
- name: config ntp
hosts: all
vars:
timesync_ntp_servers:
- hostname: 192.168.88.240
iburst: yes
roles:
- timesync
# 验证
ansible all -m shell -a "chronyc sources"
# 显示一下说明配置正确
ceph2 | CHANGED | rc=0 >>
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* quay.io 10 6 37 12 -5ns[-1285us] +/- 167us
## Ceph节点安装必要软件
# Ceph-Quincy版本采用容器化方式部署,要求Ceph节点有Python3环境,容器管理工具podman或docker,lvm2软件
# 安装必备软件 inst_pkgs.yml
- name: install pkgs
hosts: ceph
tasks:
- name: install pkgs
yum:
name: python39,podman,lvm2 #python3.9、逻辑卷
state: present
## 搭建私有Ceph镜像仓库
# 部署Ceph-Quincy集群需要使用cephadm工具,该工具为一个Python脚本
# 部署过程中需要连接到公网quay.io站点下载Ceph相关镜像
# 为规避无法连接外网或同一时间大量下载造成网络卡顿,故需自己部署一个私有站点quay.io欺骗cephadm工具
# 上传Ceph集群相关文件(cephadm脚本和Ceph镜像)
scp -r /linux-soft/s2/zzg/ceph_soft/ceph-server/ root@192.168.88.240:/root
# 搭建私有镜像仓库
安装docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm
编写配置文件/etc/docker-distribution/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :80 #端口由5000调整为80,必须调整,否则后续下载镜像时会有报错
# 修改配置文件后重启服务
systemctl enable --now docker-distribution.service
# 确认80端口被registry进程占用
ss -antpul | grep :80
# 确认此时仓库为空
curl http://localhost/v2/_catalog
# 导入ceph镜像
# 修改域名解析/etc/hosts
192.168.88.240 quay.io
# 配置私有仓库,文件最后追加 /etc/containers/registries.conf
[[registry]] #ctrl+n代码补全
location = "quay.io" #私有仓库地址
insecure = true #可以使用http协议
# 导入Ceph相关镜像到本地
for i in *.tar
do
podman load -i $i
done
# 查看服务
podman images
# 推送镜像到私有仓库
podman push quay.io/ceph/ceph:v17
podman push quay.io/ceph/ceph-grafana:8.3.5
podman push quay.io/prometheus/prometheus:v2.33.4
podman push quay.io/prometheus/node-exporter:v1.3.1
podman push quay.io/prometheus/alertmanager:v0.23.0
# 验证私有仓库中Ceph镜像保存情况
curl http://quay.io/v2/_catalog
# 配置Ceph节点使用私有镜像仓库 config_priv_registry.yml
- name: config private registry
hosts: ceph
tasks:
- name: add quay.io #配置私有registry仓库
blockinfile:
path: /etc/containers/registries.conf
block: |
[[registry]]
location = "quay.io"
insecure = true
# 验证
ansible ceph -m shell -a 'tail -5 /etc/containers/registries.conf'
# 建议搭建Ceph集群前临时撤掉Ceph节点网关,禁止Ceph节点连接公网
# 目的是防止因准备步骤有误造成去公网拉取镜像造成网络阻塞甚至导致集群初始化或扩容失败
ansible ceph -m shell -a "route del default gw 192.168.88.254"
```
#### 二、Ceph集群搭建
> 所有Ceph集群搭建准备工作已完成,给Ceph[1..3]三个节点创建快照,Ceph集群采用容器化方式部署,一旦出错处理非常复杂
##### Cephadm工具介绍
- Cephadm使用"容器和systemd"来"安装和管理"Ceph集群,并与CLI(命令行)和dashboard GUI紧密集成
- cephadm与新编排的API完全集成,并完全支持新的CLI和仪表板功能来管理集群部署
- cephadm需要容器支持(podman或docker)和Python 3
- cephadm是一个用于管理Ceph集群的实用程序,对容器增删改
##### Ceph创建集群
```shell
# Ceph在使用过程中是无中心化结构,但搭建过程中选择集群某一个节点作为初始化管理节点,然后扩容其他节点,本次实验选择Ceph1节点作为初始化节点
# 将cephadm传给ceph1初始化节点并添加脚本执行权限
sed -ri '/5000/s/:5000//' cephadm #必须操作,调整镜像地址!!
sed -rn '46,60p' cephadm #确认cephadm脚本中:5000被去掉
# 指定初始化节点IP地址,指定dashboard面板密码,不更新dashboard面板密码
./cephadm bootstrap --mon-ip 192.168.88.11 --initial-dashboard-password=123456 --dashboard-password-noupdate
# 等待三分钟左右,确认初始化结果(Ceph1节点下载5个镜像,启动7个容器)
podman images
podman ps
## 管理Ceph集群,在ceph1初始化节点下操作
# 方法一:./cephadm shell进入管理容器,无需额外装包但命令行无法补全
# 方法二:安装ceph-common包,额外装包但命令行可以补全
yum -y install ceph-common.x86_64 #装完包后重新登录终端刷新bash环境
# 查看Ceph集群状态
ceph -s
# 查看Ceph集群容器信息,n/m的含义是"正在运行/预期运行"
ceph orch ls
# 同步ceph公钥(Quincy版本的Ceph使用自己的ssh秘钥,用于后续操作扩容进集群的节点)
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph1
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph3
# Ceph集群扩容
ceph orch host ls
ceph orch host add ceph2 192.168.88.12 #将ceph2加入集群
ceph orch host add ceph3 192.168.88.13 #将ceph3加入集群
# 确认Ceph集群扩容情况
ceph orch host ls
#ceph2/3新节点加入集群下载镜像需要时间,扩容结果不会立即完成
# 调整mon和mgr数量
ceph orch apply mon --placement="3 ceph1 ceph2 ceph3" #在三台机器中随机挑选三台布置mon
ceph orch apply mgr --placement="3 ceph1 ceph2 ceph3" #在三台机器中随机挑选三台布置mgr
# 获取mon与mgr的状态信息,数量与输入的集群节点数量相等说明调整成功
ceph mon stat
ceph mgr stat
# 启动OSD,绑定Ceph节点上的硬盘设备(每个硬盘设备对应一个OSD守护进程)
ceph orch daemon add osd ceph1:/dev/vdb #包含ceph[1..3]的vd[b,c,d]总共9块硬盘
# 添加所有所有硬盘
ceph orch apply osd --all-available-devices
# 检查Ceph相关进程状态和数量:ceph orch ls
#查看Ceph集群所有的容器:ceph orch ps
ceph orch ps --daemon-type=mon #3个容器
ceph orch ps --daemon-type=mgr #3个容器
ceph orch ps --daemon-type=osd #9个容器
# 至此Ceph集群已搭建完成
```
> 故障排查
>
> 把有error相应的服务删除:ceph orch daemon rm node-expoter.ceph2
>
> 重新配置:ceph orch daemon reconfig node-exporter.ceph2
>
> 重新部署mgr:ceph orch daemon reconfig mgr ceph2
#### 三、Ceph块存储
概念
- 块存储
- 就是可以提供像硬盘一样的设备
- 使用块存储的节点,第一次连接块设备,需要对块设备进行分区、格式化,然后挂载使用
```shell
## Ceph提供块存储
# 查看Ceph存储空间:共180G空间,默认3副本,最大存储60G数据
ceph osd pool get .mgr size #获取存储池副本数
# 创建存储池
ceph osd pool ls
#创建名为rbd的存储池
ceph osd pool create rbd 64
#设置存储池类型为rbd
ceph osd pool application enable rbd rbd
## Ceph中的镜像管理
# 镜像管理命令rbd默认操作名为rbd的存储池,如果自定义存储池名称需带上--pool [poolname]
# 查看镜像
rbd ls 或 rbd ls --pool rbd
# 创建镜像
rbd create img1 --size 10G
# 查看镜像详情
rbd info img1
# 镜像扩容/缩容
rbd resize img1 --size 200G #扩容,并不会立即分配所有空间
rbd resize img1 --size 20G --allow-shrink #缩容,基本用不到
# 删除镜像
rbd remove img1 #删除指定镜像
## 客户端使用Ceph块设备(client下操作)
# 装包
yum -y install ceph-common
# 获取集群配置文件和用户认证文件
scp root@192.168.88.11:/etc/ceph/ceph.conf /etc/ceph/
scp root@192.168.88.11:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
ceph -s #客户端已经可以操作Ceph集群
# 客户端使用Ceph块设备
# 创建块设备
rbd create img1 --size 10G
rbd ls #查看块设备
rbd info img1 #查看img1设备信息
rbd map img1 #映射Ceph镜像到本地
rbd showmapped #查看映射关系
rbd status img1 #查看img1状态
# 映射本地后格式化、挂载、卸载,等同于本地磁盘操作
# 格式化硬盘——挂载硬盘——使用硬盘——卸载硬盘
rbd unmap img1 #取消映射关系
rbd remove img1 #删除镜像
```