目录

Ceph安装部署指南及在Openshift的应用

Ceph集群安装手册,分别用Ceph-deploy+Nautilus,Cephadmin+Octopus两种部署方式进行阐述

并结合Openshift平台,连接外部Ceph集群做存储持久化试验

Ceph安装部署指南及在Openshift的应用

1.前言

之前文章中一直提及关于分布式技术栈带来的高可用性。也多次利用云原生方式打造企业内部的服务架构。

对于服务而言,从某种角度来看,分为无状态和有状态应用。例如Nginx、Envoy、CoreDNS、NTP、Service Mesh等,有状态应用包括Mysql MGR、ETCD、Quay等。得益于K8S平台架构的天生优势,快速部署、弹性扩展、可视化运维等都是容器化平台拿手功夫。

但是系统99.999%的高可用性也意味着可能有小于5分钟的宕机几率,数据才是企业最核心价值,打造企业高性能、高可用的存储系统,为云原生架构提供持久化存储是核心点,也是最难的一部分。

从存储需求来看,企业内部越来越需要多样的存储类型,存储方案必须提供统一存储类型才能满足增长需求。例如Quay分布式镜像仓库需要S3 or Swift兼容的对象存储,大数据等应用需要块存储。

从存储解决方案技术架构来看,分为具有CSI插件的传统存储阵列、软件优化的容器存储定义、云原生解决方案三种方向。

传统厂商如IBM、Dell EMC和NetApp都是典型的传统存储+CSI接口的架构。

云原生领导者Portworx直接采用是云原生类型(可以查看之前教程《Openshift 4上部署Portworx的安装参考【IBM CP4D版本】》),是闭源产品,不差钱企业首选,但免费版只支持3T。

国内大型企业用户建议选择XSKY,一条龙服务,何况对于政府、金融等行业还有国产化应用XC场景。

Redhat的Ceph Storage属于收费软件,国内客户应该不多。

Redhat的Ceph Storage 4在Openshift平台下是OCS组件(Openshift Container Storage),分为集群内云原生部署方式,以及直接访问集群外已有红帽Ceph 集群的方式。集群内部署需要先扩展至少3个work节点,且最小需要16C64GB资源,但免费版只支持4T,比较适合CP4D等新建中小型集群应用,何况在大型企业的运维管理模式中,虚拟化操作系统和存储的管理人员是相互分开的,因此必须支持对集群外现有企业存储的访问。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210103112841322.png

Ceph社区版通过Rook可以和K8S紧密结合,提供统一对象存储,至于Ceph-deploy方式部署还是Cephadmin方式部署,后者可以通过容器化部署的天生优势,解决了诸如YUM源等部署环境问题,加快敏捷部署。而版本选择Nautilus还是Octopus,对于9个月一迭代的开源版本,谁在乎呢。

再说说其他几种存储方式。

GFS(Global Forecast System)亲测下来不是很稳定,多个小文件高并发写的场景下,秒宕。已经被红帽抛弃。

NFS稳定好用,但是有个问题,就是存在天生单节点故障问题,武当派的keepalived+rsync+inotify,只能说可用于开发环境部署实施,但属于假HA,密集读写场景下100%包你丢数据,而且数据恢复无法区分脏数据。反而是硬件RAID的单节点NFS用于大多数环境便宜又好用。

另外再说下关于存算一体化还是存算分离场景?

在目前分布式技术栈独领风骚的时代,这已经不是一个非0即1的问题,对于核心关键应用的数据库场景,还是可以选择存算一体化的超融合架构,但是存算资源务必选择独占,与其他非关键业务隔离,少林派有一个绝学100Gb/Infiniband足够牛逼。

《2020 年 Gartner HCI 软件魔力象限报告》已经把非软件定义的HCI厂家排除在外了。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210114091108441.png

存算一体化的超融合架构最大的优点在于存算的高弹性扩展,云原生存储解决方案应该提供完整的容器数据服务能力,支持容器应用的存储、备份、容灾、迁移、安全和自动化等功能。

2021年1月4日,上海市正式对外公布《关于全面推进上海城市数字化转型的意见》。

行业数字化转型在前10年在互联网行业得到了最大的行业应用和收益,接下来的10年将会在在民生、经济、工业制造、城市综合治理等非互联网行业得到充分赋能。

行业数字化转型的技术形态和底座会是新一代云架构。新一代体现在哪些方面?

1、混合云是行业云计算的主流形态,云计算更多在互联网场景走向非互联网场景。

2、云原生是新一代云架构的最佳形态,传统应用迁移上云方式将逐步淘汰。话说去年12月底AWS发布了四项新的容器创新,帮助客户开发、部署和扩展现代应用程序,又是一条龙服务。Docker Hub限速渐行渐远,另一方面公有云将逐渐向容器化、Serverless升级,帮助客户更加专注于业务本身。

3、软件研发模式将会进一步迭代升级,解耦和重构仍是主旋律,但组织架构更佳向业务倾斜。

4、软件定义一切已经到来,并且长期伴随我们数字化转型的过程。

5、数据安全伴随着新一代云架构的发展成为一个巨大挑战,“安全”的理念将从源头发生蜕变。

6、最终人才是核心灵魂也是最大的挑战,目前核心技术、市场、管理岗位只有极少数人懂得真正的大数据、AI与自我业务的赋能融合的场景,是自我升华还是别人来革你的命,建议还是学魔丸哪吒。《2020.1.4意见稿》短期内成效小,人才是关键。

—————————————-索隆一大.三千.大世界———————————

本次文章重点介绍Ceph部署实战及OpenShift与Ceph的使用。

我会介绍利用ceph-deploy来部署Nautilus版本,然后用Cephadmin来部署Octopus版本。

cephadm本质上是容器化部署的方式,没有太多区别,建议生产环境使用Ceph-Ansible或者Cephadmin,Ceph-deploy对于复杂的生产环境会出现覆盖配置文件的极端情况,而Ceph-Ansible更加适合自家的Redhat Ceph Storage。

部署方式、部署形态(集群内还是集群外)最终还是要视运营的组织架构和业务需求。例如主机组、存储组的运维同事不可能交叉运维一个集群内的存储架构。

2.相关说明

2.1 网络说明

Ceph集群内有两类流量:

Cluster Network:私网对内访,集群内部各节点间的通信流量,可以理解为存储专网。

Public Network:公网对外访问,Ceph对外提供服务的网络,例如mon节点、mgr节点等服务。

相关的防火墙开放端口请查看《4.5 设置防火墙》,请不要在生产环境关闭防火墙。

2.2 安装事宜事项

几个安装部署注意事项:

1、防火墙端口的开放需要仔细核对;

2、NTP时间需要严格满足Ceph集群最小需求0.05s

3、OCP内的namespace仔细核对,不要混淆;

4、初步试验请严格按照本文里yaml文件字段;

5、几个关键点的设置,例如挂载rbd的pod内的yaml文件内volumes/persistentVolumeClaim/readOnly必须设置为false

6、安装CSI Ceph驱动时候,git clone必须指定--branch v3.2.0参数;

3.版本说明

参考:https://docs.ceph.com/en/latest/releases/octopus/

目前【截止至2021年1月】稳定版本包括Octopus(🐙 V15章鱼)和Nautilus(鹦鹉螺V14)两个版本。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20201216203230414.png

下载地址:http://eu.ceph.com/rpm-octopus/

社区Ceph从octopus版开始不支持通过ceph-deploy安装。新的安装工具是cephadm,它是将Ceph集群的各种服务部署运行在容器中。各位可以从第四章节可以看出,采用容器化部署的方式,最大的优点是可以避免YUM源配置以及后续等部分相关环境准备。

由于Ceph-deploy 已经不在维护,Ceph-adm 本质上是容器化的方式,Ceph-Ansible自动化程度较高。

Ceph-Ansible与新版本CephAPI有点问题,推荐Cephadmin。

以下是官方推荐安装方式:https://docs.ceph.com/en/latest/install/#recommended-methods

ceph-deploy is no longer actively maintained. It is not tested on versions of Ceph newer than Nautilus. It does not support RHEL8, CentOS 8, or newer operating systems.

4.环境准备

相关环境参数具体如下:

IP地址(外网) IP地址(私网) 主机名 额外硬盘 角色
节点1 172.18.2.3 192.168.1.3 cephnode1 2*1T(/dev/sdb,/dev/sdc) mon,mgr,osd
节点2 172.18.2.4 192.168.1.4 cephnode2 2*1T(/dev/sdb,/dev/sdc) mon,osd
节点3 172.18.2.5 192.168.1.5 cephnode3 2*1T(/dev/sdb,/dev/sdc) mon,mgr,osd

4.1 网络设置

这里每个节点需要配置两套物理隔离的网络。详见《2.1 网络说明》

外网用于外部访问Ceph集群,私网用于各节点的数据同步,私网可以理解为存储网。

查看各节点网络状况。

获取两块网卡名称ens192ens224

注意:网卡的名称根据物理机或者虚拟机的环境不同而不同,请注意区分和更改。

本文环境采用VMware 7 + vSan 7 环境。

三台虚拟机采用RHEL 7.8 操作系统(Red Hat Enterprise Linux Server release 7.8 (Maipo))。

【开始设置网络环境】

每台虚拟机的网卡名如下:

1
2
3
4
5
6
7
8
9
nmcli device show

GENERAL.DEVICE:                         ens192
GENERAL.TYPE:                           ethernet
GENERAL.STATE:                          100 (connected)

GENERAL.DEVICE:                         ens224
GENERAL.TYPE:                           ethernet
GENERAL.STATE:                          30 (disconnected)

设置节点1网络

1
2
3
4
5
6
nmcli con modify ens192 ipv4.addresses 172.18.2.3/24
nmcli con modify ens224 ipv4.addresses 192.168.1.3/24
nmcli con mod ens192 ipv4.method manual
nmcli con mod ens224 ipv4.method manual
nmcli con up ens224 
nmcli con up ens192

设置节点2网络

1
2
3
4
5
6
nmcli con modify ens192 ipv4.addresses 172.18.2.4/24
nmcli con modify ens224 ipv4.addresses 192.168.1.4/24
nmcli con mod ens192 ipv4.method manual
nmcli con mod ens224 ipv4.method manual
nmcli con up ens224 
nmcli con up ens192

设置节点3网络

1
2
3
4
5
6
nmcli con modify ens192 ipv4.addresses 172.18.2.5/24
nmcli con modify ens224 ipv4.addresses 192.168.1.5/24
nmcli con mod ens192 ipv4.method manual
nmcli con mod ens224 ipv4.method manual
nmcli con up ens224 
nmcli con up ens192

4.2 免密登录

设置免密登录的作用是后续Ceph-deploy/Cephadmin工具在部署各节点过程中,采用免密登录进行部署。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
ssh-keygen -t rsa -b 2048 -P '' -f /root/.ssh/id_rsa -C "21802259@qq.com"

# 相关返回信息
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:p8DrTHxRyVWQzRRBwsE2vQIazFHc0Az1fB7Jz1gxDHg 21802259@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|       o.++XB%O= |
|        +.o+XE=.+|
|         o+o..o=o|
|     .  ..  . .*o|
|      o S .  .. +|
|     . o +       |
|      + o        |
|     + .         |
|      o          |
+----[SHA256]-----+

验证,生成公钥和私钥文件。其中pub为公钥

1
2
3
4
ll /root/.ssh/
total 8
-rw-------. 1 root root 1675 Jan  1 07:16 id_rsa
-rw-r--r--. 1 root root  397 Jan  1 07:16 id_rsa.pub

拷贝至服务器端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
ssh-copy-id -i /root/.ssh/id_rsa root@172.18.2.4 

# 系统返回
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.18.2.4 (172.18.2.4)' can't be established.
ECDSA key fingerprint is SHA256:5xJHm5qbXRaX82su48zicfRPMtpeVNost/UeJ2diVRw.
ECDSA key fingerprint is MD5:9f:d1:00:2f:7a:8d:e0:16:d7:43:ac:93:b7:7e:d6:8d.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.18.2.4's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.18.2.4'"
and check to make sure that only the key(s) you wanted were added.

验证

1
ssh root@172.18.2.4

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210102084010953.png

继续拷贝到节点3

1
ssh-copy-id -i /root/.ssh/id_rsa root@172.18.2.5 

验证

1
ssh root@172.18.2.5

【还要拷贝到自己本机节点。注意这点很重要,后续Cephadm在做批处理时候会通过ssh登录到本机】

1
ssh-copy-id -i /root/.ssh/id_rsa root@172.18.2.3 

验证

1
ssh root@172.18.2.3

4.3 主机名和hosts设置

设置hosts文件,不采用DNS。

这里多了添加了raw.githubusercontent.com的解析,用于后续安装cephadm,从github上下载脚本文件。

1
2
3
4
5
6
cat >> /etc/hosts << EOF
172.18.2.3 cephnode1
172.18.2.4 cephnode2
172.18.2.5 cephnode3
199.232.4.133 raw.githubusercontent.com
EOF

设置主机名

1
hostnamectl set-hostname cephnode1

依次通过免密登录其他主机,然后设置主机名和相关hosts设置。

再次通过主机名SSH免密验证,主要目的是第一次需要输入密码。

1
2
3
ssh root@cephnode1
ssh root@cephnode2
ssh root@cephnode3

4.4 关闭SELinux

关闭SELinux,因为已经设置了disabled,下次重启会自动关闭,

这里通过setenforce 0临时关闭,不需要重启了,而下次重启后会自动关闭。

1
2
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0

依次通过免密登录其他主机关闭SELinux。

4.5 设置防火墙

服务名 端口号 描述
Monitor 6789/tcp 与Ceph集群通信
Monitor 3300/tcp
MGR 7000/tcp Ceph管理面板
MGR 8003/tcp Ceph Restful API管理 with HTTPS
MGR 9283/tcp Prometheus插件通信接口
OSD 6800-7300/tcp 每个OSD在这个范围内使用3个端口,一个用来与客户端和监视器进行通信,一个用来与集群中其他的OSD进行通信,最后一个用来在集群中发送心跳包
RADOS 网关 7480/tcp 默认RADOS网管端口为7480,你可以修改为80/443(如果使用TLS)
8443 Dashboard

打开Monitor节点3300TCP端口、6789TCP端口

打开OSD节点6800-7300TCP端口

1
2
3
4
5
6
7
8
firewall-cmd --zone=public --add-port=3300/tcp --permanent
firewall-cmd --zone=public --add-port=6789/tcp --permanent
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=8443/tcp --permanent
firewall-cmd --zone=public --add-port=9283/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

4.6 配置YUM源

配置Redhat离线YUM源可参考https://mp.weixin.qq.com/s/5EMCjFybqiyD2TNmkjDgXQ

或参考阿里源https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11DrVF5Z

或参考网易源http://mirrors.163.com/centos/7/os/x86_64/Packages/

这里采用阿里源

1
2
3
# 查看RHEL版本号
cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.8 (Maipo)

基本源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 备份
cp /etc/yum.repos.d/base.repo{,.bak}

# 设置

cat > /etc/yum.repos.d/CentOS-Base.repo << EOF
[base]
name=CentOS Base
baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
gpgcheck=0

[updates]
name=CentOS Updates
baseurl=http://mirrors.aliyun.com/centos/7/updates/x86_64/
gpgcheck=0

[extras]
name=CentOS Extras
baseurl=http://mirrors.aliyun.com/centos/7/extras/x86_64/
gpgcheck=0
EOF

epel源

1
2
3
4
5
6
cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Extra Packages for Enterprise Linux 7
baseurl=http://mirrors.aliyun.com/epel/7/x86_64
gpgcheck=0
EOF

配置Ceph源

【注意如果采用Cephadm部署方式,则不需要配置Ceph源,参考《6.1 安装Cephadm》直接下载python脚本】

对!Cephadm其实就是个python3的脚本文件。

1、如果用ceph-deploy来部署Nautilus版本,baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/,如果部署Octopus版本 ,baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el7/x86_64/

替换其中的【rpm-octopus】或者【rpm-nautilus】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el7/x86_64/
gpgcheck=0

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/
gpgcheck=0
EOF

至此YUM源配置完成。

4.7 配置NTP

安装并启用

1
2
yum install -y chrony
systemctl enable chronyd --now

配置NTP服务器源,我这里172.18.1.2是我部署环境企业内部的NTP服务器地址。这部分可以参考云原生打造企业内部DNS+ETCD+NTP+Quay高可用实战(完结篇)

注:

我在这里走了一点弯路,如果企业内部的网络不是很稳定,Ceph集群内部可以采用更加保守稳定的集群内时间同步方法。Ceph集群各节点的时间同步要求小于0.05s。当然这个参数可以更改,但是不建议在生产环境中对其修改。

集群内时间同步方法:直接将Ceph集群一台服务器作为Chrony服务器,集群内其他节点与其进行时间同步,避免因时间同步造成Ceph各种报错。

采用集群内时间同步方法带来的问题是:当Ceph集群这台Chrony服务器宕机后,集群丢失了时间同步服务器。

而企业内部的NTP服务器一般均有高可用配置。

在安装过程中,遇到集群一直提示slow ops, oldest one blocked for,一直提示这个错误,请检查时间同步,时间同步处理完毕后,问题解决。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat >/etc/chrony.conf <<EOF
#server ntp.aliyun.com iburst
server 172.18.1.2 iburst
driftfile /var/lib/chrony/drift
makestep 0.04 3
rtcsync
#allow all
logdir /var/log/chrony
#local stratum 10
EOF

重启

1
systemctl restart chronyd

验证,注意172.18.1.2前面的^*的注释。具体表示'*' = current synced

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
chronyc sources -v

# 返回信息,关键注意
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 172.18.1.2                    3   6    17     9    +17us[ +115us] +/-   20ms

————–至此,Ceph集群的基础环境已经全部部署完成——————

————-分水岭开始,接下来按照Ceph-deploy+Nautilus以及Cephadmin+Octopus两种方式分别阐述——-

5.Ceph-deploy+Nautilus部署方式

大致流程是

1、在节点1上部署ceph-deploy工具

2、初始化Ceph集群(步骤2和3可以调整)

3、然后在各节点安装ceph相关程序

4、扩展mon节点

5、扩展mgr节点

6、扩展osd节点

5.1 部署deploy工具

注意:只需要在node1节点上安装,不需要在其他节点上部署。另外注意版本号为必须为2.0.1

1
yum install -y python-setuptools ceph-deploy

安装完后验证,版本号为v2.0.1

1
2
3
4
5
6
7
8
9
Easy Ceph deployment

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

5.2 部署monitor节点

为方便管理,先建立一个目录,然后直接在目录下进行创建。

1
2
mkdir cephcluster
cd cephcluster/

关键点,开始初始化集群。

初始化集群命令参数说明:

1、--cluster-network就是私网(存储网)的网络地址,非主机地址

2、--public-network是外网的网络地址

3、cephnode1是本机的主机名

在初始化集群前,如果之前已经部署过,应该删除包和清理数据

1
2
3
4
5
6
7
8
# 清除远程主机/var/lib/ceph /etc/ceph中的包和数据
ceph-deploy uninstall cephnode1 cephnode2 cephnode3
# 清除/var/lib/ceph及/etc/ceph下ceph目录及以下内容全部
ceph-deploy purge cephnode1 cephnode2 cephnode3
# 清除my-cluster目录中的认证密钥文件
ceph-deploy purgedata cephnode1 cephnode2 cephnode3
# Remove authentication keys from the local directory.
ceph-deploy forgetkeys 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@cephnode1 ~]# ceph-deploy new --cluster-network 192.168.1.0/24 --public-network  172.18.2.3/24 cephnode1

# 返回相关信息
172.18.2.0/24 cephnode1
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy new --cluster-network 192.168.1.0/24 --public-network 172.18.2.0/24 cephnode1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  func                          : <function new at 0x7fa6d93dbe60>
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fa6d8b4bd88>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
[ceph_deploy.cli][INFO  ]  mon                           : ['cephnode1']
[ceph_deploy.cli][INFO  ]  public_network                : 172.18.2.0/24
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  cluster_network               : 192.168.1.0/24
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  fsid                          : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO  ] making sure passwordless SSH succeeds
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[cephnode1][DEBUG ] find the location of an executable
[cephnode1][INFO  ] Running command: /usr/sbin/ip link show
[cephnode1][INFO  ] Running command: /usr/sbin/ip addr show
[cephnode1][DEBUG ] IP addresses found: [u'192.168.1.3', u'172.18.2.3']
[ceph_deploy.new][DEBUG ] Resolving host cephnode1
[ceph_deploy.new][DEBUG ] Monitor cephnode1 at 172.18.2.3
[ceph_deploy.new][DEBUG ] Monitor initial members are ['cephnode1']
[ceph_deploy.new][DEBUG ] Monitor addrs are [u'172.18.2.3']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

最后两句话显示创建了三个文件。ceph.mon.keyringceph.conf,以及1个日志文件。

【这里对应,如果采用Cephadmin是生成四个文件】

验证

1
2
3
4
ll
-rw-r--r--. 1 root root  261 Jan  1 19:49 ceph.conf
-rw-r--r--. 1 root root 3060 Jan  1 19:49 ceph-deploy-ceph.log
-rw-------. 1 root root   73 Jan  1 19:49 ceph.mon.keyring

进一步查看配置文件

【这里对应,如果采用Cephadmin则生成最小化的配置文件】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat ceph.conf 
[global]
fsid = 00430ebb-5595-4c85-9c3b-faf94138ee4a
public_network = 172.18.2.0/24
cluster_network = 192.168.1.0/24
mon_initial_members = cephnode1
mon_host = 172.18.2.3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

查看ceph.mon.keyring文件,这是主要用来做身份验证的

1
2
3
4
cat ceph.mon.keyring 
[mon.]
key = AQAfw+9fAAAAABAAcFThhY5ln5gMTHALGOhOyg==
caps mon = allow *

5.3 各节点安装Ceph软件

注意这里采用--no-adjust-repos,即install packages without modifying source repos

如果不使用这个参数,ceph的yum源会被进行修改,导致访问国外镜像源,最终安装速度过慢。

1
ceph-deploy install cephnode1 cephnode2 cephnode3 --no-adjust-repos

开始自动在各节点进行各组件的安装。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210102140903311.png

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210102140941919.png

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210102141001038.png

至此Ceph软件包在各节点安装完毕。

5.4 部署mon节点

5.2 步骤已经进行了集群初始化,生成了集群配置文件和秘钥。

接下来开始,我们开始部署其他组件。

首先是创建mon服务

注意:这里我们只在节点1上部署,这是后续集群各组件初始化的第一步。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
ceph-deploy mon create-initial

# 相关信息返回
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy mon create-initial
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : create-initial
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f01000d02d8>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function mon at 0x7f0100337488>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  keyrings                      : None
[ceph_deploy.mon][DEBUG ] Deploying mon, cluster ceph hosts cephnode1
[ceph_deploy.mon][DEBUG ] detecting platform for host cephnode1 ...
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[cephnode1][DEBUG ] find the location of an executable
[ceph_deploy.mon][INFO  ] distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[cephnode1][DEBUG ] determining if provided host has same hostname in remote
[cephnode1][DEBUG ] get remote short hostname
[cephnode1][DEBUG ] deploying mon to cephnode1
[cephnode1][DEBUG ] get remote short hostname
[cephnode1][DEBUG ] remote hostname: cephnode1
[cephnode1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode1][DEBUG ] create the mon path if it does not exist
[cephnode1][DEBUG ] checking for done path: /var/lib/ceph/mon/ceph-cephnode1/done
[cephnode1][DEBUG ] done path does not exist: /var/lib/ceph/mon/ceph-cephnode1/done
[cephnode1][INFO  ] creating keyring file: /var/lib/ceph/tmp/ceph-cephnode1.mon.keyring
[cephnode1][DEBUG ] create the monitor keyring file
[cephnode1][INFO  ] Running command: ceph-mon --cluster ceph --mkfs -i cephnode1 --keyring /var/lib/ceph/tmp/ceph-cephnode1.mon.keyring --setuser 167 --setgroup 167
[cephnode1][INFO  ] unlinking keyring file /var/lib/ceph/tmp/ceph-cephnode1.mon.keyring
[cephnode1][DEBUG ] create a done file to avoid re-doing the mon deployment
[cephnode1][DEBUG ] create the init path if it does not exist
[cephnode1][INFO  ] Running command: systemctl enable ceph.target
[cephnode1][INFO  ] Running command: systemctl enable ceph-mon@cephnode1
[cephnode1][WARNIN] Created symlink from /etc/systemd/system/ceph-mon.target.wants/ceph-mon@cephnode1.service to /usr/lib/systemd/system/ceph-mon@.service.
[cephnode1][INFO  ] Running command: systemctl start ceph-mon@cephnode1
[cephnode1][INFO  ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.cephnode1.asok mon_status
[cephnode1][DEBUG ] ********************************************************************************
[cephnode1][DEBUG ] status for monitor: mon.cephnode1
[cephnode1][DEBUG ] {
[cephnode1][DEBUG ]   "election_epoch": 3, 
[cephnode1][DEBUG ]   "extra_probe_peers": [], 
[cephnode1][DEBUG ]   "feature_map": {
[cephnode1][DEBUG ]     "mon": [
[cephnode1][DEBUG ]       {
[cephnode1][DEBUG ]         "features": "0x3ffddff8ffecffff", 
[cephnode1][DEBUG ]         "num": 1, 
[cephnode1][DEBUG ]         "release": "luminous"
[cephnode1][DEBUG ]       }
[cephnode1][DEBUG ]     ]
[cephnode1][DEBUG ]   }, 
[cephnode1][DEBUG ]   "features": {
[cephnode1][DEBUG ]     "quorum_con": "4611087854035861503", 
[cephnode1][DEBUG ]     "quorum_mon": [
[cephnode1][DEBUG ]       "kraken", 
[cephnode1][DEBUG ]       "luminous", 
[cephnode1][DEBUG ]       "mimic", 
[cephnode1][DEBUG ]       "osdmap-prune", 
[cephnode1][DEBUG ]       "nautilus"
[cephnode1][DEBUG ]     ], 
[cephnode1][DEBUG ]     "required_con": "2449958747315912708", 
[cephnode1][DEBUG ]     "required_mon": [
[cephnode1][DEBUG ]       "kraken", 
[cephnode1][DEBUG ]       "luminous", 
[cephnode1][DEBUG ]       "mimic", 
[cephnode1][DEBUG ]       "osdmap-prune", 
[cephnode1][DEBUG ]       "nautilus"
[cephnode1][DEBUG ]     ]
[cephnode1][DEBUG ]   }, 
[cephnode1][DEBUG ]   "monmap": {
[cephnode1][DEBUG ]     "created": "2021-01-02 01:22:27.048750", 
[cephnode1][DEBUG ]     "epoch": 1, 
[cephnode1][DEBUG ]     "features": {
[cephnode1][DEBUG ]       "optional": [], 
[cephnode1][DEBUG ]       "persistent": [
[cephnode1][DEBUG ]         "kraken", 
[cephnode1][DEBUG ]         "luminous", 
[cephnode1][DEBUG ]         "mimic", 
[cephnode1][DEBUG ]         "osdmap-prune", 
[cephnode1][DEBUG ]         "nautilus"
[cephnode1][DEBUG ]       ]
[cephnode1][DEBUG ]     }, 
[cephnode1][DEBUG ]     "fsid": "00430ebb-5595-4c85-9c3b-faf94138ee4a", 
[cephnode1][DEBUG ]     "min_mon_release": 14, 
[cephnode1][DEBUG ]     "min_mon_release_name": "nautilus", 
[cephnode1][DEBUG ]     "modified": "2021-01-02 01:22:27.048750", 
[cephnode1][DEBUG ]     "mons": [
[cephnode1][DEBUG ]       {
[cephnode1][DEBUG ]         "addr": "172.18.2.3:6789/0", 
[cephnode1][DEBUG ]         "name": "cephnode1", 
[cephnode1][DEBUG ]         "public_addr": "172.18.2.3:6789/0", 
[cephnode1][DEBUG ]         "public_addrs": {
[cephnode1][DEBUG ]           "addrvec": [
[cephnode1][DEBUG ]             {
[cephnode1][DEBUG ]               "addr": "172.18.2.3:3300", 
[cephnode1][DEBUG ]               "nonce": 0, 
[cephnode1][DEBUG ]               "type": "v2"
[cephnode1][DEBUG ]             }, 
[cephnode1][DEBUG ]             {
[cephnode1][DEBUG ]               "addr": "172.18.2.3:6789", 
[cephnode1][DEBUG ]               "nonce": 0, 
[cephnode1][DEBUG ]               "type": "v1"
[cephnode1][DEBUG ]             }
[cephnode1][DEBUG ]           ]
[cephnode1][DEBUG ]         }, 
[cephnode1][DEBUG ]         "rank": 0
[cephnode1][DEBUG ]       }
[cephnode1][DEBUG ]     ]
[cephnode1][DEBUG ]   }, 
[cephnode1][DEBUG ]   "name": "cephnode1", 
[cephnode1][DEBUG ]   "outside_quorum": [], 
[cephnode1][DEBUG ]   "quorum": [
[cephnode1][DEBUG ]     0
[cephnode1][DEBUG ]   ], 
[cephnode1][DEBUG ]   "quorum_age": 2, 
[cephnode1][DEBUG ]   "rank": 0, 
[cephnode1][DEBUG ]   "state": "leader", 
[cephnode1][DEBUG ]   "sync_provider": []
[cephnode1][DEBUG ] }
[cephnode1][DEBUG ] ********************************************************************************

继续显示相关安装信息,这里显示mon服务已经部署运行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[cephnode1][INFO  ] monitor: mon.cephnode1 is running
[cephnode1][INFO  ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.cephnode1.asok mon_status
[ceph_deploy.mon][INFO  ] processing monitor mon.cephnode1
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[cephnode1][DEBUG ] find the location of an executable
[cephnode1][INFO  ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.cephnode1.asok mon_status
[ceph_deploy.mon][INFO  ] mon.cephnode1 monitor has reached quorum!
[ceph_deploy.mon][INFO  ] all initial monitors are running and have formed quorum
[ceph_deploy.mon][INFO  ] Running gatherkeys...
[ceph_deploy.gatherkeys][INFO  ] Storing keys in temp directory /tmp/tmpJbJKyP
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[cephnode1][DEBUG ] get remote short hostname
[cephnode1][DEBUG ] fetch remote file
[cephnode1][INFO  ] Running command: /usr/bin/ceph --connect-timeout=25 --cluster=ceph --admin-daemon=/var/run/ceph/ceph-mon.cephnode1.asok mon_status
[cephnode1][INFO  ] Running command: /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-cephnode1/keyring auth get client.admin
[cephnode1][INFO  ] Running command: /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-cephnode1/keyring auth get client.bootstrap-mds
[cephnode1][INFO  ] Running command: /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-cephnode1/keyring auth get client.bootstrap-mgr
[cephnode1][INFO  ] Running command: /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-cephnode1/keyring auth get client.bootstrap-osd
[cephnode1][INFO  ] Running command: /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-cephnode1/keyring auth get client.bootstrap-rgw
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.client.admin.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-mds.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-mgr.keyring
[ceph_deploy.gatherkeys][INFO  ] keyring 'ceph.mon.keyring' already exists
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-osd.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-rgw.keyring
[ceph_deploy.gatherkeys][INFO  ] Destroy temp directory /tmp/tmpJbJKyP

这步安装继续生成了多个keyring的五个文件。

这些都是各个服务组件的秘钥文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
ll
total 476
-rw-------. 1 root root    113 Jan  2 01:22 ceph.bootstrap-mds.keyring
-rw-------. 1 root root    113 Jan  2 01:22 ceph.bootstrap-mgr.keyring
-rw-------. 1 root root    113 Jan  2 01:22 ceph.bootstrap-osd.keyring
-rw-------. 1 root root    113 Jan  2 01:22 ceph.bootstrap-rgw.keyring
-rw-------. 1 root root    151 Jan  2 01:22 ceph.client.admin.keyring
-rw-r--r--. 1 root root    261 Jan  2 01:21 ceph.conf
-rw-r--r--. 1 root root 240869 Jan  2 01:22 ceph-deploy-ceph.log
-rw-------. 1 root root     73 Jan  2 01:21 ceph.mon.keyring

5.5 部署集群配置和秘钥至各节点

接下来我们直接连接集群,会发现无法连接

1
2
ceph -s
[errno 2] error connecting to the cluster

需要我们将秘钥文件和集群配置文件拷贝至各节点,注意在秘钥文件当前目录下执行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ceph-deploy admin cephnode1 cephnode2 cephnode3

# 相关信息返回
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy admin cephnode1 cephnode2 cephnode3
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7ff2d1ab4908>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  client                        : ['cephnode1', 'cephnode2', 'cephnode3']
[ceph_deploy.cli][INFO  ]  func                          : <function admin at 0x7ff2d23532a8>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to cephnode1
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[cephnode1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to cephnode2
[cephnode2][DEBUG ] connected to host: cephnode2 
[cephnode2][DEBUG ] detect platform information from remote host
[cephnode2][DEBUG ] detect machine type
[cephnode2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to cephnode3
[cephnode3][DEBUG ] connected to host: cephnode3 
[cephnode3][DEBUG ] detect platform information from remote host
[cephnode3][DEBUG ] detect machine type
[cephnode3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf

拷贝在各节点的/etc/ceph/目录下

1
2
3
4
5
ll
-rw-------. 1 root root 151 Jan  2 01:30 ceph.client.admin.keyring
-rw-r--r--. 1 root root 261 Jan  2 01:30 ceph.conf
-rw-r--r--. 1 root root  92 Dec 16 13:08 rbdmap
-rw-------. 1 root root   0 Jan  2 01:22 tmpDc5hmL

这时候继续访问集群,已经能够成功连接。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum cephnode1 (age 13m)
    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:

相关解释

1、集群状态正常HEALTH_OK

2、只有一个mon节点服务,quorum法定人数只有cephnode1这个节点

3、mgr和osd组件没有安装

4、pools资源无

【其他各节点,最好都用ceph -s命令做连接测试,用于测试集群初始化或者防火墙端口是否正确打开】

5.6 部署mgr节点

接下来我们部署mgr组件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ceph-deploy mgr create cephnode1

# 相关信息返回
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy mgr create cephnode1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  mgr                           : [('cephnode1', 'cephnode1')]
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : create
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fde4c03cb48>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function mgr at 0x7fde4c92d1b8>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.mgr][DEBUG ] Deploying mgr, cluster ceph hosts cephnode1:cephnode1
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[ceph_deploy.mgr][INFO  ] Distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[ceph_deploy.mgr][DEBUG ] remote host will use systemd
[ceph_deploy.mgr][DEBUG ] deploying mgr bootstrap to cephnode1
[cephnode1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode1][WARNIN] mgr keyring does not exist yet, creating one
[cephnode1][DEBUG ] create a keyring file
[cephnode1][DEBUG ] create path recursively if it doesn't exist
[cephnode1][INFO  ] Running command: ceph --cluster ceph --name client.bootstrap-mgr --keyring /var/lib/ceph/bootstrap-mgr/ceph.keyring auth get-or-create mgr.cephnode1 mon allow profile mgr osd allow * mds allow * -o /var/lib/ceph/mgr/ceph-cephnode1/keyring
[cephnode1][INFO  ] Running command: systemctl enable ceph-mgr@cephnode1
[cephnode1][WARNIN] Created symlink from /etc/systemd/system/ceph-mgr.target.wants/ceph-mgr@cephnode1.service to /usr/lib/systemd/system/ceph-mgr@.service.
[cephnode1][INFO  ] Running command: systemctl start ceph-mgr@cephnode1
[cephnode1][INFO  ] Running command: systemctl enable ceph.target

验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3
 
  services:
    mon: 1 daemons, quorum cephnode1 (age 28m)
    mgr: cephnode1(active, since 75s)
    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: 

可以看出mgr组件在cephnode1节点部署完成。

5.7 部署osd节点

mon以及mgr节点安装完成后,我们开始安装osd节点

我们先确保每个物理节点的均有准备环境中描述的两块裸盘。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
lsblk

NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   500G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   499G  0 part 
  ├─rhel00-root 253:0    0 483.2G  0 lvm  /
  └─rhel00-swap 253:1    0  15.8G  0 lvm  [SWAP]
sdb               8:16   0  1000G  0 disk 
sdc               8:32   0  1000G  0 disk 
sr0              11:0    1  1024M  0 rom

这里环境设计了两块裸盘,为了测试后续集群的可扩展性,我们设计先安装每个节点的第一块裸盘,待后续再扩展第二块裸盘。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
ceph-deploy osd create cephnode1 --data /dev/sdb

# 相关信息返回
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy osd create cephnode1 --data /dev/sdb
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  bluestore                     : None
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fa28b1148c0>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  fs_type                       : xfs
[ceph_deploy.cli][INFO  ]  block_wal                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  journal                       : None
[ceph_deploy.cli][INFO  ]  subcommand                    : create
[ceph_deploy.cli][INFO  ]  host                          : cephnode1
[ceph_deploy.cli][INFO  ]  filestore                     : None
[ceph_deploy.cli][INFO  ]  func                          : <function osd at 0x7fa28b362938>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  zap_disk                      : False
[ceph_deploy.cli][INFO  ]  data                          : /dev/sdb
[ceph_deploy.cli][INFO  ]  block_db                      : None
[ceph_deploy.cli][INFO  ]  dmcrypt                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  dmcrypt_key_dir               : /etc/ceph/dmcrypt-keys
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  debug                         : False
[ceph_deploy.osd][DEBUG ] Creating OSD on cluster ceph with data device /dev/sdb
[cephnode1][DEBUG ] connected to host: cephnode1 
[cephnode1][DEBUG ] detect platform information from remote host
[cephnode1][DEBUG ] detect machine type
[cephnode1][DEBUG ] find the location of an executable
[ceph_deploy.osd][INFO  ] Distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[ceph_deploy.osd][DEBUG ] Deploying osd to cephnode1
[cephnode1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode1][WARNIN] osd keyring does not exist yet, creating one
[cephnode1][DEBUG ] create a keyring file
[cephnode1][DEBUG ] find the location of an executable
[cephnode1][INFO  ] Running command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/sdb
[cephnode1][WARNIN] Running command: /usr/bin/ceph-authtool --gen-print-key
[cephnode1][WARNIN] Running command: /usr/bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -i - osd new d2a11fa5-a73e-4df9-945b-9bde90b311e2
[cephnode1][WARNIN] Running command: /usr/sbin/vgcreate --force --yes ceph-f3e55070-94c3-48df-9e1e-feefb297ee64 /dev/sdb
[cephnode1][WARNIN]  stdout: Physical volume "/dev/sdb" successfully created.
[cephnode1][WARNIN]  stdout: Volume group "ceph-f3e55070-94c3-48df-9e1e-feefb297ee64" successfully created
[cephnode1][WARNIN] Running command: /usr/sbin/lvcreate --yes -l 255999 -n osd-block-d2a11fa5-a73e-4df9-945b-9bde90b311e2 ceph-f3e55070-94c3-48df-9e1e-feefb297ee64
[cephnode1][WARNIN]  stdout: Logical volume "osd-block-d2a11fa5-a73e-4df9-945b-9bde90b311e2" created.
[cephnode1][WARNIN] Running command: /usr/bin/ceph-authtool --gen-print-key
[cephnode1][WARNIN] Running command: /usr/bin/mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-0
[cephnode1][WARNIN] Running command: /usr/sbin/restorecon /var/lib/ceph/osd/ceph-0
[cephnode1][WARNIN] Running command: /usr/bin/chown -h ceph:ceph /dev/ceph-f3e55070-94c3-48df-9e1e-feefb297ee64/osd-block-d2a11fa5-a73e-4df9-945b-9bde90b311e2
[cephnode1][WARNIN] Running command: /usr/bin/chown -R ceph:ceph /dev/dm-2
[cephnode1][WARNIN] Running command: /usr/bin/ln -s /dev/ceph-f3e55070-94c3-48df-9e1e-feefb297ee64/osd-block-d2a11fa5-a73e-4df9-945b-9bde90b311e2 /var/lib/ceph/osd/ceph-0/block
[cephnode1][WARNIN] Running command: /usr/bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring mon getmap -o /var/lib/ceph/osd/ceph-0/activate.monmap
[cephnode1][WARNIN]  stderr: 2021-01-02 02:06:12.888 7f6bd4f40700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.bootstrap-osd.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
[cephnode1][WARNIN] 2021-01-02 02:06:12.888 7f6bd4f40700 -1 AuthRegistry(0x7f6bd0065af8) no keyring found at /etc/ceph/ceph.client.bootstrap-osd.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,, disabling cephx
[cephnode1][WARNIN]  stderr: got monmap epoch 1
[cephnode1][WARNIN] Running command: /usr/bin/ceph-authtool /var/lib/ceph/osd/ceph-0/keyring --create-keyring --name osd.0 --add-key AQBjG/BfHUoMMRAAElYRH3YgIWcT77iOpi8BbQ==
[cephnode1][WARNIN]  stdout: creating /var/lib/ceph/osd/ceph-0/keyring
[cephnode1][WARNIN] added entity osd.0 auth(key=AQBjG/BfHUoMMRAAElYRH3YgIWcT77iOpi8BbQ==)
[cephnode1][WARNIN] Running command: /usr/bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-0/keyring
[cephnode1][WARNIN] Running command: /usr/bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-0/
[cephnode1][WARNIN] Running command: /usr/bin/ceph-osd --cluster ceph --osd-objectstore bluestore --mkfs -i 0 --monmap /var/lib/ceph/osd/ceph-0/activate.monmap --keyfile - --osd-data /var/lib/ceph/osd/ceph-0/ --osd-uuid d2a11fa5-a73e-4df9-945b-9bde90b311e2 --setuser ceph --setgroup ceph
[cephnode1][WARNIN]  stderr: 2021-01-02 02:06:13.431 7fd104437a80 -1 bluestore(/var/lib/ceph/osd/ceph-0/) _read_fsid unparsable uuid
[cephnode1][WARNIN] --> ceph-volume lvm prepare successful for: /dev/sdb
[cephnode1][WARNIN] Running command: /usr/bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-0
[cephnode1][WARNIN] Running command: /usr/bin/ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev /dev/ceph-f3e55070-94c3-48df-9e1e-feefb297ee64/osd-block-d2a11fa5-a73e-4df9-945b-9bde90b311e2 --path /var/lib/ceph/osd/ceph-0 --no-mon-config
[cephnode1][WARNIN] Running command: /usr/bin/ln -snf /dev/ceph-f3e55070-94c3-48df-9e1e-feefb297ee64/osd-block-d2a11fa5-a73e-4df9-945b-9bde90b311e2 /var/lib/ceph/osd/ceph-0/block
[cephnode1][WARNIN] Running command: /usr/bin/chown -h ceph:ceph /var/lib/ceph/osd/ceph-0/block
[cephnode1][WARNIN] Running command: /usr/bin/chown -R ceph:ceph /dev/dm-2
[cephnode1][WARNIN] Running command: /usr/bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-0
[cephnode1][WARNIN] Running command: /usr/bin/systemctl enable ceph-volume@lvm-0-d2a11fa5-a73e-4df9-945b-9bde90b311e2
[cephnode1][WARNIN]  stderr: Created symlink from /etc/systemd/system/multi-user.target.wants/ceph-volume@lvm-0-d2a11fa5-a73e-4df9-945b-9bde90b311e2.service to /usr/lib/systemd/system/ceph-volume@.service.
[cephnode1][WARNIN] Running command: /usr/bin/systemctl enable --runtime ceph-osd@0
[cephnode1][WARNIN]  stderr: Created symlink from /run/systemd/system/ceph-osd.target.wants/ceph-osd@0.service to /usr/lib/systemd/system/ceph-osd@.service.
[cephnode1][WARNIN] Running command: /usr/bin/systemctl start ceph-osd@0
[cephnode1][WARNIN] --> ceph-volume lvm activate successful for osd ID: 0
[cephnode1][WARNIN] --> ceph-volume lvm create successful for: /dev/sdb
[cephnode1][INFO  ] checking OSD status...
[cephnode1][DEBUG ] find the location of an executable
[cephnode1][INFO  ] Running command: /bin/ceph --cluster=ceph osd stat --format=json
[ceph_deploy.osd][DEBUG ] Host cephnode1 is now ready for osd use.

从日志可以看出,默认文件系统是XFSjournal功能为None,如果有单独的SSD可以开启用于WAL盘。

【验证】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_WARN
            OSD count 1 < osd_pool_default_size 3
 
  services:
    mon: 1 daemons, quorum cephnode1 (age 49m)
    mgr: cephnode1(active, since 22m)
    osd: 1 osds: 1 up (since 5m), 1 in (since 5m)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   1.0 GiB used, 999 GiB / 1000 GiB avail
    pgs:     

注意,因为OSD组件已经部署,由于目前只是在节点1上部署,因此集群状态为HEALTH_WARN

原因是小于默认的3副本设置的数量。

继续在节点2和节点3上部署osd组件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
ceph-deploy osd create cephnode2 --data /dev/sdb


# 相关信息返回
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy osd create cephnode2 --data /dev/sdb
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  bluestore                     : None
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f634f53e8c0>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  fs_type                       : xfs
[ceph_deploy.cli][INFO  ]  block_wal                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  journal                       : None
[ceph_deploy.cli][INFO  ]  subcommand                    : create
[ceph_deploy.cli][INFO  ]  host                          : cephnode2
[ceph_deploy.cli][INFO  ]  filestore                     : None
[ceph_deploy.cli][INFO  ]  func                          : <function osd at 0x7f634f78c938>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  zap_disk                      : False
[ceph_deploy.cli][INFO  ]  data                          : /dev/sdb
[ceph_deploy.cli][INFO  ]  block_db                      : None
[ceph_deploy.cli][INFO  ]  dmcrypt                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  dmcrypt_key_dir               : /etc/ceph/dmcrypt-keys
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  debug                         : False
[ceph_deploy.osd][DEBUG ] Creating OSD on cluster ceph with data device /dev/sdb
[cephnode2][DEBUG ] connected to host: cephnode2 
[cephnode2][DEBUG ] detect platform information from remote host
[cephnode2][DEBUG ] detect machine type
[cephnode2][DEBUG ] find the location of an executable
[ceph_deploy.osd][INFO  ] Distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[ceph_deploy.osd][DEBUG ] Deploying osd to cephnode2
[cephnode2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode2][DEBUG ] find the location of an executable
[cephnode2][INFO  ] Running command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/sdb
[cephnode2][WARNIN] Running command: /bin/ceph-authtool --gen-print-key
[cephnode2][WARNIN] Running command: /bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -i - osd new 2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c
[cephnode2][WARNIN] Running command: /usr/sbin/vgcreate --force --yes ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6 /dev/sdb

【注意】

如果这里节点1,即集群内的mon节点的3300及6789端口如果未开放。

接下来的相关信息无法返回,即node1节点上会等待node2上的状态返回

如果超时300秒,OSD Create命令将报错

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[cephnode2][WARNIN]  stdout: Physical volume "/dev/sdb" successfully created.
[cephnode2][WARNIN]  stdout: Volume group "ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6" successfully created
[cephnode2][WARNIN] Running command: /usr/sbin/lvcreate --yes -l 255999 -n osd-block-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6
[cephnode2][WARNIN]  stdout: Logical volume "osd-block-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c" created.
[cephnode2][WARNIN] Running command: /bin/ceph-authtool --gen-print-key
[cephnode2][WARNIN] Running command: /bin/mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-1
[cephnode2][WARNIN] Running command: /usr/sbin/restorecon /var/lib/ceph/osd/ceph-1
[cephnode2][WARNIN] Running command: /bin/chown -h ceph:ceph /dev/ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6/osd-block-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c
[cephnode2][WARNIN] Running command: /bin/chown -R ceph:ceph /dev/dm-2
[cephnode2][WARNIN] Running command: /bin/ln -s /dev/ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6/osd-block-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c /var/lib/ceph/osd/ceph-1/block
[cephnode2][WARNIN] Running command: /bin/ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring mon getmap -o /var/lib/ceph/osd/ceph-1/activate.monmap
[cephnode2][WARNIN]  stderr: 2021-01-02 03:35:20.819 7fd7cd74d700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.bootstrap-osd.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
[cephnode2][WARNIN] 2021-01-02 03:35:20.819 7fd7cd74d700 -1 AuthRegistry(0x7fd7c8065af8) no keyring found at /etc/ceph/ceph.client.bootstrap-osd.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,, disabling cephx
[cephnode2][WARNIN]  stderr: got monmap epoch 1
[cephnode2][WARNIN] Running command: /bin/ceph-authtool /var/lib/ceph/osd/ceph-1/keyring --create-keyring --name osd.1 --add-key AQBHMPBfegGRLRAA4YWHG9f+Y8kplwk6GsgIfA==
[cephnode2][WARNIN]  stdout: creating /var/lib/ceph/osd/ceph-1/keyring
[cephnode2][WARNIN] added entity osd.1 auth(key=AQBHMPBfegGRLRAA4YWHG9f+Y8kplwk6GsgIfA==)
[cephnode2][WARNIN] Running command: /bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-1/keyring
[cephnode2][WARNIN] Running command: /bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-1/
[cephnode2][WARNIN] Running command: /bin/ceph-osd --cluster ceph --osd-objectstore bluestore --mkfs -i 1 --monmap /var/lib/ceph/osd/ceph-1/activate.monmap --keyfile - --osd-data /var/lib/ceph/osd/ceph-1/ --osd-uuid 2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c --setuser ceph --setgroup ceph
[cephnode2][WARNIN]  stderr: 2021-01-02 03:35:21.350 7f26559f8a80 -1 bluestore(/var/lib/ceph/osd/ceph-1/) _read_fsid unparsable uuid
[cephnode2][WARNIN] --> ceph-volume lvm prepare successful for: /dev/sdb
[cephnode2][WARNIN] Running command: /bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-1
[cephnode2][WARNIN] Running command: /bin/ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev /dev/ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6/osd-block-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c --path /var/lib/ceph/osd/ceph-1 --no-mon-config
[cephnode2][WARNIN] Running command: /bin/ln -snf /dev/ceph-392aab31-6f94-44f9-aa31-3a0894a8c4e6/osd-block-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c /var/lib/ceph/osd/ceph-1/block
[cephnode2][WARNIN] Running command: /bin/chown -h ceph:ceph /var/lib/ceph/osd/ceph-1/block
[cephnode2][WARNIN] Running command: /bin/chown -R ceph:ceph /dev/dm-2
[cephnode2][WARNIN] Running command: /bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-1
[cephnode2][WARNIN] Running command: /bin/systemctl enable ceph-volume@lvm-1-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c
[cephnode2][WARNIN]  stderr: Created symlink from /etc/systemd/system/multi-user.target.wants/ceph-volume@lvm-1-2a3f5398-e1bd-49fa-9a52-a9deb1da2d5c.service to /usr/lib/systemd/system/ceph-volume@.service.
[cephnode2][WARNIN] Running command: /bin/systemctl enable --runtime ceph-osd@1
[cephnode2][WARNIN]  stderr: Created symlink from /run/systemd/system/ceph-osd.target.wants/ceph-osd@1.service to /usr/lib/systemd/system/ceph-osd@.service.
[cephnode2][WARNIN] Running command: /bin/systemctl start ceph-osd@1
[cephnode2][WARNIN] --> ceph-volume lvm activate successful for osd ID: 1
[cephnode2][WARNIN] --> ceph-volume lvm create successful for: /dev/sdb
[cephnode2][INFO  ] checking OSD status...
[cephnode2][DEBUG ] find the location of an executable
[cephnode2][INFO  ] Running command: /bin/ceph --cluster=ceph osd stat --format=json
[ceph_deploy.osd][DEBUG ] Host cephnode2 is now ready for osd use.

继续节点3 OSD创建

1
ceph-deploy osd create cephnode3 --data /dev/sdb

【验证】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum cephnode1 (age 2h)
    mgr: cephnode1(active, since 119m)
    osd: 3 osds: 3 up (since 95s), 3 in (since 95s)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 2.9 TiB / 2.9 TiB avail
    pgs:

可以看出,现在集群状态HEALTH_OK

继续查看OSD状态,三个节点每个1个裸盘

1
2
3
4
5
6
7
8
9
ceph osd tree
ID CLASS WEIGHT  TYPE NAME          STATUS REWEIGHT PRI-AFF 
-1       2.92978 root default                               
-3       0.97659     host cephnode1                         
 0   hdd 0.97659         osd.0          up  1.00000 1.00000 
-5       0.97659     host cephnode2                         
 1   hdd 0.97659         osd.1          up  1.00000 1.00000 
-7       0.97659     host cephnode3                         
 2   hdd 0.97659         osd.2          up  1.00000 1.00000 

5.8 扩展mon节点

mon组件是所有组件最重要的,要确保mon组件高可用,因此需要扩展此项组件。

Ceph monitor采用Paxos算法,因此最佳实践是大于等于3的奇数。

这里将节点2和节点3添加到mon角色。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
ceph-deploy mon add cephnode2


# 相关信息返回
ceph-deploy mon add cephnode2
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy mon add cephnode2
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : add
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fbdd95b92d8>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  mon                           : ['cephnode2']
[ceph_deploy.cli][INFO  ]  func                          : <function mon at 0x7fbdd9820488>
[ceph_deploy.cli][INFO  ]  address                       : None
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.mon][INFO  ] ensuring configuration of new mon host: cephnode2
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to cephnode2
[cephnode2][DEBUG ] connected to host: cephnode2 
[cephnode2][DEBUG ] detect platform information from remote host
[cephnode2][DEBUG ] detect machine type
[cephnode2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.mon][DEBUG ] Adding mon to cluster ceph, host cephnode2
[ceph_deploy.mon][DEBUG ] using mon address by resolving host: 172.18.2.4
[ceph_deploy.mon][DEBUG ] detecting platform for host cephnode2 ...
[cephnode2][DEBUG ] connected to host: cephnode2 
[cephnode2][DEBUG ] detect platform information from remote host
[cephnode2][DEBUG ] detect machine type
[cephnode2][DEBUG ] find the location of an executable
[ceph_deploy.mon][INFO  ] distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[cephnode2][DEBUG ] determining if provided host has same hostname in remote
[cephnode2][DEBUG ] get remote short hostname
[cephnode2][DEBUG ] adding mon to cephnode2
[cephnode2][DEBUG ] get remote short hostname
[cephnode2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode2][DEBUG ] create the mon path if it does not exist
[cephnode2][DEBUG ] checking for done path: /var/lib/ceph/mon/ceph-cephnode2/done
[cephnode2][DEBUG ] done path does not exist: /var/lib/ceph/mon/ceph-cephnode2/done
[cephnode2][INFO  ] creating keyring file: /var/lib/ceph/tmp/ceph-cephnode2.mon.keyring
[cephnode2][DEBUG ] create the monitor keyring file
[cephnode2][INFO  ] Running command: ceph --cluster ceph mon getmap -o /var/lib/ceph/tmp/ceph.cephnode2.monmap
[cephnode2][WARNIN] got monmap epoch 1
[cephnode2][INFO  ] Running command: ceph-mon --cluster ceph --mkfs -i cephnode2 --monmap /var/lib/ceph/tmp/ceph.cephnode2.monmap --keyring /var/lib/ceph/tmp/ceph-cephnode2.mon.keyring --setuser 167 --setgroup 167
[cephnode2][INFO  ] unlinking keyring file /var/lib/ceph/tmp/ceph-cephnode2.mon.keyring
[cephnode2][DEBUG ] create a done file to avoid re-doing the mon deployment
[cephnode2][DEBUG ] create the init path if it does not exist
[cephnode2][INFO  ] Running command: systemctl enable ceph.target
[cephnode2][INFO  ] Running command: systemctl enable ceph-mon@cephnode2
[cephnode2][WARNIN] Created symlink from /etc/systemd/system/ceph-mon.target.wants/ceph-mon@cephnode2.service to /usr/lib/systemd/system/ceph-mon@.service.
[cephnode2][INFO  ] Running command: systemctl start ceph-mon@cephnode2
[cephnode2][INFO  ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.cephnode2.asok mon_status
[cephnode2][WARNIN] cephnode2 is not defined in `mon initial members`
[cephnode2][WARNIN] monitor cephnode2 does not exist in monmap
[cephnode2][INFO  ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.cephnode2.asok mon_status
[cephnode2][DEBUG ] ********************************************************************************
[cephnode2][DEBUG ] status for monitor: mon.cephnode2
[cephnode2][DEBUG ] {
[cephnode2][DEBUG ]   "election_epoch": 0, 
[cephnode2][DEBUG ]   "extra_probe_peers": [], 
[cephnode2][DEBUG ]   "feature_map": {
[cephnode2][DEBUG ]     "mon": [
[cephnode2][DEBUG ]       {
[cephnode2][DEBUG ]         "features": "0x3ffddff8ffecffff", 
[cephnode2][DEBUG ]         "num": 1, 
[cephnode2][DEBUG ]         "release": "luminous"
[cephnode2][DEBUG ]       }
[cephnode2][DEBUG ]     ]
[cephnode2][DEBUG ]   }, 
[cephnode2][DEBUG ]   "features": {
[cephnode2][DEBUG ]     "quorum_con": "0", 
[cephnode2][DEBUG ]     "quorum_mon": [], 
[cephnode2][DEBUG ]     "required_con": "2449958197560098820", 
[cephnode2][DEBUG ]     "required_mon": [
[cephnode2][DEBUG ]       "kraken", 
[cephnode2][DEBUG ]       "luminous", 
[cephnode2][DEBUG ]       "mimic", 
[cephnode2][DEBUG ]       "osdmap-prune", 
[cephnode2][DEBUG ]       "nautilus"
[cephnode2][DEBUG ]     ]
[cephnode2][DEBUG ]   }, 
[cephnode2][DEBUG ]   "monmap": {
[cephnode2][DEBUG ]     "created": "2021-01-02 01:22:27.048750", 
[cephnode2][DEBUG ]     "epoch": 1, 
[cephnode2][DEBUG ]     "features": {
[cephnode2][DEBUG ]       "optional": [], 
[cephnode2][DEBUG ]       "persistent": [
[cephnode2][DEBUG ]         "kraken", 
[cephnode2][DEBUG ]         "luminous", 
[cephnode2][DEBUG ]         "mimic", 
[cephnode2][DEBUG ]         "osdmap-prune", 
[cephnode2][DEBUG ]         "nautilus"
[cephnode2][DEBUG ]       ]
[cephnode2][DEBUG ]     }, 
[cephnode2][DEBUG ]     "fsid": "00430ebb-5595-4c85-9c3b-faf94138ee4a", 
[cephnode2][DEBUG ]     "min_mon_release": 14, 
[cephnode2][DEBUG ]     "min_mon_release_name": "nautilus", 
[cephnode2][DEBUG ]     "modified": "2021-01-02 01:22:27.048750", 
[cephnode2][DEBUG ]     "mons": [
[cephnode2][DEBUG ]       {
[cephnode2][DEBUG ]         "addr": "172.18.2.3:6789/0", 
[cephnode2][DEBUG ]         "name": "cephnode1", 
[cephnode2][DEBUG ]         "public_addr": "172.18.2.3:6789/0", 
[cephnode2][DEBUG ]         "public_addrs": {
[cephnode2][DEBUG ]           "addrvec": [
[cephnode2][DEBUG ]             {
[cephnode2][DEBUG ]               "addr": "172.18.2.3:3300", 
[cephnode2][DEBUG ]               "nonce": 0, 
[cephnode2][DEBUG ]               "type": "v2"
[cephnode2][DEBUG ]             }, 
[cephnode2][DEBUG ]             {
[cephnode2][DEBUG ]               "addr": "172.18.2.3:6789", 
[cephnode2][DEBUG ]               "nonce": 0, 
[cephnode2][DEBUG ]               "type": "v1"
[cephnode2][DEBUG ]             }
[cephnode2][DEBUG ]           ]
[cephnode2][DEBUG ]         }, 
[cephnode2][DEBUG ]         "rank": 0
[cephnode2][DEBUG ]       }
[cephnode2][DEBUG ]     ]
[cephnode2][DEBUG ]   }, 
[cephnode2][DEBUG ]   "name": "cephnode2", 
[cephnode2][DEBUG ]   "outside_quorum": [], 
[cephnode2][DEBUG ]   "quorum": [], 
[cephnode2][DEBUG ]   "rank": -1, 
[cephnode2][DEBUG ]   "state": "probing", 
[cephnode2][DEBUG ]   "sync_provider": []
[cephnode2][DEBUG ] }
[cephnode2][DEBUG ] ********************************************************************************
[cephnode2][INFO  ] monitor: mon.cephnode2 is currently at the state of probing

继续添加节点3,或者使用ceph mon add cephnode2 cephnode3命令。

【验证】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum cephnode1,cephnode2,cephnode3 (age 0.868061s)
    mgr: cephnode1(active, since 6h)
    osd: 3 osds: 3 up (since 4h), 3 in (since 4h)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 2.9 TiB / 2.9 TiB avail
    pgs:  

可以看出,目前monitor节点为3个。

quorum cephnode1,cephnode2,cephnode3

1
2
3
ceph mon stat

e3: 3 mons at {cephnode1=[v2:172.18.2.3:3300/0,v1:172.18.2.3:6789/0],cephnode2=[v2:172.18.2.4:3300/0,v1:172.18.2.4:6789/0],cephnode3=[v2:172.18.2.5:3300/0,v1:172.18.2.5:6789/0]}, election epoch 12, leader 0 cephnode1, quorum 0,1,2 cephnode1,cephnode2,cephnode3

leader 0 cephnode1代表节点1为leader。

三个法定人成员为cephnode1,cephnode2,cephnode3

继续验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ceph mon dump

# 返回相关信息
dumped monmap epoch 3
epoch 3
fsid 00430ebb-5595-4c85-9c3b-faf94138ee4a
last_changed 2021-01-02 07:53:26.100977
created 2021-01-02 01:22:27.048750
min_mon_release 14 (nautilus)
0: [v2:172.18.2.3:3300/0,v1:172.18.2.3:6789/0] mon.cephnode1
1: [v2:172.18.2.4:3300/0,v1:172.18.2.4:6789/0] mon.cephnode2
2: [v2:172.18.2.5:3300/0,v1:172.18.2.5:6789/0] mon.cephnode3

5.9 扩展mgr节点

mgr组件两种状态,分别是activestandby。状态可以通过ceph -s查看。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
ceph-deploy mgr create cephnode2 cephnode3

# 返回相关信息
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy mgr create cephnode2 cephnode3
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  mgr                           : [('cephnode2', 'cephnode2'), ('cephnode3', 'cephnode3')]
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : create
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7ff22bd86b48>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function mgr at 0x7ff22c6771b8>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.mgr][DEBUG ] Deploying mgr, cluster ceph hosts cephnode2:cephnode2 cephnode3:cephnode3
[cephnode2][DEBUG ] connected to host: cephnode2 
[cephnode2][DEBUG ] detect platform information from remote host
[cephnode2][DEBUG ] detect machine type
[ceph_deploy.mgr][INFO  ] Distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[ceph_deploy.mgr][DEBUG ] remote host will use systemd
[ceph_deploy.mgr][DEBUG ] deploying mgr bootstrap to cephnode2
[cephnode2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode2][WARNIN] mgr keyring does not exist yet, creating one
[cephnode2][DEBUG ] create a keyring file
[cephnode2][DEBUG ] create path recursively if it doesn't exist
[cephnode2][INFO  ] Running command: ceph --cluster ceph --name client.bootstrap-mgr --keyring /var/lib/ceph/bootstrap-mgr/ceph.keyring auth get-or-create mgr.cephnode2 mon allow profile mgr osd allow * mds allow * -o /var/lib/ceph/mgr/ceph-cephnode2/keyring
[cephnode2][INFO  ] Running command: systemctl enable ceph-mgr@cephnode2
[cephnode2][WARNIN] Created symlink from /etc/systemd/system/ceph-mgr.target.wants/ceph-mgr@cephnode2.service to /usr/lib/systemd/system/ceph-mgr@.service.
[cephnode2][INFO  ] Running command: systemctl start ceph-mgr@cephnode2
[cephnode2][INFO  ] Running command: systemctl enable ceph.target
[cephnode3][DEBUG ] connected to host: cephnode3 
[cephnode3][DEBUG ] detect platform information from remote host
[cephnode3][DEBUG ] detect machine type
[ceph_deploy.mgr][INFO  ] Distro info: Red Hat Enterprise Linux Server 7.8 Maipo
[ceph_deploy.mgr][DEBUG ] remote host will use systemd
[ceph_deploy.mgr][DEBUG ] deploying mgr bootstrap to cephnode3
[cephnode3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[cephnode3][WARNIN] mgr keyring does not exist yet, creating one
[cephnode3][DEBUG ] create a keyring file
[cephnode3][DEBUG ] create path recursively if it doesn't exist
[cephnode3][INFO  ] Running command: ceph --cluster ceph --name client.bootstrap-mgr --keyring /var/lib/ceph/bootstrap-mgr/ceph.keyring auth get-or-create mgr.cephnode3 mon allow profile mgr osd allow * mds allow * -o /var/lib/ceph/mgr/ceph-cephnode3/keyring
[cephnode3][INFO  ] Running command: systemctl enable ceph-mgr@cephnode3
[cephnode3][WARNIN] Created symlink from /etc/systemd/system/ceph-mgr.target.wants/ceph-mgr@cephnode3.service to /usr/lib/systemd/system/ceph-mgr@.service.
[cephnode3][INFO  ] Running command: systemctl start ceph-mgr@cephnode3
[cephnode3][INFO  ] Running command: systemctl enable ceph.target

验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum cephnode1,cephnode2,cephnode3 (age 19m)
    mgr: cephnode1(active, since 6h), standbys: cephnode2, cephnode3
    osd: 3 osds: 3 up (since 4h), 3 in (since 4h)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 2.9 TiB / 2.9 TiB avail
    pgs: 

认此时Ceph集群中已经有3个mgr服务了,而且ceph-node1上的mgr是活跃的,其他两个节点的mgr服务都处于standbys状态。

集群完成后,可以简单看下集群状态

1
2
3
ceph health detail
# 返回
HEALTH_OK

———————至此采用ceph-deploy方式基本部署完成,后续《集群后配置》章节可以对集群继续扩展—————-

6.Cephadmin+Octopus部署方式

这个章节开始开始,我们更换使用Cephadmin方式部署Octopus。

之前用方式Ceph-deploy,如果之前已经部署过,需要删除包和清理数据。

采用Cephadmin方式部署Octopus,最大优点是容器化部署各项服务,将Ceph服务与操作系统进行了解耦,安装就是利用podman拉起镜像,几乎不污染底层操作系统。对于底层操作系统而言,只需要podmanpython,更何况前者是非守护进程方式运行。

同样,先说下Cephadmin方式安装流程(本质上和ceph-deploy也是一样,无非就是容器化的思维方式)

大致流程是

1、在节点1(部署节点)上部署cephadm工具

2、初始化Ceph集群,点火(bootstrap)!重点:有别于Ceph-deploy,不需要在其他各节点安装。

值得一提的是。如果装过OCP4,“ Bootstrap ”类似OCP4的点火,将创建一个正式的最小集群,只有一个mon和mgr节点。不同的事,不需要从临时控制平面转向正式控制平面,而是直接从最小集群横向扩展。默认情况下,然后再通过后续操作将mon扩展到3个节点,mgr扩展到2个节点。

3、扩展mon节点

4、扩展mgr节点

5、扩展osd节点

6.1 安装cephadm

建立一个服务器主机名数组,方便在多个Ceph节点安装podman python3的批处理。【非关键步骤】

1
CEPH_NODE_LIST="cephnode1 cephnode2 cephnode3"

首先需要在各节点安装podman python3,否则cephadm install ceph-common会提示无法找到podman

1
for i in $CEPH_NODE_LIST;  do ssh ${i} yum install -y podman python3 ; done

安装cephadm

https://github.com/ceph/ceph/blob/octopus/src/cephadm/cephadm

这里需要访问已经被DNS污染的raw.githubusercontent.com,参考《4.3 主机名和hosts设置》

1
2
3
4
5
curl -L -O  https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm
chmod +x cephadm

# 复制命令很重要,方便后续命令执行
cp cephadm /usr/bin/cephadm

6.2 创建bootstrap,初始化Ceph集群

初始化集群,开始拉镜像文件,所需要时间视网络情况。

这里--mon-ip后面填写公网地址,非存储专网地址。当然也支持多个mon网络。

几个参数解释如下:

1、--mon-ip 172.18.2.3/24:公网地址

2、--initial-dashboard-password *******:dashboard的密码

3、--dashboard-key cert.key:dashboard的TLS证书私钥

4、--dashboard-crt cert.crt:dashboard的TLS证书

5、--allow-overwrite:覆盖之前的集群初始化配置文件

6、--output-dir OUTPUT_DIR等等都可以通过cephadm bootstrap --help查阅。

【我对谷歌浏览器的报错有点洁癖,我基本都配置带自定义TLS服务器证书的服务,参数带了自定义证书】

关于自定义证书的配置教程详见《数字证书那点事(附CP4D及VCenter7定制TLS证书部署案例参考)》

先建立配置目录,否则后续初始化报错

1
mkdir -p /etc/ceph

开始点火创建初始集群。

注意1:可以单独配置Podman镜像仓库,选用微软源,这里不再另行配置。

注意2:如果需要重新配置,可以利用podman rm删除镜像,但需要提前清除/etc/ceph中的包和数据。

【正式点火,1,2,3~】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
cephadm bootstrap --mon-ip 172.18.2.3 --initial-dashboard-password password --dashboard-key cert.key --dashboard-crt cert.crt  --allow-overwrite


# 相关信息返回
Verifying podman|docker is present...
Verifying lvm2 is present...
Verifying time synchronization is in place...
Unit chronyd.service is enabled and running
Repeating the final host check...
podman|docker (/usr/bin/podman) is present
systemctl is present
lvcreate is present
Unit chronyd.service is enabled and running
Host looks OK
Cluster fsid: 63a7a1de-4e9d-11eb-bc4b-005056b11868
Verifying IP 172.18.2.3 port 3300 ...
Verifying IP 172.18.2.3 port 6789 ...
Mon IP 172.18.2.3 is in CIDR network 172.18.2.0/24
Pulling container image docker.io/ceph/ceph:v15...
Extracting ceph user uid/gid from container image...
Creating initial keys...
Creating initial monmap...
Creating mon...
firewalld ready
Waiting for mon to start...
Waiting for mon...
mon is available
Assimilating anything we can from ceph.conf...
Generating new minimal ceph.conf...
Restarting the monitor...
Setting mon public_network...
Creating mgr...
Verifying port 9283 ...
firewalld ready
firewalld ready
Wrote keyring to /etc/ceph/ceph.client.admin.keyring
Wrote config to /etc/ceph/ceph.conf
Waiting for mgr to start...
Waiting for mgr...
mgr not available, waiting (1/10)...
mgr not available, waiting (2/10)...
mgr not available, waiting (3/10)...
mgr is available
Enabling cephadm module...
Waiting for the mgr to restart...
Waiting for Mgr epoch 5...
Mgr epoch 5 is available
Setting orchestrator backend to cephadm...
Generating ssh key...
Wrote public SSH key to to /etc/ceph/ceph.pub
Adding key to root@localhost's authorized_keys...
Adding host cephnode1...
Deploying mon service with default placement...
Deploying mgr service with default placement...
Deploying crash service with default placement...
Enabling mgr prometheus module...
Deploying prometheus service with default placement...
Deploying grafana service with default placement...
Deploying node-exporter service with default placement...
Deploying alertmanager service with default placement...
Enabling the dashboard module...
Waiting for the mgr to restart...
Waiting for Mgr epoch 13...
Mgr epoch 13 is available
Using provided dashboard certificate...
Creating initial admin user...
Fetching dashboard port number...
firewalld ready
Ceph Dashboard is now available at:

             URL: https://cephnode1:8443/
            User: admin
        Password: password

You can access the Ceph CLI with:

        sudo /usr/sbin/cephadm shell --fsid 63a7a1de-4e9d-11eb-bc4b-005056b11868 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

Please consider enabling telemetry to help improve Ceph:

        ceph telemetry on

For more information see:

        https://docs.ceph.com/docs/master/mgr/telemetry/

Bootstrap complete.

注意这里会自动开启9283以及dashboard的8443端口

当然也可以通过--skip-firewalld不去配置防火墙端口。

可以登录Dashboard,无论是否手动指定密码,第一次登陆后系统均要求用户去更改初始密码。

注意,我这里登陆命令已经手动指定过Dashboard的初始密码,避免出现忘记记录初始化过程中的系统提示。

下图中可以看出我已经配置过服务器TLS证书,Chrome已经可以正常访问。【因为是企业自定义根证书签名,因此前提是需要将企业统一的CA证书导入到系统中,这部分可以参考之前教程】

如果不配置服务器TLS证书,可能需要Safari或者Firefox才能正常访问。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210105081932619.png

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210105081856575.png

集群刚开始状态。目前是单节点状态,集群状态是HEALTH_WARN,后续开始扩展mon节点。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210104165559877.png

【重要,启用cephadm shell】

1
sudo /usr/sbin/cephadm shell --fsid 63a7a1de-4e9d-11eb-bc4b-005056b11868 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

集群状态【注意在前面cephadm shell环境下执行下述命令】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 或者用cephadm shell  -- ceph -s
ceph -s  
  cluster:
    id:     63a7a1de-4e9d-11eb-bc4b-005056b11868
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum cephnode1 (age 5m)
    mgr: cephnode1.sducuz(active, since 4m)
    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:   

【重要初始化集群后】

  • 为本地主机上的新群集创建monitor和manager守护程序。
  • 为 Ceph 群集生成新的 SSH 密钥,并将其添加到root用户的文件/root/.ssh/authorized_keys
  • 将与新群集通信所需的最小配置文件保存到 /etc/ceph/ceph.conf
  • client.admin管理(特权!)密钥的副本写入/etc/ceph/ceph.client.admin.keyring
  • 将公钥的副本写入/etc/ceph/ceph.pub,后续要将公钥复制到其他节点。

【在节点1可以验证】

1
2
3
4
5
6
7
8
9
podman ps

# 返回
CONTAINER ID  IMAGE                                 COMMAND               CREATED        STATUS            PORTS  NAMES
d5bb5cf722b8  docker.io/prom/prometheus:v2.18.1     --config.file=/et...  4 minutes ago  Up 4 minutes ago   ceph-63a7a1de-4e9d-11eb-bc4b-005056b11868-prometheus.cephnode1
178fda42253d  docker.io/prom/node-exporter:v0.18.1  --no-collector.ti...  4 minutes ago  Up 4 minutes ago   ceph-63a7a1de-4e9d-11eb-bc4b-005056b11868-node-exporter.cephnode1
1f698783d6b7  docker.io/ceph/ceph:v15    -n client.crash.c...  4 minutes ago  Up 4 minutes ago   ceph-63a7a1de-4e9d-11eb-bc4b-005056b11868-crash.cephnode1
928c798ec259  docker.io/ceph/ceph:v15    -n mgr.cephnode1....  6 minutes ago  Up 6 minutes ago   ceph-63a7a1de-4e9d-11eb-bc4b-005056b11868-mgr.cephnode1.sducuz
7386c3e16272  docker.io/ceph/ceph:v15    -n mon.cephnode1 ...  6 minutes ago  Up 6 minutes ago   ceph-63a7a1de-4e9d-11eb-bc4b-005056b11868-mon.cephnode1

可以看到节点1,Cephmon服务、mgr服务、client服务、prometheus服务器,均以容器的形态运行。

6.3 扩展mon节点

如开始所说,有别于Ceph-deployCephadmin不需要在其他各节点安装Ceph软件包。部署节点将通过公钥的免密安装,Python脚本将远端节点通过podman将服务拉起。

这也是为什么所有ceph节点只需要提前安装podmanpython的原因。

需要将集群公钥复制到远端节点2和节点3上,在复制分发前,可以验证并确认公钥位置。

这个公钥、配置文件等文件位置是在集群初始化中通过--output-dir OUTPUT_DIR制定。

1
2
3
4
5
6
7
8
ll /etc/ceph
total 16

# 四个文件,和之前ceph-deploy方式本质是一样的
-rw-------. 1 root root  63 Jan  4 03:52 ceph.client.admin.keyring
-rw-r--r--. 1 root root 171 Jan  4 03:52 ceph.conf
-rw-r--r--. 1 root root 595 Jan  4 03:53 ceph.pub
-rw-r--r--. 1 root root  92 Dec 16 13:05 rbdmap

将生成的Ceph集群节点之间通讯的公钥复制给节点2和节点3。注意这里的-f参数。

1
2
3
cd /etc/ceph
ssh-copy-id -f -i /etc/ceph/ceph.pub root@cephnode2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@cephnode3

将节点2和节点3正式加入到刚初始化后的集群。

添加节点到集群后,mon服务会自动启动,建议关闭自动部署mon的功能而去采用手动开启的功能。

默认一个公网地址端,mon服务的数量默认是5个,生产环境建议采用5个mon节点。超过5个后,后续节点不会自动部署mon服务了。

1
2
3
4
5
6
7
cephadm shell -- ceph orch apply mon --unmanaged

# 返回
Inferring fsid d7b6c88e-5217-11eb-8f8f-005056b11868
Inferring config /var/lib/ceph/d7b6c88e-5217-11eb-8f8f-005056b11868/mon.cephnode1/config
Using recent ceph image docker.io/ceph/ceph:v15
Scheduled mon update...

你会发现每次使用cephadm shell -- 命令,进入容器会比较慢,执行命令后退出自动销毁容器。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210109093901255.png

后续开始,我们采用两步命令方式,在容器内执行而不退出。

1
2
3
4
5
cephadm shell
Inferring fsid d7b6c88e-5217-11eb-8f8f-005056b11868
Inferring config /var/lib/ceph/d7b6c88e-5217-11eb-8f8f-005056b11868/mon.cephnode1/config
Using recent ceph image docker.io/ceph/ceph:v15
[ceph: root@cephnode1 /]# 

再执行相关命令就比较不会耗时。后续我不主动声明,Ceph相关命令均在Ceph shell环境下执行

1
2
[ceph: root@cephnode1 /]#ceph orch host add cephnode2
[ceph: root@cephnode1 /]#ceph orch host add cephnode3

注意:这里集群会检查各个物理节点的实际主机名,如果报错,请仔细检查其他节点的主机名。

验证

1
2
3
4
5
6
ceph orch host ls
# 返回
HOST       ADDR       LABELS  STATUS  
cephnode1  cephnode1                  
cephnode2  cephnode2                  
cephnode3  cephnode3

这时候,节点2和节点3开始下载镜像。镜像下载完成,节点2和节点3的Ceph服务就可以自动拉起了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 节点2
podman ps
CONTAINER ID  IMAGE                                 COMMAND               CREATED         STATUS             PORTS  NAMES
bd452430a08e  docker.io/prom/node-exporter:v0.18.1  --no-collector.ti...  18 seconds ago  Up 18 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-node-exporter.cephnode2
38d9863e9347  docker.io/ceph/ceph:v15               -n mon.cephnode2 ...  28 seconds ago  Up 28 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-mon.cephnode2
0617eca2e328  docker.io/ceph/ceph:v15               -n client.crash.c...  45 seconds ago  Up 44 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-crash.cephnode2


# 节点3
podman ps
CONTAINER ID  IMAGE                                 COMMAND               CREATED         STATUS             PORTS  NAMES
2234da06fd60  docker.io/prom/node-exporter:v0.18.1  --no-collector.ti...  15 seconds ago  Up 15 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-node-exporter.cephnode3
cbd768c0d7b6  docker.io/ceph/ceph:v15               -n mon.cephnode3 ...  29 seconds ago  Up 29 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-mon.cephnode3
566b8821e069  docker.io/ceph/ceph:v15               -n mgr.cephnode3....  35 seconds ago  Up 35 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-mgr.cephnode3.nkzxpo
bf017146bfde  docker.io/ceph/ceph:v15               -n client.crash.c...  40 seconds ago  Up 40 seconds ago         ceph-4b76d396-4ea2-11eb-8d3c-005056b11868-crash.cephnode3

开始给需要部署mon服务的节点打上标签

1
2
3
ceph orch host label add cephnode1 mon
ceph orch host label add cephnode2 mon
ceph orch host label add cephnode3 mon

验证

1
2
3
4
5
6
ceph orch host ls
# 返回
HOST       ADDR       LABELS  STATUS  
cephnode1  cephnode1  mon             
cephnode2  cephnode2  mon             
cephnode3  cephnode3  mon

开始在有mon标签的节点上开始部署mon

1
2
3
ceph orch apply mon label:mon
# 返回
Scheduled mon update...

继续验证【目前mon只有cephnode1节点】

1
2
ceph mon stat
e1: 1 mons at {cephnode1=[v2:172.18.2.3:3300/0,v1:172.18.2.3:6789/0]}, election epoch 5, leader 0 cephnode1, quorum 0 cephnode1

等待节点2和节点3的镜像拉起后

【查看集群状态】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
ceph -s
  cluster:
    id:     4b76d396-4ea2-11eb-8d3c-005056b11868
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 3 daemons, quorum cephnode1,cephnode3,cephnode2 (age 105s)
    mgr: cephnode1.ddaiox(active, since 4m), standbys: cephnode3.nkzxpo
    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:   

默认情况下,3个节点的Ceph集群初始化后具备3个mon节点,2个mgr节点。

可以通过ceph orch ls查看,可以看出

1、grafana期望数量为1,实际为0;【这个出错目前暂未解决】

2、mgr期望2个节点,实际为2;

3、mon期望3个节点,实际为3;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ceph  orch ls

# 返回
NAME           RUNNING  REFRESHED  AGE  PLACEMENT  IMAGE NAME              
alertmanager   0/1  83s ago    39m  count:1    docker.io/prom/alertmanager:v0.20.0    
crash      3/3  2m ago     39m  *          docker.io/ceph/ceph:v15             
grafana        0/1  83s ago    39m  count:1    docker.io/ceph/ceph-grafana:6.6.2      
mgr            2/2  2m ago     39m  count:2    docker.io/ceph/ceph:v15               
mon            3/3  2m ago     3m   label:mon  docker.io/ceph/ceph:v15                
node-exporter  3/3  2m ago    39m  *          docker.io/prom/node-exporter:v0.18.1    
prometheus     /1  83s ago    39m  count:1    docker.io/prom/prometheus:v2.18.1     

登录到Dashboard可以查看

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210105084307259.png

可以设置mon数目为3,默认为5

1
ceph orch apply mon 3

可以设置mon的ip段【此处不需要设置】

1
ceph config set mon public_network 192.168.254.0/24

调整mon,添加完主机后会自动安装mon,有可能mon不是安装在节点1-节点3这3台主机上【此处不设置】

1
ceph orch apply mon cephnod1,cephnod2,cephnod3

6.4 可能遇到的故障

mon节点扩展部署后,大概率出现以下报错

1、时间不同步,默认阈值是0.05s,超过就会报错。

2、osd报错,这个因为osd节点还未部署,可以忽略。至少为3个。

3、slow ops, oldest one blocked for,一直提示这个错误,时间同步处理完毕后,解决。

1
2
3
4
5
6
7
8
9
2021-01-09T01:59:14.499504+0000 mon.cephnode1 [WRN] 1 clock skew 0.0975435s > max 0.05s
2021-01-09T01:59:14.499562+0000 mon.cephnode1 [WRN] 2 clock skew 0.142122s > max 0.05s
2021-01-09T01:59:16.132982+0000 mon.cephnode1 [WRN] Health check update: clock skew detected on mon.cephnode3, mon.cephnode2 (MON_CLOCK_SKEW)
2021-01-09T01:59:44.639607+0000 mon.cephnode1 [WRN] message from mon.1 was stamped 0.057196s in the future, clocks not synchronized
2021-01-09T02:00:00.000204+0000 mon.cephnode1 [WRN] Health detail: HEALTH_WARN clock skew detected on mon.cephnode3, mon.cephnode2; OSD count 0 < osd_pool_default_size 3
2021-01-09T02:00:00.000237+0000 mon.cephnode1 [WRN] [WRN] MON_CLOCK_SKEW: clock skew detected on mon.cephnode3, mon.cephnode2
2021-01-09T02:00:00.000250+0000 mon.cephnode1 [WRN]     mon.cephnode3 clock skew 0.0975435s > max 0.05s (latency 0.00178512s)
2021-01-09T02:00:00.000259+0000 mon.cephnode1 [WRN]     mon.cephnode2 clock skew 0.142122s > max 0.05s (latency 0.00617212s)
2021-01-09T02:00:00.000267+0000 mon.cephnode1 [WRN] [WRN] TOO_FEW_OSDS: OSD count 0 < osd_pool_default_size 3

时间同步后

1
2
3
4
5
6
7
8
2021-01-09T11:19:25.132944+0000 mon.cephnode1 [WRN] 1 clock skew 0.101117s > max 0.05s
2021-01-09T11:20:00.000137+0000 mon.cephnode1 [WRN] overall HEALTH_WARN clock skew detected on mon.cephnode3
2021-01-09T11:24:29.242003+0000 mon.cephnode1 [INF] Health check cleared: MON_CLOCK_SKEW (was: clock skew detected on mon.cephnode3)
2021-01-09T11:24:29.242034+0000 mon.cephnode1 [INF] Cluster is now healthy
2021-01-09T11:30:00.000126+0000 mon.cephnode1 [INF] overall HEALTH_OK
2021-01-09T11:40:00.000134+0000 mon.cephnode1 [INF] overall HEALTH_OK
2021-01-09T11:50:00.000123+0000 mon.cephnode1 [INF] overall HEALTH_OK
2021-01-09T12:00:00.000162+0000 mon.cephnode1 [INF] overall HEALTH_OK

故障解决。

6.5 扩展OSD节点

前述集群部署完毕后,可以用以下命令显示集群中的存储设备清单

我们继续在前述那个cephadm shell 的容器环境下执行。

1
2
3
4
5
6
7
8
ceph orch device ls
Hostname   Path      Type  Serial  Size   Health   Ident  Fault  Available
cephnode1  /dev/sdb  hdd           1073G  Unknown  N/A    N/A    Yes
cephnode1  /dev/sdc  hdd           1073G  Unknown  N/A    N/A    Yes
cephnode2  /dev/sdb  hdd           1073G  Unknown  N/A    N/A    Yes
cephnode2  /dev/sdc  hdd           1073G  Unknown  N/A    N/A    Yes
cephnode3  /dev/sdb  hdd           1073G  Unknown  N/A    N/A    Yes
cephnode3  /dev/sdc  hdd           1073G  Unknown  N/A    N/A    Yes  

可以看出集群认出了3个节点的6个裸盘,每个裸盘1T,与设计环境一致。

从特定主机上的特定设备创建 OSD

通过三个命令,将节点1、节点2、节点3,各节点上的两块裸盘均追加至OSD节点。

1
2
3
ceph orch daemon add osd cephnode1:/dev/sdb,/dev/sdc
ceph orch daemon add osd cephnode2:/dev/sdb,/dev/sdc
ceph orch daemon add osd cephnode3:/dev/sdb,/dev/sdc

在追加硬盘过程中,可以登录Dashboard实时查看OSD情况。Dashboard会动态更新状态。

添加裸盘至OSD过程也比较耗时,请耐心等待。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210105084529202.png

7.集群后配置

7.1 创建pool

刚部署完毕的集群,资源池(pool)是空的。

下面命令无任何信息返回。【注意仍旧是在输入cephadm shell命令后,在容器环境下执行】

1
ceph osd lspools

继续创建pool,后面两个参数64代表的是pg和pgp的数量。

1
2
3
ceph osd pool create pool-demo1 64 64
# 返回
pool 'pool-demo1' created

验证

1
2
3
4
ceph osd lspools

# 返回
1 pool-demo1

我们也可以单独设置pool的pg和pgp的数量。Ocotopus版本有一个特性,PG支持Autoscales。

1
2
3
4
ceph osd pool set pool-demo1 pg_num 64

ceph osd pool set pool-demo1 pgp_num 64
set pool 1 pgp_num to 64

我们也可以获取相关信息

1
2
3
4
5
ceph osd pool get pool-demo1 pg_num
pg_num: 64

ceph osd pool get pool-demo1 pgp_num
pgp_num: 64

默认为3副本状态,获取

1
2
ceph osd pool get pool-demo1 size
size: 3

继续验证,可以看出目前拥有1个pools、64个pgs。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ceph -s
  cluster:
    id:     00430ebb-5595-4c85-9c3b-faf94138ee4a
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum cephnode1,cephnode2,cephnode3 (age 59m)
    mgr: cephnode1(active, since 7h), standbys: cephnode2, cephnode3
    osd: 3 osds: 3 up (since 5h), 3 in (since 5h)
 
  data:
    pools:   1 pools, 64 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 2.9 TiB / 2.9 TiB avail
    pgs:     64 active+clean

pool资源池创建后需要初始化或者指定application,否则集群会提示warn

1
rbd pool init pool-demo1

pool资源池创建后需要进行指定application,方便管理。

否则集群会提示warn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ceph health detail
# 提示有一个warn
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
    application not enabled on pool 'pool-demo1'
    use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
    

ceph osd pool application enable pool-demo1 rbd

# 返回
enabled application 'rbd' on pool 'pool-demo1'

7.2 创建RBD

RBD全称为RADOS Block Device,是一种构建在RADOS集群之上为客户端提供块设备接口的存储服务中间层。这类的客户端包括虚拟机KVM和云计算操作系统OpenStack、CloudStack等。

RBD为条带化,支持存储空间的动态扩容等特性,并可以借助RADOS实现快照,副本和一致性。

客户端访问RBD有两种方式。

1、通过内核模块rbd.ko将镜像映射为本地块设备。例如rbd map

2、通过librbd接口,KVM虚拟机就是使用这种接口。

首先先查看当前rbd情况

1
2
3
rbd -p pool-demo1 ls

#返回空

开始创建RBD,这里有两种创建命令不同的风格。【本人更倾向于风格2】

1
2
3
4
5
6
7
ceph osd lspools
# 返回pool-demo1这个之前创建的pool
1 pool-demo1
# 风格1创建,-p参数指定pool
rbd create -p pool-demo1 --size 5G --image rbd-demo1.img
# 风格2创建
rbd create pool-demo1/rbd-demo2.img --size 5G

验证

1
2
3
4
rbd -p pool-demo1 ls
# 返回之前创建的2个镜像文件
rbd-demo1.img
rbd-demo2.img

7.3 查看RBD镜像信息

创建RBD后除了上述查看RBD各种镜像名称

还可以查看RBD镜像信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
rbd info pool-demo1/rbd-demo2.img

# 返回相关信息
        size 5 GiB in 1280 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 11e2aad0ba87
        block_name_prefix: rbd_data.11e2aad0ba87
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features: 
        flags: 
        create_timestamp: Sun Jan  3 01:23:15 2021
        access_timestamp: Sun Jan  3 01:23:15 2021
        modify_timestamp: Sun Jan  3 01:23:15 2021

在ceph中,所有文件皆object。可以看出每个object是4Mib大小。

每个文件的前缀均以rbd_data.11e2aad0ba87开头。

这里的features是layering, exclusive-lock, object-map, fast-diff, deep-flatten。这是需要内核才能支持的各种特性。

7.4 删除RBD镜像

删除RBD镜像文件,我更倾向于使用风格2命令。

1
2
3
4
5
6
rbd rm pool-demo1/rbd-demo2.img
# 返回
Removing image: 100% complete...done.
# 验证
rbd -p pool-demo1 ls
rbd-demo1.img

关于Ceph的详细使用,本文不再进一步阐述。接下来我们将讲述在Openshift平台如何访问使用外部Ceph集群。

8.k8S/OpenshiftV3 访问外部Ceph

K8S是原生支持CephFS和CephRBD。但是有几个问题需要说明。

1、我们这里采用两类环境做测试,从《8.4安装外部Provisioners》我们都会根据Openshi3.11版本进行测试,K8S 1.11版本以上,只要把oc更改为kubectl,测试部署步骤几乎一致。

2、《8.11 OCP4的特例》是分析OCP4的底层操作系统采用RHCOS,这是一个Immutable Infrastructure。天生无rbd map命令导致物理节点无法attach到外部ceph。从而需要换种解决办法,即CSI方式去连接外部Ceph集群。

8.1 PV的“两阶段”机制

PV的执行一般来说是需要两个阶段生成,是靠独立于 kubelet 主控制循环(Kubelet Sync Loop)之外的两个控制循环来实现的。

两阶段有几个例外,其中一个是NFS,NFS本质是POD直接通过RPC调用实现的,直接就是第二阶段。

第一阶段:就是PV和宿主节点之间的挂载,你可以理解为Attach

负责维护的哥们叫AttachDetachController

它负责循检查 Pod通过SC或者pvc,和这个 Pod 所在宿主机之间挂载情况,当然也包括卸载。RBD的挂载就是靠这个哥们去先挂载到宿主机上的,千万不要理解成直接能够挂载到哪个POD内部。

在本例中我们后面会可以通过rbd status去查看wathcer

第二个阶段:就是将宿主机已挂载的卷在映射到POD内,你可以理解为ReMount

负责维护的哥们叫VolumeManagerReconciler。k8s的理念是一切阻扰上帝主循环的都要避开。

这个兄弟是单独的一个Goroutine。

I/O的操作相较于计算的耗时不是一个数量级的,K8S的主循环是上帝,绝对不能被block。

在本例中我们后面会在进入OCP的work节点通过lsblk去查看mount情况。

8.2 kube-controller-manager

大规模的K8S/OCP集群,是不可能手工去维护成千上万的PV的。

所以静态PV可以忽略,我们直接来说动态持久化存储。

AttachDetachControllerVolumeManagerReconciler这两个小弟,都有一个带头大哥,叫controller-manager

我们都知道如果要调用Ceph RBD,需要通过两种方式,详见《7.2 创建RBD》

客户端访问RBD有两种方式。

1、通过内核模块rbd.ko将镜像映射为本地块设备。例如rbd map

2、通过librbd接口,KVM虚拟机就是使用这种接口。

而带头大哥controller-manager是运行在Master节点上的,他默认是没有rbd客户端的。

StorageClass 本质就是 PV 的模板。最重要的属性就是provisioner,可以简单理解为外部插件或者外部命令。

8.3 进一步说明

回到开头,K8S是原生支持CephRBD,但是必须还是要安装rbd客户端才能完成PV两阶段的第一步。

怎么装?

K8S集群二进制安装或者OCP3(本质就是ansible安装的二进制定制版k8s)。

这里拿OCP 3.11版本来说明,参考:https://docs.openshift.com/container-platform/3.11/install_config/storage_examples/ceph_rbd_dynamic_example.html

1
2
yum install -y ceph-common
# The ceph-common library must be installed on all schedulable OpenShift Container Platform nodes.

同样的k8s也需要在每台k8s节点安装ceph-rbd命令包。

安装完毕后,将ceph的ceph.client.admin.keyring文件拷贝到master的/etc/ceph目录下。剩下的就是StorageClass时使用kubernetes.io/rbd即可正常使用ceph rbd provisioning功能了。

但是!总有例外

如果用kubeadm来部署集群,kube-controller-manager以容器的方式运行。这种方式下,dynamic provisioning自动管理存储生命周期时会报错。提示"rbd: create volume failed, err: failed to create rbd image: executable file not found in $PATH:"

问题来自gcr.io提供的kube-controller-manager容器镜像未打包ceph-common组件,缺少了rbd命令,因此无法通过rbd命令为pod创建rbd image,可以在kubernetes-incubator/external-storage项目通过External Provisioners的方式来解决此类问题。

推荐一个部署工具SealYun。建议用这个工具一键式安装二进制K8S集群。

8.4 安装外部Provisioners

首先得在kubernetes集群中安装rbd-provisioner,github仓库链接https://github.com/kubernetes-incubator/external-storage。

实际这个链接已经移走了(https://github.com/kubernetes-retired/external-storage)。

【推荐采用】

登录OCP,单独创建一个工作目录ceph

1
2
mkdir -p /root/ceph
cd /root/ceph

克隆仓库

1
2
3
4
5
6
7
8
git clone https://github.com/kubernetes-incubator/external-storage.git

# 返回
Cloning into 'external-storage'...
remote: Enumerating objects: 64319, done.
remote: Total 64319 (delta 0), reused 0 (delta 0), pack-reused 64319
Receiving objects: 100% (64319/64319), 113.79 MiB | 7.79 MiB/s, done.
Resolving deltas: 100% (29663/29663), done.

调整namespace,注意这里的namespace选择了kube-system,可以自行修改(这里采用sed命令快速替换)

1
2
3
cd external-storage/ceph/rbd/deploy

sed -r -i "s/namespace: [^ ]+/namespace: kube-system/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml

正式安装Provisioners

1
2
3
4
5
6
7
8
9
oc apply -f ./rbac -n kube-system

# 返回
clusterrole.rbac.authorization.k8s.io/rbd-provisioner created
clusterrolebinding.rbac.authorization.k8s.io/rbd-provisioner created
deployment.apps/rbd-provisioner created
role.rbac.authorization.k8s.io/rbd-provisioner created
rolebinding.rbac.authorization.k8s.io/rbd-provisioner created
serviceaccount/rbd-provisioner created

验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
oc describe deployments.apps -n kube-system rbd-provisioner

# 返回
Name:               rbd-provisioner
Namespace:          kube-system
CreationTimestamp:  Tue, 05 Jan 2021 16:26:08 +0800
Labels:             <none>
Annotations:        deployment.kubernetes.io/revision: 1
Selector:           app=rbd-provisioner
Replicas:           1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:       Recreate
MinReadySeconds:    0
Pod Template:
  Labels:           app=rbd-provisioner
  Service Account:  rbd-provisioner
  Containers:
   rbd-provisioner:
    Image:      quay.io/external_storage/rbd-provisioner:latest
    Port:       <none>
    Host Port:  <none>
    Environment:
      PROVISIONER_NAME:  ceph.com/rbd
    Mounts:              <none>
  Volumes:               <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   rbd-provisioner-c968dcb4b (1/1 replicas created)
Events:          <none>

8.5 Ceph上准备OCP客户端账号

创建用户,用于专门给OCP使用。

登录到Ceph Client节点,进入到最终ceph.client.ocp.keyring文件保存的目录

1
cd /root

生成账户,输出秘钥文件。

1
ceph auth get-or-create client.ocp mon 'allow r, allow command "osd blacklist"' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.ocp.keyring

验证

1
2
ll ceph.client.ocp.keyring
-rw-r--r--. 1 root root 61 Jan  6 22:59 ceph.client.ocp.keyring

如果忘记了,还可以通过下述命令进行查看

1
2
3
4
5
6
7
8
ceph auth get client.ocp

# 返回
exported keyring for client.ocp
[client.ocp]
        key = AQA5BPtfutlEDxAAuc28S6UYHs0M2wubkR4+hA==
        caps mon = "allow r, allow command \"osd blacklist\""
        caps osd = "allow class-read object_prefix rbd_children, allow rwx pool=kube"

如果我们发现pool字段指定错误,我们可以修改

1
ceph auth caps client.ocp mon 'allow r, allow command "osd blacklist"' osd 'allow class-read object_prefix rbd_children, allow rwx pool=ocp4-pool1'

至此

OCP访问Ceph的账户完成,接下来要解决访问秘钥在OCP加密存储问题。

8.6 OCP Secret

要解决访问秘钥在OCP加密存储问题,我们选择K8S/OPC内生的Secret对象。

首先我们需要在OCP中创建Secret。

之前在Mysql MGRETCD教程里,都是用了Configmap对象用来保存明文格式,用于将配置文件等传入至POD中。

K8S/OPC中的Secret 对象类型是用来保存诸如密码等敏感信息的。

这些敏感信息包括:密码、登录凭证、OAuth 令牌和ssh key等。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
oc create secret -h
Create a secret using specified subcommand.

Usage:
  oc create secret [flags]

Available Commands:
  docker-registry Create a secret for use with a Docker registry
  generic         Create a secret from a local file, directory or literal value
  tls             Create a TLS secret

从说明可以看出这三种不同子命令适用不同情况:

  1. generic:使用命令参数或文件创建secret。OpenShift支持的文件有以下类型:key-value键值对文件、docker或podman登录Registry的身份凭证文件、git客户端登录git服务器的身份凭证文件等。
  2. docker-registry:使用docker或podman登录Registry,然后用生成的身份凭证创建secret。注意,当还没有身份凭证文件的时候使用该命令,如果本地已经有了访问Registry的身份凭证文件,则还是使用“generic”子命令生成secret对象(在后面有例子)。
  3. tls:使用公钥/私钥证书对创建secret

查看OCP一般情况下Secret

1
oc get secret --all-namespaces

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210103094058470.png

【创建本次外部Ceph连接admin Secret】

查看部署节点1cephcluster目录下的ceph.client.admin.keyring文件

记录下key值。注意包括最后两个==

1
2
3
4
5
cat /etc/ceph/ceph.client.admin.keyring

# 返回
[client.admin]
        key = AQCHNfNfEyWiMxAAwt5EUyUCCMkByN+RSjeX1Q=

创建,使用generic-from-literal=key=参数

1
oc  create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCHNfNfEyWiMxAAwt5EUyUCCMkByN+RSjeX1Q==' --namespace=kube-system

【创建本次外部Ceph连接专用账户 Secret】

记录下key值。注意包括最后两个==ceph.client.ocp.keyring是在Ceph节点创建的OCP专用账户

1
2
3
cat ceph.client.ocp.keyring 
[client.ocp]
        key = AQAbh/Zfl8l2ORAAl3SS21C+WaNUDOdUTNRACA==

创建,使用generic-from-literal=key=参数

1
oc  create secret generic ceph-user-secret --type="kubernetes.io/rbd" --from-literal=key='AQAbh/Zfl8l2ORAAl3SS21C+WaNUDOdUTNRACA==' --namespace=kube-system

【验证】

1
2
3
oc get secret -n kube-system | grep ceph
ceph-secret                kubernetes.io/rbd             1      44h
ceph-user-secret           kubernetes.io/rbd             1      19s

返回两个已创建的Secret对象

———至此准备工作基本做好———-

8.7 创建StorageClass

这里注意修改以下几个参数:

1、monitors:mon节点,要包括端口

2、adminIduserId分别是admin和此前创建的名为ocp的ceph账户。

3、adminSecretNameuserSecretName分别是此前创建的针对admin和名为ocp的ceph账户的secret对象名

登录OCP,进入开始创建的工作目录

1
cd /root/ceph

编辑yaml文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat >ceph-rbd-storageclass.yaml<<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
  #annotations:
     #storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: ceph.com/rbd
parameters:
  monitors: 172.18.2.3:6789,172.18.2.4:6789,172.18.2.5:6789
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: kube
  userId: ocp
  userSecretName: ceph-user-secret
  userSecretNamespace: kube-system
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"
EOF

启动

1
oc create -f ceph-rbd-storageclass.yaml

验证

1
2
3
4
5
oc get storageclasses | grep ceph

# 返回
NAME         PROVISIONER    RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
ceph-rbd (default)   ceph.com/rbd   Delete          Immediate           false      7m42s

注:

1、Storageclasses不存在隶属于哪个namespace概念

2、重要概念是配置程序即范例中的provisioner: ceph.com/rbd

3、如果一个卷是动态配置的卷,则默认的回收策略为“删除”。这意味着,在默认的情况下,当PVC被删除时,基础的PV和对应的存储也会被删除。如果需要保留存储在卷上的数据,则必须在PV被设置之后将回收策略从delete更改为retain。

8.8 创建PVC

完成storageclasses创建后,我们直接通过pvc直接使用。

可通过yaml创建也可以在openshift的webconsole中选择对应的storageclass创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cat >ceph-rbd-pvc.yaml<<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
  storageClassName: ceph-rbd  
  resources:
    requests:
      storage: 500Mi
EOF

注意:

1、这里显示的声明了storageClassName: ceph-rbd,如果不声明,pvc将绑定storageClass中annotations/storageclass.beta.kubernetes.io/is-default-class: "true"的类。

创建

1
oc create -f ceph-rbd-pvc.yaml -n kube-system

验证

1
2
3
4
5
oc get pvc -n kube-system

# 返回
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ceph-rbd-pvc   Bound    pvc-92631bb9-e3ca-4bb6-b940-2dfdcb2f96fb   8Gi        RWO            ceph-rbd       9m13s

重要:其实这时候storageClass将会自动创建出了一个pv进行绑定。

这个自动化也就是动态pv的本质了。

1
2
3
4
5
6
oc get pv | grep ceph

# 返回
NAME   CAPACITY ACCESS MODES  RECLAIM POLICY STATUS  CLAIM    STORAGECLASS   REASON   AGE

pvc-4481f336-bc8b-4169-b8b8-40ddc97763b2   8Gi    RWO Delete  Bound kube-system/ceph-rbd-pvc ceph-rbd    21s

在前述回收策略为“删除”前提下,如果删除pvc,对应pv自动删除

注意存储的回收策略和状态,这个不在本文进行描述。

8.9 创建pod应用

前戏全部完成,接下来实际部署对接外部Ceph。

编辑yaml文件

注意:image: 'registry.cj.io:5000/centos:latest可以改成image: 'centos:latest'

我这里是用了我公司企业内部镜像仓库。年后我会做quay+ceph的高可用教程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cat >centos-rbd.yaml<<EOF
apiVersion: apps/v1s
#kind: StatefulSet
kind: Deployment
metadata:
  name: centos7-with-cephrbd
spec:
  #serviceName: mysqlmgr-svc
  replicas: 1
  selector:
    matchLabels:
      app: centos7-with-cephrbd
  template:
    metadata:
      labels:
        app: centos7-with-cephrbd
    spec:
      #serviceAccount: ethan
      #serviceAccountName: ethan
      volumes:
      - name: cephrbdstorage
        persistentVolumeClaim:
          claimName: ceph-rbd-pvc
      containers:
        - name: centos7-with-cephrbd
          volumeMounts:
          - name: cephrbdstorage
            mountPath: "/data"
          image: 'centos:latest'
          command:
          - /usr/sbin/init
EOF

启动pod

1
oc create -f centos-rbd.yaml

验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
oc get pod | grep centos
centos7-with-cephrbd-868cdfb67d-s7df6      1/1       Running   0          51m

# 登录到pod内
oc exec -it centos7-with-cephrbd-868cdfb67d-s7df6 bash

# 查看磁盘状态
[root@centos7-with-cephrbd-868cdfb67d-s7df6 /]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   120G  0 disk 
|-sda1   8:1    0     1G  0 part 
`-sda2   8:2    0 118.9G  0 part 
sr0     11:0    1  1024M  0 rom  
rbd0   252:0    0   500M  0 disk /data

8.10 启动流程分析

登录该pod所在worl节点master2节点,可以看出前述“两阶段”机制中,ceph已经自动attach并mount到pod对应volume上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
lsblk

# 返回
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0   120G  0 disk 
├─sda1          8:1    0     1G  0 part /boot
└─sda2          8:2    0 118.9G  0 part 
  ├─rhel-root 253:0    0   111G  0 lvm  /
  └─rhel-swap 253:1    0   7.9G  0 lvm  
sr0            11:0    1  1024M  0 rom  
rbd0          252:0    0   500M  0 disk /var/lib/origin/openshift.local.volumes/pods/b0ba29e8-516f-11eb-86e5-005056b10366/volumes/kubernetes.io~rbd/pvc-7989b559-516d-11eb-851a-005056b10c86

继续验证

1
2
3
cat >test.txt<<EOF
你好,长江
EOF

验证

1
2
tail test.txt 
你好,长江

我们删除pod,重启这个测试pod。看看

1
2
oc delete -f centos-rbd.yaml
oc create -f centos-rbd.yaml

继续登录至pod内,数据仍保持

因为回收策略是,除非pvc删除,ceph存储这个数据将丢失。

我们也可以通过查看pod的启动流程,查看启动流程

1
2
3
4
5
6
AttachVolume.Attach succeeded for volume "pvc-7989b559-516d-11eb-851a-005056b10c86"
Successful assigned kube-system/centos7-with-cephrbd-868cdfb67d-s7df6 to master2.cp4d.cj.com
pulling image "centos:latest"
Successfully pulled image "centos:latest"
Created container
Started container

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210108133058889.png

8.11 OCP4的特例

以上是OCP3.11 版本的情况

—–但是!凡事都有例外。—–

OpenShift 4 使用Red Hat Enterprise Linux CoreOS(简称RHCOS)作为容器化的底层操作系统

相比OCP3的RHEL,RHCOS对运行容器和 Kubernetes 进行了剪裁和针对性的优化的操作系统。

RHCOS 是无法独立运行安装的,必须在Openshift安装过程中进行安装。

所以问题就来了。作为物理节点上,RHCOS是没有安装rbd map的。

我们按照前述各项步骤在OCP4上进行部署,查看pod的event。

这时候报错

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1
From default-scheduler
Successfully assigned kube-system/centos7-with-cephrbd-7fc79bffd7-b6tv9 to worker1.openshift4.cj.io

# 2
From attachdetach-controller
AttachVolume.Attach succeeded for volume "pvc-cc3bfad2-45a7-4a21-91c4-40db65962e70"

# 3
From kubelet, worker1.openshift4.cj.io
MountVolume.WaitForAttach failed for volume "pvc-cc3bfad2-45a7-4a21-91c4-40db65962e70" : fail to check rbd image status with: (executable file not found in $PATH), rbd output: ()

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210107153654761.png

肿么办?我也不是高手,而且尝试在RHCOS安装rbd或者ceph-common均以失败告终。感觉这也是RHCOS的“不可变架构(Immutable Infrastructure)” 理念。

9.OpenshiftV4下利用Ceph-CSI方式连接外部Ceph

参考:https://github.com/ceph/ceph-csi

Overview

Ceph CSI plugins implement an interface between CSI enabled Container Orchestrator (CO) and Ceph cluster. It allows dynamically provisioning Ceph volumes and attaching them to workloads.

Independent CSI plugins are provided to support RBD and CephFS backed volumes,

  • For details about configuration and deployment of RBD plugin, please refer rbd doc and for CephFS plugin configuration and deployment please refer cephfs doc.
  • For example usage of RBD and CephFS CSI plugins, see examples in examples/.
  • Stale resource cleanup, please refer cleanup doc.

NOTE:

  • Ceph CSI Arm64 support is experimental.

从下图可以看出,如果要部署在生产环境,Ceph集群版本至少要nautilus版本,K8S的版本至少要1.14。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210110113314301.png

可惜的是,截止至文章编辑2020.01.15CephFS目前还没有GA。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210110113424732.png

9.1 注意事项

安装和正确使用Ceph CIS 驱动务必注意以下几个事宜

1、Namespace:涉及rbac类,包括csi-nodeplugin-rbac.yamlcsi-provisioner-rbac.yamlCSI sidecar containersCSI Ceph driver,以及secret文件。

2、对于RBD CIS 插件,额外需要注释掉其中有关kms configmap内容。

3、注意创造统一的configmap,包括ceph集群的fsid和通讯地址,注意是v1版本的通讯地址,所以是6789端口。

4、注意在Ceph创建CSI插件访问的账户(例如《8.5 》章节创造ocp账户),当然也可以直接利用ceph的admin账户。

5、根据pod出错event,如果是权限问题,请仔细核对《9.5 安装Secret》中的用户名和密码,确保账户拥有正确权限,特别通过ceph auth get client.ocp(client.ocp请注意根据实际替换正确用户名),检查其中pool字段。

9.2 安装Ceph CSI drivers

安装Ceph CSI drivers,这是来自社区的驱动。红帽官方不会做这个,只卖它的Redhat Ceph Storage。

【非常关键一点,这里需要采用最新的v3.2.0分支】

1
git clone --branch v3.2.0 https://github.com/ceph/ceph-csi.git

我们可以看到,其中两个目录分别对应CephFSRBD

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
tree
.
├── cephcsi
│   └── image
│       └── Dockerfile
├── cephfs
│   └── kubernetes
│       ├── csi-cephfsplugin-provisioner.yaml
│       ├── csi-cephfsplugin.yaml
│       ├── csi-config-map.yaml
│       ├── csi-nodeplugin-psp.yaml
│       ├── csi-nodeplugin-rbac.yaml
│       ├── csi-provisioner-psp.yaml
│       └── csi-provisioner-rbac.yaml
└── rbd
    └── kubernetes
        ├── csi-config-map.yaml
        ├── csi-nodeplugin-psp.yaml
        ├── csi-nodeplugin-rbac.yaml
        ├── csi-provisioner-psp.yaml
        ├── csi-provisioner-rbac.yaml
        ├── csi-rbdplugin-provisioner.yaml
        └── csi-rbdplugin.yaml

这里跟rook一样,非常重要,就是命名空间问题。

创建common这个namespace。当然common我之前已经用过。

1
2
oc create namespace common
oc project common

使用sed快速替换命名空间CephFSRBD两个目录下的csi-nodeplugin-rbac.yamlcsi-provisioner-rbac.yaml文件。

1
2
sed -i "s/namespace:.*/namespace: common/g" csi-nodeplugin-rbac.yaml
sed -i "s/namespace:.*/namespace: common/g" csi-provisioner-rbac.yaml

关键点是创建必须的 ServiceAccount RBAC资源对象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
oc create -f csi-provisioner-rbac.yaml

# 返回
serviceaccount/cephfs-csi-provisioner created
clusterrole.rbac.authorization.k8s.io/cephfs-external-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role created
role.rbac.authorization.k8s.io/cephfs-external-provisioner-cfg created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role-cfg created


oc create -f csi-nodeplugin-rbac.yaml

# 返回
serviceaccount/cephfs-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created

再次进入rbd目录

1
cd /root/ceph-csi/ceph-csi/deploy/rbd/kubernetes

无论是创建CephFSRBD,都会创建响应的serviceaccount

如果我们还想尝试使用CephFS,先在CephFS目录下创建后,再到RBD目录下创建,会提示 RBAC资源对象已存在,这个报错正常。

【注意】

可以看见这里有四个账户被创建

  • serviceaccount/cephfs-csi-provisioner
  • serviceaccount/cephfs-csi-nodeplugin
  • serviceaccount/rbd-csi-provisioner
  • serviceaccount/rbd-csi-nodeplugin

注意,由于Openshift安全的特性,后续需要专门对上述四个账户进行特权设置。

9.3 创建configmap

通过configmap将Ceph集群信息和通讯地址传入OCP。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
cat <<EOF > csi-config-map.yaml
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "d7b6c88e-5217-11eb-8f8f-005056b11868",
        "monitors": [
          "172.18.2.3:6789",
          "172.18.2.4:6789",
          "172.18.2.5:6789"
        ]
      }
    ]    
metadata:
  name: ceph-csi-config
EOF

部署

1
oc create -f csi-config-map.yaml

验证

1
2
3
oc get configmap
NAME               DATA   AGE
ceph-csi-config    1      6h57m

注意:这个configmap只需要创建一个即可。只要确保后续CSI插件与configmap的namespace相同,建CephFSRBDCSI插件均可以正常访问。

9.4 部署CSI sidecar containers & CSI Ceph driver

关键步骤来了,K8S的CSI插件方式工作原理,需要部署sidecar容器。

这里我们先针对CephFS进行相关安装问题的说明。

1
2
oc create -f csi-cephfsplugin-provisioner.yaml
oc create -f csi-cephfsplugin.yaml

这里会出现问题,Pod无法拉起。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210110094506753.png

因为Openshift的SCC权限设置问题,导致Deployment无法执行。

需要做特权处理,这里我们直接简化处理,直接赋予特权。这里就是前述《9.1 》章节最后的问题说明。

1
2
oc adm policy add-scc-to-user privileged -z rbd-csi-provisioner
oc adm policy add-scc-to-user privileged -z rbd-csi-nodeplugin

如果需要,类似的针对两个CephFS账户也需要处理。

1
2
oc adm policy add-scc-to-user privileged -z cephfs-csi-provisioner
oc adm policy add-scc-to-user privileged -z cephfs-csi-nodeplugin

注:上述操作只是因为OCP的权限设置颗粒度更细,k8s不存在上述问题。

创建 PodSecurityPolicy:

1
2
kubectl create -f csi-provisioner-psp.yaml
kubectl create -f csi-nodeplugin-psp.yaml

—–这里是一个分界线,当初用安装CSI时候并没有使用--branch v3.2.0参数——–

导致实际使用的镜像文件是访问k8s.gcr.io、而这个在无法科学上网前提是无法访问的。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210110102125831.png

为了解决拉取镜像问题

我们尝试去docker hub查找,发现csi-node-driver-registrar有,但是其他镜像或者没有或者版本较低。

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210110101132051.png

尝试另外办法,用阿里云的镜像进行替换。

k8s.gcr.io/sig-storage替换registry.aliyuncs.com/it00021hot

1
2
3
4
5
6
7
oc create -f csi-cephfsplugin-provisioner.yaml -f csi-cephfsplugin.yaml

# 返回
service/csi-cephfsplugin-provisioner created
deployment.apps/csi-cephfsplugin-provisioner created
daemonset.apps/csi-cephfsplugin created
service/csi-metrics-cephfsplugin created 

验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
oc get pod

# 返回
NAME                                            READY   STATUS    RESTARTS   AGE
csi-cephfsplugin-8sxsw                          3/3     Running   0          43s
csi-cephfsplugin-cnkj9                          3/3     Running   0          43s
csi-cephfsplugin-provisioner-7fd59b7b84-jmvwc   6/6     Running   0          43s
csi-cephfsplugin-provisioner-7fd59b7b84-sh2zl   6/6     Running   0          43s
csi-cephfsplugin-provisioner-7fd59b7b84-vsvgs   6/6     Running   0          43s
csi-cephfsplugin-ztwsl                          3/3     Running   0          43s

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210110105443348.png

按照上述方法,我们继续针对csi-rbdplugin-provisioner.yamlcsi-rbdplugin.yaml,将其中的k8s.gcr.io/sig-storage替换registry.aliyuncs.com/it00021hot

最后实践证明,使用不确定的其他镜像,分分秒秒翻车。

——-这里是一个分界线,当初用安装CSI时候并没有使用--branch v3.2.0参数———

言归正传~

权限处理完毕后,继续进行下一步。将上述两个文件中有关kms configmap给注释。

正式创建

1
2
3
4
5
6
7
oc create -f csi-rbdplugin-provisioner.yaml -f csi-rbdplugin.yaml

# 返回
service/csi-rbdplugin-provisioner created
deployment.apps/csi-rbdplugin-provisioner created
daemonset.apps/csi-rbdplugin created
service/csi-metrics-rbdplugin created

验证【cephfs相关6个,rbd 相关6个】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
oc get pod


# 返回
NAME                                            READY   STATUS    RESTARTS   AGE
csi-cephfsplugin-8sxsw                          3/3     Running   0          6h2m
csi-cephfsplugin-cnkj9                          3/3     Running   0          6h2m
csi-cephfsplugin-provisioner-7fd59b7b84-jmvwc   6/6     Running   0          6h2m
csi-cephfsplugin-provisioner-7fd59b7b84-sh2zl   6/6     Running   0          6h2m
csi-cephfsplugin-provisioner-7fd59b7b84-vsvgs   6/6     Running   0          6h2m
csi-cephfsplugin-ztwsl                          3/3     Running   0          6h2m
csi-rbdplugin-85b58                             3/3     Running   0          36s
csi-rbdplugin-gm2bn                             3/3     Running   0          36s
csi-rbdplugin-provisioner-bbb9cb858-7txxr       7/7     Running   0          36s
csi-rbdplugin-provisioner-bbb9cb858-nfdv7       7/7     Running   0          36s
csi-rbdplugin-provisioner-bbb9cb858-tqcn5       7/7     Running   0          36s
csi-rbdplugin-vvmrh                             3/3     Running   0          36s

9.5 安装Secret

编辑yalm文件

注意事项:

1、这里的namespace需要和storageclass的namespace保持一致。

2、这里的adminKey与此前《8.5 Ceph上准备OCP客户端账号》获取方法一致。这里我们统一的名称,为csi-ceph-secret

3、这里的用户名和密码字段为userIDuserKey,之前通过pod出错event排错了很久。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cat >ceph-csi-secret.yaml<<EOF
apiVersion: v1
kind: Secret
metadata:
  name: csi-ceph-secret
  namespace: common
stringData:
  # Key values correspond to a user name and its key, as defined in the
  # ceph cluster. User ID should have required access to the 'pool'
  # specified in the storage class
  userID: admin
  userKey: AQBjA/lfuJpHDRAAWe8QEa+mCnuc/yZeMKKrMA==
type: kubernetes.io/rbd
EOF

启动

1
oc create -f ceph-csi-secret.yaml

验证

1
2
3
4
oc get secret | grep csi-ceph-secret

# 返回
csi-ceph-secret           Opaque              2      12s

9.6 创建storageclass

前述环境准备完毕后。

我们这里在Ceph集群节点1上创建资源池。详见《7.1 创建pool》

1
2
3
4
5
6
7
8
9
cephadm shell

ceph osd pool create ocp4-pool1 64 64
pool 'ocp4-pool1' created

# 验证
ceph osd lspools
1 device_health_metrics
2 ocp4-pool1

只要资源池创建完毕,img文件不需要创建。

至此,用于OCP4连接的资源池名为ocp4-pool1

【RBD ClassStorageClass】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat >cephrbd-storageclass.yaml<<EOF 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: d7b6c88e-5217-11eb-8f8f-005056b11868
   pool: ocp4-pool1
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: csi-ceph-secret
   csi.storage.k8s.io/provisioner-secret-namespace: common
   csi.storage.k8s.io/controller-expand-secret-name: csi-ceph-secret
   csi.storage.k8s.io/controller-expand-secret-namespace: common
   csi.storage.k8s.io/node-stage-secret-name: csi-ceph-secret
   csi.storage.k8s.io/node-stage-secret-namespace: common
   csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
 - discard
EOF

创建storageclass

1
oc create -f cephrbd-storageclass.yaml

注意事项:

1、这里的pool字段指定的资源池必须事先在ceph集群中创建,否则报错(我特意写成ocp4-pool2)

1
failed to provision volume with StorageClass "csi-rbd-sc": rpc error: code = Internal desc = pool not found: pool (ocp4-pool2) not found in Ceph cluster

9.7 创建pvc

完成storageclasses创建后,我们直接通过pvc直接使用。

可通过yaml创建也可以在openshift的webconsole中选择对应的storageclass创建

注意事项:

1、storageClassName: csi-rbd-sc

2、rbd类型支持ReadWriteOnceReadOnlyMany。不支持ReadWriteMany

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat >ceph-rbd-pvc.yaml<<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: csi-rbd-sc  
  resources:
    requests:
      storage: 500Mi
EOF

创建pvc

1
oc create -f ceph-rbd-pvc.yaml -n common

验证

1
2
3
4
5
oc get pvc -n common

# 返回
NAME           STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ceph-rbd-pvc Bound pvc-1c22daf3-d6b2-44c2-9ea5-e38ee6d8adf2 500Mi RWO  csi-rbd-sc    5m12s

重要:其实这时候storageClass将会自动创建出了一个pv进行绑定。

【重要验证】

我们登陆ceph节点,可以看出自动创建出了一个img文件。

1
2
3
4
5
cephadm shell

[ceph: root@cephnode1 /]# rbd -p ocp4-pool1 ls
# 返回
csi-vol-e65858be-566e-11eb-b7fe-0a580a8301d7

但是注意,此时这个镜像文件是不会attach到任何远程节点上的

1
2
rbd status ocp4-pool1/csi-vol-e65858be-566e-11eb-b7fe-0a580a8301d7
Watchers: none

我们登陆dashboard查看

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210114215642510.png

接下来我们直接删除该pvc

1
2
oc delete -f ceph-rbd-pvc.yaml -n common
persistentvolumeclaim "ceph-rbd-pvc" deleted

再次登录ceph节点,按照回收策略对应的,img文件已删除,

1
2
3
4
cephadm shell

[ceph: root@cephnode1 /]# rbd -p ocp4-pool1 ls
# 返回空

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210114215825471.png

9.8 创建pod应用

前戏全部完成,接下来实际部署对接外部Ceph。

编辑yaml文件。

注意:这里有一个坑,就是volumes/persistentVolumeClaim/readOnly必须设置为false

否则这个pod在删除过程中,会遇到无法删除,一直显示terminating

如果之前没有设置正确,可以参考《9.11 记一次POD删除的故障处理过程》的处理过程。

注意这里的副本数是1。原因是rbd的accessModes的限制。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cat >centos-rbd.yaml<<EOF
apiVersion: apps/v1
#kind: StatefulSet
kind: Deployment
metadata:
  name: centos7-with-cephrbd
spec:
  #serviceName: mysqlmgr-svc
  replicas: 1
  selector:
    matchLabels:
      app: centos7-with-cephrbd
  template:
    metadata:
      labels:
        app: centos7-with-cephrbd
    spec:
      serviceAccount: ethan
      serviceAccountName: ethan
      volumes:
      - name: cephrbdstorage
        persistentVolumeClaim:
          claimName: ceph-rbd-pvc
          readOnly: false
      containers:
        - name: centos7-with-cephrbd
          volumeMounts:
          - name: cephrbdstorage
            mountPath: "/data"
          image: 'centos:latest'
          command:
          - /usr/sbin/init
EOF

启动pod

1
oc create -f centos-rbd.yaml

如果是挂载一块裸盘。yaml文件的写法进行稍微调整。

1
2
3
volumeDevices:
        - name: data
          devicePath: /dev/xvda

9.9 分析创建过程

我们开始分析创建过程中,ceph的rbd是如何被挂载到pod内。

到底如何两阶段处理。

pvc创建后,CSI插件的StorageClass会自动在Ceph集群创建一个img文件,但是并没有被远程挂载。

1
2
rbd status ocp4-pool1/csi-vol-83d022b6-5707-11eb-9ea7-0a580a8103ef
Watchers: none

但是继续当应用这个pvc的pod启动后,你会发现rbd会开始根据两阶段,先attach到远程节点,

先登录到ceph上。注意这里已经显示watcher的信息了。

1
2
3
rbd status ocp4-pool1/csi-vol-83d022b6-5707-11eb-9ea7-0a580a8103ef
Watchers:
        watcher=172.18.1.47:0/2293028593 client.25487 cookie=18446462598732840961

然后再被挂载。我们登陆了OCP4的work1(172.18.1.47)查看。已经有挂载点了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[core@worker1 ~]$ lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   250G  0 disk 
├─sda1                         8:1    0   384M  0 part /boot
├─sda2                         8:2    0   127M  0 part /boot/efi
├─sda3                         8:3    0     1M  0 part 
└─sda4                         8:4    0 249.5G  0 part 
  └─coreos-luks-root-nocrypt 253:0    0 249.5G  0 dm   /sysroot
sr0                           11:0    1  1024M  0 rom  
rbd0                         252:0    0   500M  0 disk /var/lib/kubelet/pods/9b8c19bd-becd-432c-a057-ab76752b125a/volumes/kubernetes.io~csi/pvc-44ffb17b-e73b-400e-945b-0be226ae8d7e/mount

如果删除pod,看看发生了什么

1
oc delete -f centos-rbd.yaml

我们登陆了OCP4的work1(172.18.1.47)查看。rbd已经被卸载了。

【这里当时就踩过一个坑,就是volumes/persistentVolumeClaim/readOnly必须设置为false。】

1
2
3
4
5
6
7
8
9
lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   250G  0 disk 
├─sda1                         8:1    0   384M  0 part /boot
├─sda2                         8:2    0   127M  0 part /boot/efi
├─sda3                         8:3    0     1M  0 part 
└─sda4                         8:4    0 249.5G  0 part 
  └─coreos-luks-root-nocrypt 253:0    0 249.5G  0 dm   /sysroot
sr0                           11:0    1  1024M  0 rom

其次登录ceph节点,这个镜像文件

1
2
rbd status ocp4-pool1/csi-vol-83d022b6-5707-11eb-9ea7-0a580a8103ef
Watchers: none

但是这个镜像文件仍被保留,除非删除pvc。

1
2
[ceph: root@cephnode1 /]# rbd -p ocp4-pool1 ls
csi-vol-83d022b6-5707-11eb-9ea7-0a580a8103ef

接下来我们对数据持久化做进一步测试。

9.10 数据持久化验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
oc get pod | grep centos
centos7-with-cephrbd-59cd75bfc5-pw2p4        1/1     Running   0          87s

# 登录到pod内
oc exec -it centos7-with-cephrbd-59cd75bfc5-pw2p4 bash

# 查看磁盘状态
[root@centos7-with-cephrbd-868cdfb67d-s7df6 /]# lsblk

# 返回
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   250G  0 disk 
|-sda1   8:1        384M  0 part 
|-sda2   8:2        127M  0 part 
|-sda3   8:3          1M  0 part 
`-sda4   8:4    0 249.5G  0 part 
sr0     11:0    1  1024M  0 rom  
rbd0   252:0    0   500M  0 disk /data

可以看出有一个500M的被映射到/data目录下。

【验证】

继续验证

1
2
3
4
5
cd /data

cat >test2.txt<<EOF
你好,长江
EOF

验证

1
2
tail test.txt 
你好,长江

我们删除pod,重启这个测试pod。看看

1
2
oc delete -f centos-rbd.yaml
oc create -f centos-rbd.yaml

继续登录至pod内,数据仍保持。

登录到Ceph集群查看

1
2
3
4
5
cephadm shell

[ceph: root@cephnode1 /]# rbd -p ocp4-pool1 ls
# 返回
csi-vol-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7

9.11 记一次POD删除的故障处理过程

注意:这里有一个坑,就是volumes/persistentVolumeClaim/readOnly必须设置为false

否则这个pod在删除过程中,会遇到无法删除,一直显示terminating

那之前没有合理设置这个设置,而造成pod无法正常删除,怎么办?

可以强制删除

1
oc delete pod centos7-with-cephrbd-59cd75bfc5-5txrv centos7-with-cephrbd-59cd75bfc5-2qnsw --force=true --grace-period=0

继续删除一直显示terminating显示的pvc和pv。

1
2
oc patch pvc ceph-rbd-pvc -p '{"metadata":{"finalizers":null}}'
oc patch pv pv-registry -p '{"metadata":{"finalizers":null}}'

问题又来了,ceph集群内的img文件无法删除。

1
2
3
4
5
6
7
8
9
cephadm shell

[ceph: root@cephnode1 /]#rbd -p ocp4-pool1 ls  
# 返回
csi-vol-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7
csi-vol-9f6537a3-5676-11eb-b7fe-0a580a8301d7
csi-vol-a2da2497-56d9-11eb-b7fe-0a580a8301d7
csi-vol-ed3ee3b0-5674-11eb-b7fe-0a580a8301d7
csi-vol-ee837091-5670-11eb-b7fe-0a580a8301d7

我们手动删除镜像文件发现无法删除

1
2
3
4
5
rbd rm ocp4-pool1/csi-vol-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7
2021-01-15T05:42:38.239+0000 7f9ece7fc700 -1 librbd::image::PreRemoveRequest: 0x562c7a560df0 check_image_watchers: image has watchers - not removing
Removing image: 0% complete...failed.
rbd: error: image still has watchers
This means the image is still open or the client using it crashed. Try again after closing/unmapping it or waiting 30s for the crashed client to timeout.

https://typorabyethancheung911.oss-cn-shanghai.aliyuncs.com/typora/image-20210115134408973.png

进一步查看

1
2
3
[ceph: root@cephnode1 /]# rbd status ocp4-pool1/csi-vol-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7
Watchers:
        watcher=172.18.1.47:0/594852419 client.14811 cookie=18446462598732840961

上述信息表明是挂载到我OCP4的Work1(172.18.1.47)节点

登录到worker1节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ssh -i /data/boot-files/ignition/openshift4/ssh-key/id_rsa core@worker1.openshift4.cj.io

# 返回
Red Hat Enterprise Linux CoreOS 45.82.202009261329-0
  Part of OpenShift 4.5, RHCOS is a Kubernetes native operating system
  managed by the Machine Config Operator (`clusteroperator/machine-config`).

WARNING: Direct SSH access to machines is not recommended; instead,
make configuration changes via `machineconfig` objects:
  https://docs.openshift.com/container-platform/4.5/architecture/architecture-rhcos.html

---
Last login: Thu Jan  7 08:32:26 2021 from 172.18.1.1

# 查看挂载点
[core@worker1 ~]$ lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   250G  0 disk 
├─sda1                         8:1    0   384M  0 part /boot
├─sda2                         8:2    0   127M  0 part /boot/efi
├─sda3                         8:3    0     1M  0 part 
└─sda4                         8:4    0 249.5G  0 part 
  └─coreos-luks-root-nocrypt 253:0    0 249.5G  0 dm   /sysroot
sr0                           11:0    1  1024M  0 rom  

# 可以看到这里有四块盘
# rbd0
rbd0                         252:0    0   500M  0 disk /var/lib/kubelet/pods/1b9a4080-d315-41c2-bc0f-fd73a6bd85d5/volumes/kubernetes.io~csi/pvc-36cd10f8-c5e8-410c-8c2e-9fa3a137f624/mount

# rbd1
rbd1                         252:16   0   500M  0 disk /var/lib/kubelet/pods/981f6528-3a37-4616-b3d0-0bed504fc7f7/volumes/kubernetes.io~csi/pvc-009700cd-db3e-429c-bcc6-73f5d09dcfc3/mount

# rbd2
rbd2                         252:32   0   500M  0 disk /var/lib/kubelet/pods/d95eaeab-22d3-40e0-880a-3c950af3d908/volumes/kubernetes.io~csi/pvc-db315115-e776-4156-a5c1-54e3d5fbe950/mount

# rbd3
rbd3                         252:48   0   500M  0 disk /var/lib/kubelet/pods/9c032237-a2ed-48d6-b98b-1060032a35f8/volumes/kubernetes.io~csi/pvc-f0bd8521-543e-4bb8-bfcc-e02f58924a70/mount

我们尝试手动卸载,首先变更为root用户。

1
2
[core@worker1 ~]$ sudo su
[root@worker1 core]# umount /var/lib/kubelet/pods/1b9a4080-d315-41c2-bc0f-fd73a6bd85d5/volumes/kubernetes.io~csi/pvc-36cd10f8-c5e8-410c-8c2e-9fa3a137f624/mount

进一步查看

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
lsblk
NAME                   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                      8:0    0   250G  0 disk 
├─sda1                   8:1    0   384M  0 part /boot
├─sda2                   8:2    0   127M  0 part /boot/efi
├─sda3                   8:3    0     1M  0 part 
└─sda4                   8:4    0 249.5G  0 part 
  └─coreos-luks-root-nocrypt
                       253:0    0 249.5G  0 dm   /sysroot
sr0                     11:0    1  1024M  0 rom  

# rbd0
rbd0                   252:0    0   500M  0 disk /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-36cd10f8-c5e8-410c-8c2e-9fa3a137f624/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7

# rbd1
rbd1                   252:16   0   500M  0 disk /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-009700cd-db3e-429c-bcc6-73f5d09dcfc3/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-ee837091-5670-11eb-b7fe-0a580a8301d7

# rbd2
rbd2                   252:32   0   500M  0 disk /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-db315115-e776-4156-a5c1-54e3d5fbe950/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-ed3ee3b0-5674-11eb-b7fe-0a580a8301d7

# rbd3 
rbd3                   252:48   0   500M  0 disk /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-f0bd8521-543e-4bb8-bfcc-e02f58924a70/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-9f6537a3-5676-11eb-b7fe-0a580a8301d7

这里你就可以发现,这里的挂载地址就显出了真身

在Ceph集群中通过rbd -p ocp4-pool1 ls显示的四个无法删除的镜像。

最后一段数字,两者是互相对应的。

我们再次手动umount。

1
2
3
4
5
6
7
umount /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-009700cd-db3e-429c-bcc6-73f5d09dcfc3/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-ee837091-5670-11eb-b7fe-0a580a8301d

umount /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-db315115-e776-4156-a5c1-54e3d5fbe950/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-ed3ee3b0-5674-11eb-b7fe-0a580a8301d7

umount /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-f0bd8521-543e-4bb8-bfcc-e02f58924a70/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-9f6537a3-5676-11eb-b7fe-0a580a8301d7

umount /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-009700cd-db3e-429c-bcc6-73f5d09dcfc3/globalmount/0001-0024-d7b6c88e-5217-11eb-8f8f-005056b11868-0000000000000002-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7

再次验证。已经卸载完毕。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   250G  0 disk 
├─sda1                         8:1    0   384M  0 part /boot
├─sda2                         8:2    0   127M  0 part /boot/efi
├─sda3                         8:3    0     1M  0 part 
└─sda4                         8:4    0 249.5G  0 part 
  └─coreos-luks-root-nocrypt 253:0    0 249.5G  0 dm   /sysroot
sr0                           11:0    1  1024M  0 rom  
rbd0                         252:0    0   500M  0 disk 
rbd1                         252:16   0   500M  0 disk 
rbd2                         252:32   0   500M  0 disk 
rbd3                         252:48   0   500M  0 disk

实际上这正是PV两阶段的第二阶段。前述相当于第一阶段的反向操作。

接下来我们要反向操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[ceph: root@cephnode1 /]#ceph osd blacklist add 172.18.1.47:0/594852419

[ceph: root@cephnode1 /]#rbd rm ocp4-pool1/csi-vol-8ac5c0d1-54a2-11eb-b7fe-0a580a8301d7
Removing image: 100% complete...done

[ceph: root@cephnode1 /]# ceph osd blacklist ls
listed 2 entries
172.18.1.47:0/2421086117 2021-01-15T08:03:05.464031+0000
172.18.1.47:0/594852419 2021-01-15T07:41:33.065625+0000
[ceph: root@cephnode1 /]# ceph osd blacklist rm 172.18.1.47:0/2421086117
un-blacklisting 172.18.1.47:0/2421086117
[ceph: root@cephnode1 /]# ceph osd blacklist rm 172.18.1.47:0/594852419
un-blacklisting 172.18.1.47:0/594852419

以上是关于Ceph集群的部署基本教程,Ceph的运维需要大量实战经验。

相较云原生存储而言,外部存储的恢复速度和性能要相差一点。

此文可能是2021年春节前的最后一更了,提前祝各位网友新春快乐,阖家幸福。

By Ethan 2020.1.15