• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Linux集群教程08 部署分布式存储Ceph高可用集群

武飞扬头像
Dark_Ice_
帮助1

轻松部署分布式存储Ceph高可用集群

主要内容概述

  • 常见存储方式
  • Ceph 方式和特性
  • Ceph 架构组成
  • Ceph 网络模型
  • Ceph 版本
  • Ceph 部署方法介绍
  • 基于 Ceph-deploy 部署 Ceph
  • 扩展 Ceph 集群实现高可用

1 存储基础

1.1 传统存储

传统的存储类型:

  • DAS设备:直连存储

SAS,SATA,SCSI,IDE,USB

无论是那种接口,都是存储设备驱动下的磁盘设备,而磁盘设备其实就是一种存储,这种存储是直接接入到主板总线上去的。

不支持跨网络通信,并且容易发生故障。

  • NAS设备:网络附加存储

NFS,CIFS,FTP

几乎所有的网络存储设备基本上都是以文件系统样式进行使用的,无法进一步格式化操作

支持跨网络通信,主机和存储之间是分开的。在存储上是一个文件,不能进行管理空间资源和文件系统,只能使用存储里的文件。通信是通过文件的形式实现的。

NAS 一般的应用场景是共享存储。

  • SAN:存储区域网络

SCSI 协议,FC SAN,iSCSI

基于 SAN 方式提供给客户端操作系统的是一种块设备接口,这些设备间主要通过 SCSI 协议来完成正常的通信。

SCSI 的结构类似于TCP/IP 协议,也有很多层,但是SCSI协议主要是用来进行存储数据操作的。既然是分层方式实现的,那就是说,有部分层可以被替代。比如将物理层基于 FC 方式来实现,就形成了 FC SAN,如果基于以太网方式来传递数据,就形成了 iSCSI 模式。

支持跨网络通信,主机和存储之间是分开的。一般使用光纤连接比较多,依附于硬件,需要安装特定的硬件HDA。SAN在使用的时候是基于 块(跟硬盘类似)的方式进行数据共享。存储方式在远程的存储服务器,存储空间会很大,可以进行管理资源和文件系统。

SAN 要通过不同的角度进行理解,SAN 整体的存储空间是共享的,但是在SAN 存储空间中划分给主机使用的空间则是独享的。

DAS直连存储 和 SAN存储区域网络 存储方式底层都是使用块的方式进行存储。SAN 存储一般是商业化存储。SAN 分配出去的存储是独享。NAS 网络附加存储的存储方式是共享的。

1.2 传统的存储方式问题

  • 存储处理能力不足

传统的 IDE 的值是100次/秒,SATA 固态硬盘 500次/秒,NVMe 固态硬盘达成 2000-4000次/秒,即使硬盘的IO能力再大数十倍,难道能够抗住网站访问高峰期的数十万,数百万甚至数亿用于的同时访问么?这同时还要受到主机网络IO能力的影响限制。

  • 存储空间能力不足

单块磁盘的容量增大,也无法满足用户的正常访问所需的数据容量限制。

  • 单点问题

单主机存储数据存在 SPOF(Single point of failure)问题

2 Ceph 简介和特性

学新通

Ceph 是一个多版本的开源存储系统,它把每一个待管理的数据流(例如一个文件)切分成一到多个固定大小的对象数据,并以其为原子单元完成数据存取。(横向扩展方便,内置了副本技术,副本数默认是3。单机是无法实现Ceph,只能通过集群来实现Ceph)

Ceph 可以实现NAS和SAN以及OSS对象存储功能。

对象数据的底层服务是由多个主机(Host)组成的存储集群,该集群也称之为 RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠,自动化,分布式对象存储系统。

librados 是 RADOS 存储集群的 API,它支持 C、C 、Java、Python、Ruby 和PHP等编程语言。

学新通

Ceph 项目最早起源于 Sage 就读博士期间的工作(最早的成果于2004年发表,论文发表于2006年),并随后贡献给开源社区。

ceph官网:https://ceph.com/en/

ceph文档官网:https://docs.ceph.com/en/latest

github地址:https://github.com/ceph/ceph

Ceph通过内部的 crush 机制,实时方式计算出一个文件应该存储到哪个存储对象里面,从而实现快速查找对象的一种方式。

为什么 Ceph 这么火?

  • 功能强大:Ceph 能够同时提供对象存储(访问是基于通过URL的方式),块存储(SAN)和文件系统存储(NAS)三种存储服务的统一存储架构
  • 可扩展性:Ceph 得以摒弃了传统的集中式存储元数据寻址方式,通过内置Crush算法的寻址操作,有相当强大的扩展性
  • 高可用性:Ceph 数据副本数量可以由管理员自行定义,并可以通过 Crush 算法指定副本的物理存储位置以分割故障域,支持数据强一致性的特性也使得Ceph具有了高可靠性,可以忍受多种故障场景并自动尝试并行修复

RadosGW、RBD和CephFS都是RADOS存储服务的客户端,它们把RADOS的存储服务接口(librados)分别从不同的角度做了进一步的抽象,因而各自适用于不同的应用场景。

学新通

在RADOS集群之上,Ceph构建了块存储、文件存储和对象存储等存储形态。由于RADOS集群本身是以对象为粒度进行数据存储的,因此上述三种存储形态,在最终存储数据的时候都划分为对象。

也就是说,Ceph 将三种三种存储类型统一在一个平台中,从而实现了更加强大的适用性。

学新通

LIBRADOS - 通过自编程方式实现数据的存储能力

RADOSGW - 通过标准的RESTful接口,提供一种云存储服务

RBD - 将ceph提供的空间,模拟成一个个的独立块设备。当ceph环境部署完成之后,服务端就准备好RBD接口

CFS - 通过一个标准的文件系统接口来进行数据的存储

#参考地址:https://docs.ceph.com/en/pacific/_images/stack.png

类型 典型设备 优点 缺点 使用场景
cephfsNAS的特性 FTP、NFS服务器为了克服块存储文件无法共享的问题,所以有了文件存储。在服务器上架设FTP与NFS服务,就是文件存储 1 造价低2 方便文件共享 1 读写速率低2 传输速度慢 1 日志存储2 有目录结构的文件存储
rbdSAN的特性 磁盘陈列,硬盘主要是将裸磁盘空间映射给主机使用 1 通过Raid与LVM等手段,对数据提供了保护2 多块廉价的硬盘组合起来,提高容量3 多块磁盘组合出来的逻辑盘,提升读写效率 1 采用 SAN 架构组网时,光纤交换机,造价成本高2 主机之间无法共享数据 1 docker容器、虚拟机磁盘存储分配2 日志存储3 文件存储
rgwOSS的特性 内置大容量硬盘的分布式服务器(swift,s3)多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能 1 具备块存储的读写高速2 具备文件存储的共享等特性   (适合更新变动较少的数据)1 图片存储2 视频存储

3 Ceph 组件

学新通

无论是想向云平台提供 Ceph 对象存储和Ceph 块设备服务,部署 Ceph 文件系统,或者是将 Ceph 用于其他目的,所有的Ceph 用于其他目的,所有 Ceph 存储集群部署都从设置每个 Ceph 节点,网络开始。

一个 Ceph 存储集群至少需要一个 Ceph Monitor,Ceph Manager 和 Ceph OSD(OBJECT STORAGE DAEMON对象存储守护进程)。此外如果有运行 Ceph 文件系统的客户端,还需要配置 Ceph 元数据服务器。

学新通

组件 解析
Monitors核心组件 Ceph Monitors(守护进程 ceph-mon)维护集群状态的映射,包括监视器映射,管理器映射,OSD映射,MDS映射和CRUSH映射。这些映射都是 Ceph 守护进程相互协调所需的关键集群状态。监视器还负责守护进程和客户端之间的身份验证。通常至少需要三个监视器才能实现冗余和高可用性。基于 paxos 协议实现节点间的信息同步。
Managers Ceph 管理器(守护进程 ceph-mgr)负责跟踪运行时指标和 Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph 管理器守护进程还托管基于 Python 的模块来管理和开发 Ceph 集群信息,包括基于 Web 的 Ceph 仪表盘和 REST API。高可用性通常至少需要两个管理器,基于 RAFT 协议实现节点间的信息同步
Ceph OSDs提供存储空间 Ceph OSD(Object Storage Daemon 对象存储守护进程 ceph-osd)存储数据,处理数据复制、恢复、重新平衡,并且通过检查其他 Ceph OSD 守护进程的心跳来向 Ceph 监视器和管理器提供一些监控信息。通常至少需要 3 个Ceph OSD来实现冗余和高可用性。本质上osd就是一个个host主机上的存储磁盘。
MDSs可选组件[用于CephFS] Ceph 元数据服务器(MDS[Metadata Server]、ceph-mds)代表Ceph文件系统存储元数据,Ceph元数据服务器允许POSIX(为应用程序提供的接口标准)文件系统用户执行基本命令(如ls,find等),而不会给 Ceph 存储集群带来巨大的负担。

4 Ceph 网络模型

Ceph 生成环境中一般分为两个网段:

  • 公有网络:用于用户的数据通信

    • 用户通过公有网络来访问Ceph集群
  • 集群网络:用于集群内部的管理通信

    • Ceph集群组件之间的通信网络,例如:数据交换

学新通

5 Ceph 版本

每个Ceph的版本都有一个英文的名称和一个数字形式的版本编号

第一个Ceph版本编号是 0.1,发布于 2008 年 1 月,之后是 0.2,0.3,… 多年来,版本号方案一直没变

2015 年 4月 0.94.1(Hammer 的第一个修正版)发布后,为了避免 0.99(以及0.100胡总1.00?),制定了新的策略

x 将从 9 算起,它代表版本名称 Infernalis (I 是第九个字母),这样第九个发布周期的第一个开发版就是 9.0.0;后续的开发版依次是 9.0.1、9.0.2 等等

  • x.0.z - 开发版(测试环境,个人爱好可以使用)
  • x.1.z - 候选版(测试环境,个人爱好可以使用)
  • x.2.z - 稳定,修正版(生产环境使用)

Ceph 版本说明:

https://docs.ceph.com/en/latest/releases/

学新通

The following Ceph releases are actively maintained and receive periodic backports and security fixes.

Name Initial release Latest End of life (estimated)
Quincy 2022-04-19 17.2.0 2024-06-01
Pacific 2021-03-31 16.2.8 2023-06-01
Octopus 2020-03-23 15.2.16 2022-06-01

The following older Ceph releases are no longer maintained (do not receive bug fixes or backports).

Name Initial release Latest End of life
Nautilus 2019-03-19 14.2.22 2021-06-30
Mimic 2018-06-01 13.2.10 2020-07-22
Luminous 2017-08-01 12.2.13 2020-03-01
Kraken 2017-01-01 11.2.1 2017-08-01
Jewel 2016-04-01 10.2.11 2018-07-01
Infernalis 2015-11-01 9.2.1 2016-04-01
Hammer 2015-04-01 0.94.10 2017-08-01
Giant 2014-10-01 0.87.2 2015-04-01
Firefly 2014-05-01 0.80.11 2016-04-01
Emperor 2013-11-01 0.72.2 2014-05-01
Dumpling 2013-08-01 0.67.11 2015-05-01
版本名称 版本号 发布时间
Argonaut 0.48版本(TLS) 2012年6月3日
Bobtail 0.56版本(TLS) 2013年5月7日
Cuttlefish 0.61版本 2013年1月1日
Dumpling 0.67版本(TLS) 2013年8月14日
Emperor 0.72版本 2013年11月9日
Firefly 0.80版本(TLS) 2014年5月
Giant Giant 2014年10月-2015年4月
Hammer Hammer 2015年4月-2016年11月
lnfernalis Infernalis 2015年11月-2016年6月
Jewel 10.2.9 2017年10月
Kraken 11.2.1 2017年10月
Luminous 12.2.12 2017年10月
mimic 13.2.7 2018年5月
nautilus 14.2.5 2019年2月

6 Ceph 部署方法介绍

由于Ceph组件众多以及环境复杂,所以官方提供了多种的快速部署工具和方法。

参考资料:

https://docs.ceph.com/en/pacific/install/

学新通

部署方式 特点解析
cephadm 使用容器和systemd安装和管理Ceph集群,并与CLI和仪表盘GUI紧密集成,只支持Octopus以后的新版本,当前官方推荐
ceph-deploy 一个基于Python实现流行的快速部署集群的工具,此工具从Nautilus版后不再支持和测试,建议使用此工具安装Nautilus之前的就版本
rook 在Kubernetes中运行的Ceph集群,同时还支持通过Kubernetes API管理存储资源和配置。只支持Nautilus以后的新版本,此工具不支持RHEL8,CentOS8较新的OS
ceph-ansible 使用Ansible部署和管理Ceph集群,应用较广。但是从Nautilus和Octopus版没有集成对应的API,所以较新的管理功能和仪表板集成不可用
ceph-salt 使用Salt 和 cephadm 安装 Ceph 集群
ceph-mon 使用 Juju(模型驱动的 Kubernetes Operator 生命令周期管理管理器OLM)安装Ceph
puppet-ceph 通过 Puppet 安装 Ceph
二进制 手工安装
windows图形 在Windows主机上通过图形操作就可以进行部署

7 Ceph 环境规则

#网络配置
公有网络public:10.0.0.0/24
集群网络cluster:192.168.10.0/16

#Ceph存储节点磁盘规划
磁盘1:系统盘
磁盘2:OSD磁盘
磁盘3:OSD磁盘
......
磁盘N:OSD磁盘

#主机规划
主机名的完整格式:[ceph].kubesphere.com

主机名			公有网络		私有网络					 磁盘				 			操作系统类型		 角色
admin			10.0.0.100	192.168.10.100		sda							ubuntu20.04			部署节点、远程管理节点
mon01			10.0.0.101	192.168.10.101		sda							ubuntu20.04			管理节点,监视器节点
mon02			10.0.0.102	192.168.10.102		sda							ubuntu20.04			管理节点,监视器节点
mon03			10.0.0.103	192.168.10.103		sda							ubuntu20.04			管理节点,监视器节点
mgr01			10.0.0.104	192.168.10.104		sda							ubuntu20.04			管理节点
mgr02			10.0.0.105	192.168.10.105		sda							ubuntu20.04			管理节点
store01		10.0.0.106	192.168.10.106		sda、sdb、sdc		 ubuntu20.04	  存储节点
store02		10.0.0.107	192.168.10.107		sda、sdb、sdc		 ubuntu20.04	  存储节点
store03		10.0.0.108	192.168.10.108		sda、sdb、sdc		 ubuntu20.04	  存储节点

#注意:Ceph的集群角色非常多,生产中主机最少的时候,可以让一台主机节点运行多个角色
#比如:可以store01-03这三台主机同时兼备mon和mgr的角色
学新通

版本的选择

版本地址:https://docs.ceph.com/en/latest/releases/
版本特性:x.0.z(开发版)、x.1.z(候选版)、x.2.z(稳定,修正版)
选择版本:Pacific v16.2.z

8 基于 Ceph-deploy 部署 Ceph

8.1 环境准备

8.1.1 操作系统

所有主机采用 Ubuntu 20.0.4

8.1.2 硬件配置

所有节点 2C 2G

OSD存储节点都准备三块盘,所有节点两块网卡(公有网络,集群网络)

虚拟网络设置:

eth0:NAT网络,VMnet8 设定为 10.0.0.0 网段,提供公共网络
eth1:仅主机模式 VMnetN 设定为 192.168.10.0 网段,提供Ceph集群网络

每个主机额外添加两块盘,每个根据自己的情况设定容量,这里设置为1024G(按需提供存储空间)

sda:200G
sdb:1024G
sdc:1024G

8.1.3 时间同步

对于任何一个集群来说,时间同步是非常重要的。

Ceph 要求更高,默认各节点的时间误差不能超过 50ms

~ timedatectl set-timezone Asia/Shanghai

8.1.4 防火墙和SELinux 管理

#Ubuntu关闭防火墙
ufw stop
ufw disable

#CentOS关闭防火墙
systemctl disable --now firewalld
systemctl disable --now iptables

8.1.5 主机名解析

在所有的主机节点都配置下面的内容

cat >> /etc/hosts <<EOF

#Ceph Cluster Host BEGIN
10.0.0.100 admin.kubesphere.com admin
10.0.0.101 mon01.kubesphere.com mon01
10.0.0.102 mon02.kubesphere.com mon02
10.0.0.103 mon03.kubesphere.com mon03
10.0.0.104 mgr01.kubesphere.com mgr01
10.0.0.105 mgr02.kubesphere.com mgr02
10.0.0.106 store01.kubesphere.com store01
10.0.0.107 store02.kubesphere.com store02
10.0.0.108 store03.kubesphere.com store03
#Ceph Cluster Host END
EOF

随着生产中的主机节点越来越多,通过手工定制主机名的方式就不太适合集群的主机管理了。所以在企业中,主机名相关的信息,倾向于通过内网的DNS来进行管理。

尤其是等我们到了 RADOSGW 的时候,需要通过泛域名解析的机制来实现更为强大的面向客户端的主机名管理体系。

8.1.6 实现基于ssh key 的验证

此步骤可选择,只为了后续操作的方便,过程忽略。

apt install -y expect #用于ubuntu系统
yum install -y expect #用于centos系统

#部署节点生成ssh-key的操作
ssh-keygen #一直回车即可
for ip in {100..108};do ssh-copy-id 10.0.0.${ip};done #将密钥提交到各个主机中

#Bash Shell脚本
~ vim ssh_key_push.sh
#当前用户的密码
PASS="magedu"
#设置网段最小和最大的地址的尾数
BEGIN=3
END=254

IP=$(ip addr show eth0 | awk -F'[ /] ' 'NF==3{print $3}')
NET=${IP%.*}

. /etc/os-release

function color()
{
  RES_COL=60;
  MOVE_TO_COL="echo -en \\033[${RES_COL}G";
  SETCOLOR_SUCCESS="echo -en \\033[1;32m";
  SETCOLOR_FAILURE="echo -en \\033[1;31m";
  SETCOLOR_WARNING="echo -en \\033[1;33m";
  SETCOLOR_NORMAL="echo -en \E[0m";
  echo -n "$1" && $MOVE_TO_COL;
  echo -n "[";
  if [ $2 = "success" -o $2 = "0" ] ;then
    ${SETCOLOR_SUCCESS};
    echo -n $"  OK  ";
  elif [ $2 = "failure" -o $2 = "1" ] ;then
    ${SETCOLOR_FAILURE};
    echo -n $"FAILED";
  else
    ${SETCOLOR_WARNING};
    echo -n $"WARNING";
  fi
  ${SETCOLOR_NORMAL};
  echo -n "]";
  echo
}

#安装sshpass
function install_sshpass()
{
  if [[ $ID =~ centos|rocky|rhel ]] ;then
    rpm -q sshpass &> /dev/null || yum install -y sshpass
  else
    dpkg -l sshpass &> /dev/null || { sudo apt update;sudo apt install -y sshpass; }
  fi
  if [ $? -ne 0 ] ;then
    color '安装 sshpass 失败!' 1
    exit 1
  fi
}

function scan_host()
{
  [ -e ./SCANIP.log ] && rm -rf SCANIP.log
  for ((i=$BEGIN;i<="$END";i  ));do
    ping -c 1 -W 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
  done
  wait
}

function push_ssh_key()
{
  #生成ssh key
  [ -e ~/.ssh/id_rsa ] || ssh-keygen -P "" -f ~/.ssh/id_rsa
  sshpass -P $PASS ssh-copy-id StrictHostKeyChecking=no ${USER}@${IP} &> /dev/null
  
  ip_list=(`sort -t . -k 4 -n SCANIP.log`)
  for ip in ${ip_list[*]};do
    sshpass -p $PASS scp -o StrictHostKeyChecking=no -r ~/.ssh ${USER}@${ip}: &> /dev/null
  done
  
  #把.ssh/known_hosts拷贝到所有主机,使得它们第一次互相访问时不需要输入yes回车
  for ip in ${ip_list[*]};do
    scp ~/.ssh/known_hosts ${USER}@${ip}:.ssh/ &> /dev/null
    color "$ip" 0
  done
}

install_sshpass
scan_host
push_ssh_key
学新通

8.2 创建 Ceph 的管理用户

8.2.1 创建Ceph集群的管理用户 cephadm 用户

由于接下来的所有操作,基本上都在admin这个管理节点的主机上来运行,基于安全考虑不推荐直接使用root用户来管理,倾向于通过一个普通用户来操作接下来的操作。

由于后续的安装软件,涉及到root用户权限的操作,所以这个普通用户最好具备sudo的权限。

注意:此管理用户不要使用ceph的名称,ceph后续会自动创建此用户

方法1

#在所有主机上都创建普通用户
useradd -m -s "/bin/bash" cephadm
echo cephadm:123456 | chpasswd

#为用户配置root权限
echo "cephadm ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/cephadm
chmod 0440 /etc/sudoers.d/cephadm

方法2

#用脚本实现批量创建用户
cat > create_cephadm.sh <<EOF
#!/bin/bash
#设定普通用户
useradd -m -s /bin/bash cephadm
echo cephadm:123456 | chpasswd
echo "cephadm ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/cephadm
chmod 0440 /etc/sudoers.d/cephadm
EOF

#批量执行
for i in {100..108};do ssh root@10.0.0.$i bash < create_cephadm.sh;done

8.2.2 所有主机通过cephadm用户实现免密码认证

su - cephadm
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

#跨主机密码认证
sudo apt install -y sshpass
PASS=123456
for i in {100..108};do
  sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no cephadm@10.0.0.$i
done

8.3 管理主机节点部署 Ceph 的安装环境

8.3.1 在所有节点准备安装源配置

admin~ cat > ceph_repo.sh <<EOF
#!/bin/bash
#更新ceph的软件源信息
#echo "deb http://mirrors.aliyun.com/ceph/debian-pacific/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ceph.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ceph.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
EOF

#因为所有节点都会依赖于这些apt源信息,需要进行同步
admin~ for i in {100..108}; do ssh -o strictHostKeychecking=no 10.0.0.$i bash < ceph_repo.sh;done

8.3.2 admin 节点主机安装ceph-deploy工具

#安装
~ apt-cache madison ceph-deploy
~ apt install -y ceph-deploy

#验证成功和查看版本
~ ceph-deploy --version 


#查看帮助手册
~ ceph-deploy --help
usage: ceph-deploy [-h] [-v | -q] [--version] [--username USERNAME] [--overwrite-conf] [--ceph-conf CEPH_CONF]
                   COMMAND ...

Easy Ceph deployment

    -^-
   /   \
   |O o|  ceph-deploy v2.0.1
   ).-.(
  '/|||\`
  | '|` |
    '|`

Full documentation can be found at: http://ceph.com/ceph-deploy/docs

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         be more verbose
  -q, --quiet           be less verbose
  --version             the current installed version of ceph-deploy
  --username USERNAME   the username to connect to the remote host
  --overwrite-conf      overwrite an existing conf file on remote host (if present)
  --ceph-conf CEPH_CONF
                        use (or reuse) a given ceph.conf file

commands:
  COMMAND               description
    new                 Start deploying a new cluster, and write a CLUSTER.conf and keyring for it.
    install             Install Ceph packages on remote hosts.
    mds                 Ceph MDS daemon management
    mgr                 Ceph MGR daemon management
    mon                 Ceph MON Daemon management
    rgw                 Ceph RGW daemon management
    gatherkeys          Gather authentication keys for provisioning new nodes.
    disk                Manage disks on a remote host.
    osd                 Prepare a data disk on remote host.
    admin               Push configuration and client.admin key to a remote host.
    config              Copy ceph.conf to/from remote host(s)
    repo                Repo definition management
    purge               Remove Ceph packages from remote hosts and purge all data.
    purgedata           Purge (delete, destroy, discard, shred) any Ceph data from /var/lib/ceph
    uninstall           Remove Ceph packages from remote hosts.
    calamari            Install and configure Calamari nodes. Assumes that a repository with Calamari packages is
                        already configured. Refer to the docs for examples (http://ceph.com/ceph-
                        deploy/docs/conf.html)
    forgetkeys          Remove authentication keys from the local directory.
    pkg                 Manage packages on remote hosts.

See 'ceph-deploy <command> --help' for help on a specific command
学新通

8.4 集群的初始化

初始化第一个MON节点,准备创建集群

#用户命令提示符颜色显示
~ vim .bashrc
force_color_prompt=yes
~ . .bashrc

#查看初始化命令用法
cephadm@admin:~$ ceph-deploy new --help

#初始化第一个MON节点的命令格式为"ceph-deply new {initial-monitor-node(s)}"
- mon01即为第一个MON节点名称,其名称必须与节点当前实际使用的主机名称(uname -n)保存一致
- 可以是短名称,也可以是长名称,但是最终用的仍然是短名称,但是会导致如下报错:
    ceph-deploy new: error: hostname : xxx is not resolvable
- 推荐使用完整写法:格式hostname :fqdn,比如 mon01 : mon01.wang.org

#首先在管理节点上以cephadm用户创建集群相关的配置文件目录
cephadm@admin:~$ mkdir ceph-cluster && cd ceph-cluster

#运行如下命令即可生成初始配置
cephadm@admin:~/ceph-cluster$ ceph-deploy new --public-network 10.0.0.0/24 \
--cluster-network 192.168.10.0/24 mon01:mon01.kubesphere.com
#注意:如果出错参看下面的故障排错

#查看生成配置文件
cephadm@admin:~/ceph-cluster$ ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring
cephadm@admin:~/ceph-cluster$ cat ceph.mon.keyring
[mon.]
key = AQBqI61iAAAAABAAUbuY6uXPavbXg9oIdaGDVg==
caps mon = allow *
cephadm@admin:~/ceph-cluster$ cat ceph.conf
[global]
fsid = 31c2136d-fc63-44a8-b3ee-031c147bdd37
public_network = 10.0.0.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = mon01
mon_host = 10.0.0.101
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

#注意:如果部署过程出现问题,需要清空
ceph-deploy forgetkeys
ceph-deploy purge mon01
ceph-deploy purgedata mon01

#如果需要一下子(指时间短暂或动作迅速)(指时间短暂或动作迅速)将所有的mon节点都部署出来,我们可以执行下面的命令
ceph-deploy new --public-network 10.0.0.0/24 --cluster-network 192.168.10.0/24 \
mon01:mon01.kubesphere.com mon02:mon02.kubesphere.com mon03.kubesphere.com
学新通

故障排错

学新通

#原因分析:因为 python3.8 已经没有这个方法了
cephadm@admin:~/ceph-cluster$ dpkg -l python3
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version        Architecture Description
   -==============-==============-============-=======================================================================>
ii  python3        3.8.2-0ubuntu2 amd64        interactive high-level object-oriented language (default python3 versio>

#解决方法:
cephadm@admin:~/ceph-cluster$ sudo vim /usr/lib/python3/dist-packages/ceph_deploy/hosts/remotes.py
    """ detect platform information from remote host """
    行首加#号注释下面两行
    #linux_distribution = _linux_distribution or platform.linux_distribution
    #distro, release, codename = linux_distribution()
    
    在上面两行下面添加下面6行
    distro = release = codename = None
    try:
      linux_distribution = _linux_distribution or platform.linux_distribution
      distro, release, codename = linux_distribution()
    except AttributeError:
      pass
    ......
学新通

学新通

8.5 Mon 节点安装软件

使用ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作

以下安装mon节点的相关包

#命令格式
ceph-deploy install {ceph-node} [{ceph-node} ...]
#注意:这里主要时ceph的工作角色的节点

#方法1一般情况下,不推荐使用这种直接的方法来进行安装,效率太低
ceph-deploy install mon01 mon02 mon03

#还有另外一种方法,手工在所有节点上安装ceph软件
apt install -y ceph ceph-osd ceph-mds ceph-mon radosgw

范例:在mon01节点安装mon相关包

#只在mon01节点安装mon组件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck --mon mon01

#或者直接在mon01节点安装软件
[root@mon01 ~]# apt install -y ceph-mon

#查看到mon01节点安装了ceph相关的包
[root@mon01 ~]# dpkg -l | grep ceph
ii  ceph-base                             16.2.9-1focal                     amd64        common ceph daemon libraries and management tools
ii  ceph-common                           16.2.9-1focal                     amd64        common utilities to mount and interact with a ceph storage cluster
ii  ceph-fuse                             16.2.9-1focal                     amd64        FUSE-based client for the Ceph distributed file system
ii  ceph-mds                              16.2.9-1focal                     amd64        metadata server for the ceph distributed file system
ii  ceph-mon                              16.2.9-1focal                     amd64        monitor server for the ceph storage system
ii  libcephfs2                            16.2.9-1focal                     amd64        Ceph distributed file system client library
ii  python3-ceph-argparse                 16.2.9-1focal                     all          Python 3 utility libraries for Ceph CLI
ii  python3-ceph-common                   16.2.9-1focal                     all          Python 3 utility libraries for Ceph
ii  python3-cephfs                        16.2.9-1focal                     amd64        Python 3 libraries for the Ceph libcephfs library

#自动运行相关进程
[root@mon01 ~]# ps aux | grep ceph
root        8989  0.0  0.6  18348 12232 ?        Ss   09:11   0:00 /usr/bin/python3.8 /usr/bin/ceph-crash
root       10391  0.0  0.0   6300   720 pts/0    S    09:12   0:00 grep --color=auto ceph

#自动创建ceph用户
[root@mon01 ~]# getent passwd ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/usr/sbin/nologin
学新通

8.6 集群认证和管理

8.6.1 初始化 Mon 节点生成配置信息

#配置初始化MON节点,同时向所有节点同步配置
ceph-deploy --overwrite-conf mon create-initial
#注意:为了避免因为认证方面导致的通信失败,推荐使用 --overwrite-conf 参数

#如果是在一个现有的环境上部署业务,可以先推送基准配置文件
ceph-deploy --overwrite-conf config push mon01 mon02 mon03

范例:初始化Mon01节点

cephadm@admin:~/ceph-cluster$ ceph-deploy --overwrite-conf mon create-initial

#生成配置文件
ceph.bootstrap-mds.keyring	#引导启动 mds的密钥文件
ceph.bootstrap-mgr.keyring	#引导启动 mgr的密钥文件
ceph.bootstrap-osd.keyring	#引导启动 osd的密钥文件
ceph.bootstrap-rgw.keyring	#引导启动 rgw的密钥文件
ceph.client.admin.keyring		#ceph客户端和管理端通信的认证密钥,是最重要的
ceph.conf
ceph-deploy-ceph.log
ceph.mon.keyring

#结果显示:这里生成了一系列的与ceph集群相关的 认证文件
#注意:ceph.client.admin.keyring 拥有ceph集群的所有权限,一定不能有误

#到mon的节点上查看mon的自动开启相应的守护进程
[root@mon01 ~]# ps aux | grep ceph
root        8989  0.0  0.6  18348 12232 ?        Ss   09:11   0:00 /usr/bin/python3.8 /usr/bin/ceph-crash
ceph       11534  0.3  2.1 416008 43960 ?        Ssl  09:26   0:00 /usr/bin/ceph-mon -f --cluster ceph --id mon01 --setuser ceph --setgroup ceph
root       12167  0.0  0.0   6300   656 pts/0    S    09:27   0:00 grep --color=auto ceph
学新通

8.6.2 推送密钥实现集群的管理(可选择)

为了方便后续的监控环境认证操作,在admin角色的主机上,把配置文件和admin密钥拷贝到Ceph集群各监控角色节点

##注意:原则上要求,所有MON节点上的ceph.conf内容必须一致,如果不一致的话,可以通过下面命令同步
~ ceph-deploy --overwrite-conf config push mon01 mon02 mon03

#执行集群的认证文件的拷贝动作
~ ceph-deploy admin --help
usage: ceph-deploy admin [-h] HOST [HOST ...]

Push configuration and client.admin key to a remote host.

positional arguments:
  HOST        host to configure for Ceph administration

optional arguments:
  -h, --help  show this help message and exit
  
~ ceph-deploy admin mon01 mon02 mon03
学新通

范例:在Mon节点实现集群管理

#拷贝前的效果
[root@mon01 ~]# ls /etc/ceph/
ceph.conf  rbdmap  tmpwxlqsx54

cephadm@admin:~/ceph-cluster$ ceph-deploy admin mon01

#查看效果
[root@mon01 ~]# ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  rbdmap  tmpwxlqsx54

#结果显示:这里多了一个 ceph的客户端与服务端进行认证的密钥文件了。
ceph.client.admin.keyring 主要用于 ceph客户端与管理端的一个通信认证
#注意:如果我们不做交互式操作的话,这个文件可以不用赋值

#问题:虽然我们把认证文件传递给对应的监控角色的主机了,但是我们的服务是通过普通用户cephadm来进行交流的。
#而默认情况下,传递过去的认证文件,cephadm普通用户是无法正常访问的
[root@mon01 ~]# ls -l /etc/ceph/
total 12
-rw------- 1 root root 151 Jun 18 09:34 ceph.client.admin.keyring
-rw-r--r-- 1 root root 256 Jun 18 09:34 ceph.conf
-rw-r--r-- 1 root root  92 May 19 04:04 rbdmap
-rw------- 1 root root   0 Jun 18 09:26 tmpwxlqsx54

#cephadm用户执行命令因文件权限会出错
[root@mon01 ~]#su - cephadm
cephadm@mon01:~$ ceph -s
2022-06-18T10:25:49.790 0800 7fcbbc76c700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-06-18T10:25:49.790 0800 7fcbbc76c700 -1 AuthRegistry(0x7fcbb405b6f8) no keyring found at /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,, disabling cephx
2022-06-18T10:25:49.794 0800 7fcbbc76c700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-06-18T10:25:49.794 0800 7fcbbc76c700 -1 AuthRegistry(0x7fcbb405f410) no keyring found at /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,, disabling cephx
2022-06-18T10:25:49.794 0800 7fcbbc76c700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-06-18T10:25:49.794 0800 7fcbbc76c700 -1 AuthRegistry(0x7fcbbc76afe0) no keyring found at /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,, disabling cephx
[errno 2] RADOS object not found (error connecting to the cluster)

#需要在ceph集群中需要运行ceph命令的节点上,以root用户的身份设定普通用户cephadm能够
#读取/etc/ceph/ceph.client.admin.keyring文件的权限
[root@mon01 ~]#apt install -y acl
[root@mon01 ~]#setfacl -m u:cephadm:rw- /etc/ceph/ceph.client.admin.keyring
[root@mon01 ~]#getfacl /etc/ceph/ceph.client.admin.keyring
user:cephadm:rw-

#然后监控节点就可以自己来收集相关的数据了,比如我们在mon01上执行如下命令
[root@mon01 ~]#su - cephadm
#查看状态
cephadm@mon01:~$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN	#结果显示:cluster状态不是正常的
            mon is allowing insecure global_id reclaim

  services:
    mon: 1 daemons, quorum mon01 (age 62m)
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

#集群状态不正常的原因,我们可以通过ceph health命令来进行确认,效果如下:
cephadm@mon01:~$ ceph health
HEALTH_WARN mon is allowing insecure global_id reclaim
学新通

8.6.3 部署集群的管理节点实现远程管理

当前的这些状态查看,只能到对应的节点主机上来进行,这个ceph命令是依赖于ceph-common软件的。

其实为了方便集群的管理,一般会通过远程的方式来进行远程主机状态的查询。

范例:创建管理节点实现远程管理

cephadm@admin:~/ceph-cluster$ sudo apt install -y ceph-common

#自动生成目录和配置文件
cephadm@admin:~/ceph-cluster$ ls -l /etc/ceph/
total 4
-rw-r--r-- 1 root root 92 May 19 04:04 rbdmap

#推送配置和相关key文件到管理节点
cephadm@admin:~/ceph-cluster$ ceph-deploy admin admin

#验证文件
cephadm@admin:~/ceph-cluster$ ls -l /etc/ceph/
total 12
-rw------- 1 root root 151 Jun 18 10:40 ceph.client.admin.keyring
-rw-r--r-- 1 root root 256 Jun 18 10:40 ceph.conf
-rw-r--r-- 1 root root  92 May 19 04:04 rbdmap
-rw------- 1 root root   0 Jun 18 10:40 tmp6mzt7no

cephadm@admin:~/ceph-cluster$ sudo apt install -y acl
cephadm@admin:~/ceph-cluster$ sudo setfacl -m u:cephadm:rw- /etc/ceph/ceph.client.admin.keyring

#检查效果
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN
            mon is allowing insecure global_id reclaim

  services:
    mon: 1 daemons, quorum mon01 (age 75m)
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

cephadm@admin:~/ceph-cluster$ ceph health
HEALTH_WARN mon is allowing insecure global_id reclaim

#消除 mon is allowing insecure global_id reclaim 的报警消息
cephadm@admin:~/ceph-cluster$ ceph config set mon auth_allow_insecure_global_id_reclaim false

#再次查看没有告警消息
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum mon01 (age 80m)
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:
学新通

8.7 部署 Mgr 节点

Ceph-MGR工作的模式是事件驱动型的,简单来说,就是等待事件,事件来了则处理事件返回结果,又继续等待。Ceph MGR事自从Ceph 12.2依赖主推的功能之一,是负责Ceph集群管理的组件,它主要功能是把集群的一些指标暴露给外界使用。根据官方的架构原则上来说,mgr要有两个节点来进行工作。

对于测试环境其实一个就能够正常使用了,暂时先安装一个节点,后面再安装第二个节点。

8.7.1 安装Mgr相关软件

#方法1:在管理节点远程安装mgr软件到mgr节点
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr01

#方法2:在mgr01节点手动安装软件
[root@mgr01 ~]# apt install -y ceph-mgr

#发现安装了相关包
[root@mgr01 ~]# dpkg -l | grep ceph
ii  ceph-base                             16.2.9-1focal                     amd64        common ceph daemon libraries and management tools
ii  ceph-common                           16.2.9-1focal                     amd64        common utilities to mount and interact with a ceph storage cluster
ii  ceph-fuse                             16.2.9-1focal                     amd64        FUSE-based client for the Ceph distributed file system
ii  ceph-mds                              16.2.9-1focal                     amd64        metadata server for the ceph distributed file system
ii  ceph-mgr                              16.2.9-1focal                     amd64        manager for the ceph distributed storage system
ii  ceph-mgr-cephadm                      16.2.9-1focal                     all          cephadm orchestrator module for ceph-mgr
ii  ceph-mgr-dashboard                    16.2.9-1focal                     all          dashboard module for ceph-mgr
ii  ceph-mgr-diskprediction-local         16.2.9-1focal                     all          diskprediction-local module for ceph-mgr
ii  ceph-mgr-k8sevents                    16.2.9-1focal                     all          kubernetes events module for ceph-mgr
ii  ceph-mgr-modules-core                 16.2.9-1focal                     all          ceph manager modules which are always enabled
ii  cephadm                               16.2.9-1focal                     amd64        cephadm utility to bootstrap ceph daemons with systemd and containers
ii  libcephfs2                            16.2.9-1focal                     amd64        Ceph distributed file system client library
ii  python3-ceph-argparse                 16.2.9-1focal                     all          Python 3 utility libraries for Ceph CLI
ii  python3-ceph-common                   16.2.9-1focal                     all          Python 3 utility libraries for Ceph
ii  python3-cephfs                        16.2.9-1focal                     amd64        Python 3 libraries for the Ceph libcephfs library

#自动生成配置文件
[root@mgr01 ~]# ls -l /etc/ceph/
total 4
-rw-r--r-- 1 root root 92 May 19 04:04 rbdmap
学新通

8.7.2 配置Mgr节点启动ceph-mgr进程

#创建mgr节点并生成相关配置
cephadm@admin:~/ceph-cluster$ ceph-deploy mgr create mgr01

#自动在mgr01节点生成配置文件和用户
[root@mgr01 ~]# ls /etc/ceph/
ceph.conf  rbdmap  tmpbbve1cit

[root@mgr01 ~]# getent passwd ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/usr/sbin/nologin
    
#开启相关进程
[root@mgr01 ~]# ps aux | grep ceph
root       13534  0.0  0.6  18536 12324 ?        Ss   11:05   0:00 /usr/bin/python3.8 /usr/bin/ceph-crash
ceph       20181  1.0 14.0 1011516 280396 ?      Ssl  11:10   0:06 /usr/bin/ceph-mgr -f --cluster ceph --id mgr01 --setuser ceph --setgroup ceph
root       20944  0.0  0.0   6300   720 pts/0    S    11:21   0:00 grep --color=auto ceph

#查看集群状态
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum mon01 (age 112m)
    mgr: mgr01(active, since 8m)
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

#结果显示:这个时候,service上,多了一个mgr的服务,在mgr01节点上,服务状态是 active
学新通

8.8 部署 OSD 存储环境

要设置OSD环境,一般执行下面步骤:

  • 要知道对应的主机上有哪些磁盘可以提供给主机来进行正常的使用
  • 格式化磁盘(非必须)
  • ceph擦除磁盘上的数据
  • 添加osd

8.8.1 硬盘准备

#所有存储节点主机都准备了两块额外的磁盘
[root@store01 ~]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  500G  0 disk
├─sda1   8:1    0    1M  0 part
├─sda2   8:2    0  100G  0 part /
├─sda3   8:3    0    2G  0 part /boot
├─sda4   8:4    0   50G  0 part /home
└─sda5   8:5    0  100G  0 part /data
sdb      8:16   0    1T  0 disk
sdc      8:32   0    1T  0 disk
sr0     11:0    1  1.1G  0 rom

#如果不需要查看大量无效设备的话,可以执行下面清理操作
apt autoremove --purge snapd -y

8.8.2 安装 OSD 存储节点相关软件

#确认仓库配置
[root@store01 ~]#cat /etc/apt/sources.list.d/ceph.list
deb http://mirrors.aliyun.com/ceph/debian-pacific/ focal main

#安装OSD相关软件
#方法1:在管理节点远程安装
cephadm@admin:~/ceph-cluster$ ceph-deploy install --release pacific --osd store01 store02 store03
#方法2:在OSD主机手动安装
[root@store01 ~]# apt install -y ceph-osd

#自动生成用户ceph
[root@store01 ~]# tail -n 1 /etc/passwd
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/usr/sbin/nologin
[root@store01 ~]# dpkg -l | grep ceph
ii  ceph-base                             16.2.9-1focal                     amd64        common ceph daemon libraries and management tools
ii  ceph-common                           16.2.9-1focal                     amd64        common utilities to mount and interact with a ceph storage cluster
ii  ceph-fuse                             16.2.9-1focal                     amd64        FUSE-based client for the Ceph distributed file system
ii  ceph-mds                              16.2.9-1focal                     amd64        metadata server for the ceph distributed file system
ii  ceph-osd                              16.2.9-1focal                     amd64        OSD server for the ceph storage system
ii  libcephfs2                            16.2.9-1focal                     amd64        Ceph distributed file system client library
ii  python3-ceph-argparse                 16.2.9-1focal                     all          Python 3 utility libraries for Ceph CLI
ii  python3-ceph-common                   16.2.9-1focal                     all          Python 3 utility libraries for Ceph
ii  python3-cephfs                        16.2.9-1focal                     amd64        Python 3 libraries for the Ceph libcephfs library

[root@store01 ~]# ls /etc/ceph/
rbdmap
[root@store01 ~]# ps aux | grep ceph
root       20768  0.0  0.6  18348 12328 ?        Ss   11:31   0:00 /usr/bin/python3.8 /usr/bin/ceph-crash
root       22531  0.0  0.0   6300   720 pts/0    S    11:35   0:00 grep --color=auto ceph
学新通

查看所有可用的OSD磁盘

#检查并列出OSD节点上所有可用的磁盘的相关信息
cephadm@admin:~/ceph-cluster$ ceph-deploy disk list store01
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephadm/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy disk list store01
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  subcommand                    : list
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf object at 0x7f9488f93a00>
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  func                          : <function disk at 0x7f9489002af0>
[ceph_deploy.cli][INFO  ]  host                          : ['store01']
[ceph_deploy.cli][INFO  ]  debug                         : False
The authenticity of host 'store01 (10.0.0.106)' can't be established.
ECDSA key fingerprint is SHA256:N3oplolGqcntxy2xBpzhWIYcPl4csBPLjJ4Ovg RTBk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'store01' (ECDSA) to the list of known hosts.
[store01][DEBUG ] connection detected need for sudo
[store01][DEBUG ] connected to host: store01
[store01][INFO  ] Running command: sudo fdisk -l
[ceph_deploy][ERROR ] Traceback (most recent call last):
[ceph_deploy][ERROR ]   File "/usr/lib/python3/dist-packages/ceph_deploy/util/decorators.py", line 69, in newfunc
[ceph_deploy][ERROR ]     return f(*a, **kw)
[ceph_deploy][ERROR ]   File "/usr/lib/python3/dist-packages/ceph_deploy/cli.py", line 166, in _main
[ceph_deploy][ERROR ]     return args.func(args)
[ceph_deploy][ERROR ]   File "/usr/lib/python3/dist-packages/ceph_deploy/osd.py", line 434, in disk
[ceph_deploy][ERROR ]     disk_list(args, cfg)
[ceph_deploy][ERROR ]   File "/usr/lib/python3/dist-packages/ceph_deploy/osd.py", line 375, in disk_list
[ceph_deploy][ERROR ]     if line.startswith('Disk /'):
[ceph_deploy][ERROR ] TypeError: startswith first arg must be bytes or a tuple of bytes, not str
[ceph_deploy][ERROR ] '

#注意:如果出现line.startswith('Disk /') 的报错错误方法
cephadm@admin:~/ceph-cluster$ sudo vim  375 /usr/lib/python3/dist-packages/ceph_deploy/osd.py
#修改375行,将 if line.startswith('Disk /'): 更改为 if line.startswith(b'Disk /'):
#只在'Disk 前面加一个字母 b 即可

#重新执行成功
cephadm@admin:~/ceph-cluster$ ceph-deploy disk list store01
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephadm/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy disk list store01
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  subcommand                    : list
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf object at 0x7fe9504d6a60>
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  func                          : <function disk at 0x7fe950570af0>
[ceph_deploy.cli][INFO  ]  host                          : ['store01']
[ceph_deploy.cli][INFO  ]  debug                         : False
[store01][DEBUG ] connection detected need for sudo
[store01][DEBUG ] connected to host: store01
[store01][INFO  ] Running command: sudo fdisk -l
[store01][INFO  ] b'Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors'
[store01][INFO  ] b'Disk /dev/sdb: 1 TiB, 1099511627776 bytes, 2147483648 sectors'
[store01][INFO  ] b'Disk /dev/sdc: 1 TiB, 1099511627776 bytes, 2147483648 sectors'
学新通

故障排错

学新通

8.8.3 清除 OSD磁盘数据(可选)

在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD

注意:如果硬盘是无数据的新硬盘此步骤可以不做

清除磁盘命令

ceph-deploy disk zap [-h] [--debug] [HOST] DISK [DISK ...]

#说明此操作本质上就是执行 dd if=/dev/zero of=disk bs=1M count=10

范例:

cephadm@admin:~/ceph-cluster$ for i in {1..3} ; do ceph-deploy disk zap store$i /dev/sdb /dev/sdc ; done

8.8.4 配置 OSD存储节点

对于OSD的相关操作,可以通过ceph-deploy osd命令来进行,帮助信息如下

cephadm@admin:~/ceph-cluster$ ceph-deploy osd --help
usage: ceph-deploy osd [-h] {list,create} ...
#帮助显示:这里提示了两类的存储机制
#默认情况下用的就是 bluestore 类型
#对于 bluestore 来说,它主要包括三类数据
--data /path/to/data						#ceph 保存的对象数据
--block-db /path/to/db-device		#数据库,即为元数据
--block-wal /path/to/wal-device	#数据库的 wal 日志
#生产建议data和wal日志分别存放

#对于 filestore 来说,它主要包括两类数据
--data /path/to/data				#ceph的文件数据
--journal /path/to/journal	#文件系统的日志数据

#对于 OSD来说,它的主要有两个动作:
list	:列出OSD相关的信息
create:创建OSD设备
学新通

范例:创建OSD存储所有信息都存储在一起

#将第一块磁盘加入OSD
cephadm@admin:~/ceph-cluster$ ceph-deploy --overwrite-conf osd create store01 --data /dev/sdb

#查看自动启动相关进程
[root@store01 ~]#ps aux | grep ceph
root       20768  0.0  0.6  18348 12328 ?        Ss   11:31   0:00 /usr/bin/python3.8 /usr/bin/ceph-crash
ceph       25534  0.6  2.9 826288 59532 ?        Ssl  11:48   0:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
root       28160  0.0  0.0   6300   660 pts/0    R    11:51   0:00 grep --color=auto ceph

#查看命令执行后的ceph集群的状态
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN
            OSD count 2 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum mon01 (age 2h)
    mgr: mgr02(active, since 40m), standbys: mgr01
    osd: 1 osds: 1 up (since 91s), 1 in (since 106s)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   9.6 MiB used, 2.0 TiB / 2.0 TiB avail
    pgs:

#查看OSD状态
cephadm@admin:~/ceph-cluster$ ceph-deploy osd list store01

#将第二块磁盘也加入OSD
cephadm@admin:~/ceph-cluster$ ceph-deploy --overwrite-conf osd create store01 --data /dev/sdc

#每个磁盘对应一个OSD进程
[root@store01 ~]#ps aux | grep ceph
root       20768  0.0  0.6  18348 12328 ?        Ss   11:31   0:00 /usr/bin/python3.8 /usr/bin/ceph-crash
ceph       25534  0.5  3.0 826288 60844 ?        Ssl  11:48   0:02 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph       27514  0.5  3.0 792500 60564 ?        Ssl  11:49   0:01 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph
root       28659  0.0  0.0   6300   720 pts/0    S    11:54   0:00 grep --color=auto ceph

#每个磁盘生成对应一个逻辑卷
[root@store01 ~]#pvs
  PV         VG                                        Fmt  Attr PSize     PFree
  /dev/sdb   ceph-088a8ef5-498e-4b4c-8697-46e76de31735 lvm2 a--  <1024.00g    0
  /dev/sdc   ceph-7841e513-1a68-4397-979f-59a9e6355833 lvm2 a--  <1024.00g    0
[root@store01 ~]#vgs
  VG                                        #PV #LV #SN Attr   VSize     VFree
  ceph-088a8ef5-498e-4b4c-8697-46e76de31735   1   1   0 wz--n- <1024.00g    0
  ceph-7841e513-1a68-4397-979f-59a9e6355833   1   1   0 wz--n- <1024.00g    0
[root@store01 ~]#lvs
  LV                                             VG                                        Attr       LSize     Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  osd-block-c338cde1-0a80-478f-9767-2cdb86757503 ceph-088a8ef5-498e-4b4c-8697-46e76de31735 -wi-ao---- <1024.00g            
  osd-block-2aec4998-2f5e-4da1-9fb0-265493b4ea83 ceph-7841e513-1a68-4397-979f-59a9e6355833 -wi-ao---- <1024.00g            
[root@store01 ~]#lsblk
NAME                                                                                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                                                                                       8:0    0  500G  0 disk
├─sda1                                                                                    8:1    0    1M  0 part
├─sda2                                                                                    8:2    0  100G  0 part /
├─sda3                                                                                    8:3    0    2G  0 part /boot
├─sda4                                                                                    8:4    0   50G  0 part /home
└─sda5                                                                                    8:5    0  100G  0 part /data
sdb                                                                                       8:16   0    1T  0 disk
└─ceph--088a8ef5--498e--4b4c--8697--46e76de31735-osd--block--c338cde1--0a80--478f--9767--2cdb86757503
                                                                                        253:0    0 1024G  0 lvm
sdc                                                                                       8:32   0    1T  0 disk
└─ceph--7841e513--1a68--4397--979f--59a9e6355833-osd--block--2aec4998--2f5e--4da1--9fb0--265493b4ea83
                                                                                        253:1    0 1024G  0 lvm
sr0                                                                                      11:0    1  1.1G  0 rom

[root@store01 ~]#blkid | grep /dev/mapper
/dev/mapper/ceph--088a8ef5--498e--4b4c--8697--46e76de31735-osd--block--c338cde1--0a80--478f--9767--2cdb86757503: TYPE="ceph_bluestore" PTTYPE="atari"
/dev/mapper/ceph--7841e513--1a68--4397--979f--59a9e6355833-osd--block--2aec4998--2f5e--4da1--9fb0--265493b4ea83: TYPE="ceph_bluestore" PTTYPE="atari"

#每个OSD磁盘生成一个service
[root@store01 ~]#systemctl status ceph-osd@0
● ceph-osd@0.service - Ceph object storage daemon osd.0
     Loaded: loaded (/lib/systemd/system/ceph-osd@.service; enabled-runtime; vendor preset: enabled)
     Active: active (running) since Sat 2022-06-18 11:48:38 CST; 54min ago
   Main PID: 25534 (ceph-osd)
      Tasks: 59
     Memory: 32.6M
     CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@0.service
             └─25534 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph

Jun 18 11:48:38 store01.kubesphere.com systemd[1]: Starting Ceph object storage daemon osd.0...
Jun 18 11:48:38 store01.kubesphere.com systemd[1]: Started Ceph object storage daemon osd.0.
Jun 18 11:48:40 store01.kubesphere.com ceph-osd[25534]: 2022-06-18T11:48:40.140 0800 7f170ec63080 -1 osd.0 0 log_to_monito>
Jun 18 11:48:41 store01.kubesphere.com ceph-osd[25534]: 2022-06-18T11:48:41.820 0800 7f170a3eb700 -1 osd.0 0 waiting for i>
Jun 18 11:48:41 store01.kubesphere.com ceph-osd[25534]: 2022-06-18T11:48:41.824 0800 7f170715f700 -1 osd.0 4 set_numa_affi>
[root@store01 ~]#systemctl status ceph-osd@1
● ceph-osd@1.service - Ceph object storage daemon osd.1
     Loaded: loaded (/lib/systemd/system/ceph-osd@.service; enabled-runtime; vendor preset: enabled)
     Active: active (running) since Sat 2022-06-18 11:49:50 CST; 53min ago
    Process: 27501 ExecStartPre=/usr/libexec/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id 1 (code=exited, status=0/>
   Main PID: 27514 (ceph-osd)
      Tasks: 59
     Memory: 32.9M
     CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@1.service
             └─27514 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph

Jun 18 11:49:50 store01.kubesphere.com systemd[1]: Starting Ceph object storage daemon osd.1...
Jun 18 11:49:50 store01.kubesphere.com systemd[1]: Started Ceph object storage daemon osd.1.
Jun 18 11:49:53 store01.kubesphere.com ceph-osd[27514]: 2022-06-18T11:49:53.428 0800 7fd25c727080 -1 osd.1 0 log_to_monito>
Jun 18 11:49:55 store01.kubesphere.com ceph-osd[27514]: 2022-06-18T11:49:55.320 0800 7fd2596d4700 -1 osd.1 0 waiting for i>
Jun 18 11:49:55 store01.kubesphere.com ceph-osd[27514]: 2022-06-18T11:49:55.328 0800 7fd254c23700 -1 osd.1 9 set_numa_affi>

cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN
            OSD count 2 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum mon01 (age 3h)
    mgr: mgr02(active, since 93m), standbys: mgr01
    osd: 2 osds: 2 up (since 53m), 2 in (since 53m)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   9.6 MiB used, 2.0 TiB / 2.0 TiB avail
    pgs:
    
#结果显示:在services部分的OSD多了信息,有两个OSD是up的状态
学新通

8.8.5 添加后续所有OSD节点的磁盘

#安装软件
#方法1:在管理节点远程安装
cephadm@admin:~/ceph-cluster$ ceph-deploy install --release pacific --osd store02 store03

#方法2:在OSD主机手动安装
[root@store02 ~]# apt install -y ceph-osd
[root@store03 ~]# apt install -y ceph-osd

#接下来通过批量操作的方式,将其他节点主机的磁盘都格式化
for i in {2..3} ; do
  ceph-deploy --overwrite-conf osd create store0$i --data /dev/sdb
  ceph-deploy --overwrite-conf osd create store0$i --data /dev/sdc
done

8.8.6 查看集群最终状态

#执行后的效果如下:
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum mon01 (age 3h)
    mgr: mgr02(active, since 98m), standbys: mgr01
    osd: 6 osds: 6 up (since 39s), 6 in (since 54s)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   32 MiB used, 6.0 TiB / 6.0 TiB avail
    pgs:     1 active clean

#结果显示:osd的磁盘数量达到了6各,都是处于up的状态,对于数据容量来说,有6T的磁盘空间可以使用
#查看管理配置完毕的OSD的数量
cephadm@admin:~/ceph-cluster$ ceph-deploy osd list store0{1..3}

#查看状态
cephadm@admin:~/ceph-cluster$ ceph osd status
ID  HOST                     USED  AVAIL  WR OPS  WR DATA  RD OPS  RD DATA  STATE
 0  store01.kubesphere.com  5544k  1023G      0        0       0        0   exists,up
 1  store01.kubesphere.com  5544k  1023G      0        0       0        0   exists,up
 2  store02.kubesphere.com  5480k  1023G      0        0       0        0   exists,up
 3  store02.kubesphere.com  5412k  1023G      0        0       0        0   exists,up
 4  store03.kubesphere.com  5416k  1023G      0        0       0        0   exists,up
 5  store03.kubesphere.com  5348k  1023G      0        0       0        0   exists,up
学新通

9 扩展 Ceph 集群实现高可用

9.1 实现Mon节点高可用

当前只有一个Mon节点主机,存在SPOF,添加新的Mon节点实现高可用

注意:如果n个Mon节点,至少需要保证有 > n/2 个以上的健康 Mon 节点,Ceph集群才能正常使用

#先在新的Mon节点安装mon软件
ceph-deploy install --mon mon节点名称
#添加后续的mon节点命令
ceph-deploy mon add mon节点名称
#注意:如果add换成destroy,则变成移除mon节点

范例:添加mon02和mon03两个节点

#添加mon02节点
#方法1:在mon02节点上安装mon软件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mon mon02
#方法2:在mon02节点手动安装mon软件也可以
[root@mon02 ~]#apt install -y ceph-mon

#添加在mon02节点
cephadm@admin:~/ceph-cluster$ ceph-deploy mon add mon02

#查看
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_OK

  services:
    mon: 2 daemons, quorum mon01,mon02 (age 0.313042s)
    mgr: mgr02(active, since 109m), standbys: mgr01
    osd: 6 osds: 6 up (since 11m), 6 in (since 11m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   32 MiB used, 6.0 TiB / 6.0 TiB avail
    pgs:     1 active clean

#添加mon03节点
#方法1:在mon03节点上安装mon软件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mon mon03
#方法2:在mon03节点手动安装mon软件也可以
[root@mon03 ~]#apt install -y ceph-mon

#添加在mon02节点
cephadm@admin:~/ceph-cluster$ ceph-deploy mon add mon03

#查看ceph的mon状态
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum mon01,mon02,mon03 (age 2m)
    mgr: mgr02(active, since 112m), standbys: mgr01
    osd: 6 osds: 6 up (since 14m), 6 in (since 14m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   32 MiB used, 6.0 TiB / 6.0 TiB avail
    pgs:     1 active clean
    
#消除 mon is allowing insecure global_id reclaim 的报警消息
cephadm@admin:~/ceph-cluster$ ceph config set mon auth_allow_insecure_global_id_reclaim false

#修改ceph配置添加后续的Mon节点的信息
cephadm@admin:~/ceph-cluster$ sudo vim ceph.conf
mon_host = 10.0.0.101,10.0.0.102,10.0.0.103

#同步ceph配置文件到所有ceph节点的主机
cephadm@admin:~/ceph-cluster$ ceph-deploy --overwrite-conf config push admin mon0{1,2,3} mgr0{1,2} store0{1,2,3}
学新通

9.2 实现Mgr节点高可用

当前只有一个Mgr节点主机,存在SPOF,添加新的Mgr节点实现高可用

Ceph Manager守护进程以Active/Standby模式运行,部署其它ceph-mgr守护程序可确保在Active节点或其上的ceph-mgr守护进程故障时,其中的一个Standby实例可以在不中断服务的情况下接管其任务。

注意:如果所有Mgr节点故障,将集群将无法正常工作

添加后续的Mgr节点命令格式

ceph-deploy mgr create 节点名称

范例:添加第二个Mgr节点

#方法1:在管理节点远程在mgr02节点上安装Mgr软件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr02
#方法2:在mgr02节点手动安装软件
[root@mgr02 ~]# apt install -y ceph-mgr

#添加第二个Mgr节点
cephadm@admin:~/ceph-cluster$ ceph-deploy mrg create mgr02

#查看效果
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN
            clock skew detected on mon.mon02, mon.mon03

  services:
    mon: 3 daemons, quorum mon01,mon02,mon03 (age 30s)
    mgr: mgr01(active, since 2h), standbys: mgr02
    osd: 6 osds: 6 up (since 30m), 6 in (since 31m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   32 MiB used, 6.0 TiB / 6.0 TiB avail
    pgs:     1 active clean
    
#结果显示:mgr01节点就是主角色节点,mgr02是从角色节点

#关闭mgr01节点,mgr02节点自动成为active节点
[root@mgr01 ~]# poweroff
cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum mon01,mon02,mon03 (age 4m)
    mgr: mgr02(active, since 2h), standbys: mgr01
    osd: 6 osds: 6 up (since 34m), 6 in (since 34m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   32 MiB used, 6.0 TiB / 6.0 TiB avail
    pgs:     1 active clean
学新通

9.3 验证高可用

Down 掉任意的Mon节点和Mgr节点测试结果

cephadm@admin:~/ceph-cluster$ ceph -s
  cluster:
    id:     31c2136d-fc63-44a8-b3ee-031c147bdd37
    health: HEALTH_WARN
            1/3 mons down, quorum mon01,mon03

  services:
    mon: 3 daemons, quorum mon01,mon03 (age 108s), out of quorum: mon02
    mgr: mgr02(active, since 2h)
    osd: 6 osds: 6 up (since 50m), 6 in (since 50m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   32 MiB used, 6.0 TiB / 6.0 TiB avail
    pgs:     1 active clean
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfghii
系列文章
更多 icon
同类精品
更多 icon
继续加载