移动云计算Ceph部署ceph-mon¶
监控引导(monitor bootstrapping)¶
引导启动一个监控器(理论上就是Ceph存储集群)需要一系列要求:
唯一标识符(Unique Identifier):对于每个集群
fsid
是唯一标识符,这个命名有些类似filesystem id
,这是因为早期Ceph存储集群主要用于Ceph文件系统。Ceph现在支持原生接口,块设备以及对象存储网关接口等等,所以fsid
现在显得有些取名不当(misnomer)。集群名称(Cluster Name):Ceph集群有一个集群名字,命名集群名时候需要使用没有空格的字符串。默认Ceph集群名是
ceph
,显然,对于不同用途的多个Ceph集群,起一个明确易懂的集群名非常重要。例如在 multisite configuration 配置模式,可以通过集群名us-west
和us-east
来表示集群的地理位置,相应的指定Ceph集群配置可以使用集群名,例如ceph.conf
,us-west.conf
,us-east.conf
等等。命令行可以指定集群,例如ceph --cluster {cluster-name}
。监控名(Monitor Name):在集群中的每个监控实例都有一个唯一命名。根据经验,Ceph监控名通常是主机名(建议每个host主机只配置一个Ceph监控,并且不要混合部署Ceph OSD服务和Ceph Monitor)。通过
hostname -s
可以获得主机的简短主机名。监控映射(Monitor Map):启动引导初始化监控需要生成一个监控映射。这个监控映射需要
fsid
以及集群名字,以及至少一个主机名和它的IP地址。(注:这表示每个监控对应一个集群,即对应一个fsid
)监控密钥环(Monitor Keyring):监控进程相互之间通过一个安全密钥加密通讯。你必须生成一个用于监控安全的密钥环并在引导启动时提供给初始化监控。
管理员密钥环(Administrator Keyring):为了使用ceph命令行工具,需要具备一个
client.admin
用户,所以必须生成一个管理员用户和密钥环,并且必须将client.admin
用户添加到监控密钥环。
建议创建Ceph配置文件包含 fsid
以及 mon 的 initial
成员和 mom 的 host
设置。
警告
之前的实践中, Ceph 手工部署zdata集群(暂未成功) 步骤 添加Ceph OSDs (zdata) 没有解决自定义Ceph集群名的添加OSDs问题。
现在我重新部署Ceph再次探索自定义 Ceph 集群名,以便后续部署更多集群进行管理。
这次还是采用了默认 ceph
作为集群名
备注
Ceph默认部署集群名字就是 ceph
,需要注意,很多工具和配置文件都是以集群名字作为配置文件名,例如 /etc/ceph/adata.conf
表示 adata
集群,对应的集群访问证书是 /etc/ceph/adata.client.admin.keyring
。在官方文档中,很多使用 name
来指代集群名字。
本次部署还是回归 ceph
常规命名集群名
在每个服务器节点上准备环境变量:
CLUSTER=ceph
FSID=598dc69c-5b43-4a3b-91b8-f36fc403bcc5
HOST=$(hostname -s)
HOST_IP=$(hostname -i)
HOST_1=a-b-data-1
HOST_2=a-b-data-2
HOST_3=a-b-data-3
HOST_1_IP=192.168.8.204
HOST_2_IP=192.168.8.205
HOST_3_IP=192.168.8.206
HOST_NET=192.168.8.0/24
部署monitor¶
登陆到monitor节点,初始工作在
$HOST_1
(a-b-data-1
)节点,所以ssh a-b-data-1
由于我们已经安装了ceph软件,所以安装程序已经创建了
/etc/ceph
目录
备注
如果集群清理,例如 ceph-deploy purgedata {node-name}
或者 ceph-deploy purge {node-name}
则部署工具可能会移除 /etc/ceph
目录。
生成一个unique ID,用于fsid:
cat /proc/sys/kernel/random/uuid
输出:
598dc69c-5b43-4a3b-91b8-f36fc403bcc5
备注
上述 uuid
用于 fsid
,也就是前文环境变量 FSID
备注
也可以使用 uuidgen
工具来生成uuid,这个工具包含在 util-linux
软件包中( 参考 uuidgen - create a new UUID value )
创建Ceph配置文件 这里我部署 移动云架构 由于是采用默认集群名
ceph
,所以配置文件就是/etc/ceph.conf
- 配置文件的命名规则是{cluster_name}.conf
参考 Ceph 手工部署zdata集群(暂未成功) 中探索执行以下脚本生成初始
/etc/ceph/ceph.conf
配置文件:
cat << EOF | sudo tee /etc/ceph/${CLUSTER}.conf
[global]
fsid = ${FSID}
mon initial members = ${HOST_1}
mon host = ${HOST_1_IP}
public network = ${HOST_NET}
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
osd crush chooseleaf type = 1
EOF
解析:
配置 |
说明 |
---|---|
fsid = {UUID} |
设置Ceph的唯一ID |
mon initial members = {hostname}[,{hostname}] |
初始化monitor(s)主机名 |
mon host = {ip-address}[,{ip-address}] |
初始化monitor(s)的主机IP |
osd pool default size = {n} |
设置存储池中对象的副本数量 |
osd pool default min size = {n} |
设置降级状态下对象的副本数 |
创建集群的keyring和monitor密钥:
sudo ceph-authtool --create-keyring /tmp/${CLUSTER}.mon.keyring --gen-key -n mon. --cap mon 'allow *'
备注
注意这里创建的 keyring
名字是 {CLUSTER}.mon.keyring
提示:
creating /tmp/ceph.mon.keyring
生成管理员keyring,生成
client.admin
用户并添加用户到keyring:
sudo ceph-authtool --create-keyring /etc/ceph/${CLUSTER}.client.admin.keyring \
--gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' \
--cap mds 'allow *' --cap mgr 'allow *'
提示:
creating /etc/ceph/ceph.client.admin.keyring
警告
这里 /etc/ceph/${CLUSTER}.client.admin.keyring
是和集群名 ceph
对应的,所以如果创建其他集群管理,例如对 zdata
集群管理,则这个keyring名字必须是 /etc/ceph/zdata.client.admin.keyring
生成
bootstrap-osd
keyring(命名应该也是和集群名相关,是${CLUSTER}.keyring
),生成client.bootstrap-osd
用户并添加用户到keyring:
sudo mkdir /var/lib/ceph
sudo chown ceph:ceph /var/lib/ceph
sudo -u ceph mkdir -p /var/lib/ceph/bootstrap-osd
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/${CLUSTER}.keyring \
--gen-key -n client.bootstrap-osd \
--cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
提示:
creating /var/lib/ceph/bootstrap-osd/ceph.keyring
将生成的key添加到
${CLUSTER}.mon.keyring
(ceph.mon.keyring
),并且修改这个keyring的owner为ceph
:
sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/${CLUSTER}.client.admin.keyring
sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/${CLUSTER}.keyring
sudo chown ceph:ceph /tmp/ceph.mon.keyring
提示:
importing contents of /etc/ceph/ceph.client.admin.keyring into /tmp/ceph.mon.keyring
importing contents of /var/lib/ceph/bootstrap-osd/ceph.keyring into /tmp/ceph.mon.keyring
使用主机名、主机IP和FSID生成一个监控映射,保存为
/tmp/monmap
:
sudo -u ceph monmaptool --create --add ${HOST} ${HOST_IP} --fsid ${FSID} /tmp/monmap
提示信息:
monmaptool: monmap file /tmp/monmap
setting min_mon_release = octopus
monmaptool: set fsid to 598dc69c-5b43-4a3b-91b8-f36fc403bcc5
monmaptool: writing epoch 0 to /tmp/monmap (1 monitors)
创建一个监控主机到默认数据目录:
sudo -u ceph mkdir -p /var/lib/ceph/mon/${CLUSTER}-${HOST}
发布监控服务的monitor的map和keyring:
sudo -u ceph ceph-mon --cluster ${CLUSTER} --mkfs -i ${HOST} --monmap /tmp/monmap --keyring /tmp/${CLUSTER}.mon.keyring
如果使用自定义集群名,则非常重要
: 配置systemd
启动集群的环境变量,修订/etc/default/ceph
添加:
echo $CLUSTER | sudo tee /etc/default/ceph
警告
这个步骤非常重要,因为 ceph-mon@<hostname>
启动 ceph-mon
服务会读取 /etc/default/ceph
中环境变量,如果没有配置 CLUSTER
环境变量,就会尝试启动名字为 ceph
的集群。所以如果要配置一个非默认名字的集群,一定要配置 CLUSTER
环境变量,否则启动会失败。
不过,我这次尝试失败: 移动云计算Ceph部署ceph-mon(集群名adata,部署未成功,请忽略)
启动monitor(s)
通常发行版使用 systemctl
启动监控:
sudo systemctl start ceph-mon@${HOST}
sudo systemctl enable ceph-mon@${HOST}
验证monitor运行:
sudo ceph -s
如果正常,会看到如下输出:
cluster:
id: 598dc69c-5b43-4a3b-91b8-f36fc403bcc5
health: HEALTH_WARN
mon is allowing insecure global_id reclaim
1 monitors have not enabled msgr2
services:
mon: 1 daemons, quorum a-b-data-1 (age 30s)
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:
消除 HEALTH_WARN
¶
备注
参考 Ceph HEALTH_WARN with 'mons are allowing insecure global_id reclaim' after install/upgrade to RHCS 4.2z2 (or newer) (原因是新版本要求严格安全) 或者 ceph: Mons are allowing insecure global_id reclaim #7746
ms_bind_msgr2
选项已经激活但是monitor没有配置成绑定到集群的monmap v2
端口。激活这个功能将使用 msgr2
协议,对于一些连接不可用。
消除
HEALTH_WARN
执行以下命令:
sudo ceph config set mon auth_allow_insecure_global_id_reclaim false
sudo ceph mon enable-msgr2
最终完成后,执行:
sudo ceph -s
输出以下信息:
cluster:
id: 598dc69c-5b43-4a3b-91b8-f36fc403bcc5
health: HEALTH_OK
services:
mon: 1 daemons, quorum a-b-data-1 (age 14s)
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:
整合脚本快速完成¶
按照上述步骤一步步完成可以看到,整个步骤都在 $HOST_1
( a-b-data-1
)上完成,实际上可以整合成一个脚本快速完成:
#!/usr/bin/env bash
ceph_env() {
CLUSTER=ceph
# FSID=$(cat /proc/sys/kernel/random/uuid)
FSID=598dc69c-5b43-4a3b-91b8-f36fc403bcc5
HOST=$(hostname -s)
HOST_IP=$(hostname -i)
HOST_1=a-b-data-1
HOST_2=a-b-data-2
HOST_3=a-b-data-3
HOST_1_IP=192.168.8.204
HOST_2_IP=192.168.8.205
HOST_3_IP=192.168.8.206
HOST_NET=192.168.8.0/24
}
create_ceph_mon_bootstrap_config() {
cat << EOF | sudo tee /etc/ceph/${CLUSTER}.conf
[global]
fsid = ${FSID}
mon initial members = ${HOST_1}
mon host = ${HOST_1_IP}
public network = ${HOST_NET}
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
osd crush chooseleaf type = 1
EOF
}
create_ceph_mon_keyring() {
sudo ceph-authtool --create-keyring /tmp/${CLUSTER}.mon.keyring --gen-key -n mon. --cap mon 'allow *'
}
create_ceph_client_admin_keyring() {
sudo ceph-authtool --create-keyring /etc/ceph/${CLUSTER}.client.admin.keyring \
--gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' \
--cap mds 'allow *' --cap mgr 'allow *'
}
create_dir() {
local dir="$1"
if [ ! -d "$dir" ]; then
sudo mkdir -p $dir
sudo chown ceph:ceph $dir
fi
}
create_ceph_bootstrap_osd_keyring() {
create_dir /var/lib/ceph/bootstrap-osd
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/${CLUSTER}.keyring \
--gen-key -n client.bootstrap-osd \
--cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
}
add_key_to_mon_keyring() {
sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/${CLUSTER}.client.admin.keyring
sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/${CLUSTER}.keyring
sudo chown ceph:ceph /tmp/ceph.mon.keyring
}
create_monmap() {
sudo -u ceph monmaptool --create --add ${HOST} ${HOST_IP} --fsid ${FSID} /tmp/monmap
}
ceph_mon_mkfs() {
create_dir /var/lib/ceph/mon/${CLUSTER}-${HOST}
sudo -u ceph ceph-mon --cluster ${CLUSTER} --mkfs -i ${HOST} --monmap /tmp/monmap \
--keyring /tmp/${CLUSTER}.mon.keyring
}
default_ceph() {
echo $CLUSTER | sudo tee /etc/default/ceph
}
start_ceph() {
sudo systemctl start ceph-mon@${HOST}
sudo systemctl enable ceph-mon@${HOST}
}
disable_insecure_global_id_enable_msgr2() {
sudo ceph config set mon auth_allow_insecure_global_id_reclaim false
sudo ceph mon enable-msgr2
}
ceph_env
create_ceph_mon_bootstrap_config
create_ceph_mon_keyring
create_ceph_client_admin_keyring
create_ceph_bootstrap_osd_keyring
add_key_to_mon_keyring
create_monmap
ceph_mon_mkfs
default_ceph
start_ceph
disable_insecure_global_id_enable_msgr2