当我们需要把整个Ceph集群的网络地址修改为另一个子网地址(与ceph.conf的public addr等不相同)时,就需要更改Ceph Monitor,Ceph OSD,Ceph Manager的监听地址。其中,OSD和Manager的地址是根据ceph.conf文件中的配置项public addr与cluster addr等确定的,因此只需修改文件内容即可。而Ceph Monitor的地址则是由monmap维护的,直接修改monmap会产生不可预料的问题。本文将会给出如何在不直接修改monmap的情况下修改Mon的IP地址。
样例集群
原Ceph集群部署在10.1.1.0/24子网上,现在需要部署到192.168.1.0/24子网上,且机器已经配置了192.168.1.0/24中的地址。
用户相关设置,ceph的进程将由ceph用户执行,该用户为部署ceph时自动创建的用户。而执行命令的用户为某一拥有sudo权限的普通用户。这个很重要,官方文档没有说明用户权限的重要性,导致根据Adding/Removing Monitors一文的Add Monitor操作,将会引起权限的错误。以下所有的命令均使用普通用户执行。
配置网卡IP
由于机器的地址已经发生改变,Ceph集群的monitors之间必然无法达成quorum。首先我们需要让其达成quorum,才好进行手动添加和删除monitor的操作。
因此,我们需要把原本的地址配置一下。配置的方法,遵循给网卡添加IP地址的方法。假设旧地址为10.1.1.1
,新地址为192.168.1.1
。若使用ip命令
,则为
$ ip addr add 10.1.1.1/24 dev <网卡设备名称>
使用nmcli的话,则为
# 方括号内容可以省略以缩短命令长度
$ nmcli c[onnection] m[odify] <设备名或网络配置名> ipv4.addr[ess] "10.1.1.1/24, 192.168.1.1/24"
所有机器配置好后,应该能够达成quorum,若不行,则使用systemctl重启mon应该能解决。
添加新的Monitor
修改IP地址的时候官方推荐添加新的IP的Monitor,而不是改原有的。假设新的monitor称为amaster
,原有monitor称为master
。在此提醒,新的monitor名称不能与原有的重复。
首先创建新的monitor默认使用的文件夹。由于/var/lib/ceph
文件夹为ceph用户所有,我们需要使用sudo。一般sudo仅能使用root用户,若能以ceph用户执行命令,则省去修改拥有者的麻烦。
$ sudo mkdir /var/lib/ceph/mon/ceph-amaster
此时应有
$ ls -l /var/lib/ceph/mon/
drwxr-x--- 15 ceph ceph 4.0K 11月 17 09:56 ceph-master
drwxr-x--- 15 root root 4.0K 1月 10 09:56 ceph-amaster
如果配置了cephx认证,则需要获取一下新的keyring。
ceph auth get mon.amaster -o <keyring文件名>
获取monmap
ceph mon getmap -o <monmap文件名>
准备一下默认文件夹的内容
ceph-mon -i amaster --mkfs --monmap <monmap文件> [--keyring <keyring文件>]
接下来这几步与官网的不同。先是修改monitor文件夹的拥有者,改回ceph,因为创建时为root,而monitor运行时的用户为ceph,无法访问这个文件夹。
chown -R ceph:ceph /var/lib/ceph/mon/ceph-amaster
修改配置文件,让新的monitor使用新的地址进行绑定。如果图方便,就修改global的,如下
[global]
...
public addr = 192.168.1.0/24
或者保险一点,仅修改新的mon的,如下
[mon.amaster]
...
public addr = 192.168.1.0/24
然后使用systemctl功能启动ceph-monitor
systemctl start ceph-mon@amaster.service
可以设置一下enable,开机启动cephmon
systemctl enable ceph-mopn@amaster.service
按照官网的教程会有Permission Denied的问题。
删除旧monitor
官网的教程在这里再一次有问题,不能按照其命令的顺序来,否则可能共识出错。
首先remove掉旧的monitor。
ceph mon remove master
然后,再停止进程,删除symlink
systemctl stop ceph-mon@master.service
systemctl disable ceph-mon@master.service
至此,单个Monitor的IP就修改完了。