runsisi's

technical notes

IPv6 Ceph 集群手工搭建

2019-01-11 runsisi#ceph#ipv6

由于 Ceph 不支持双栈(即同时支持 IPv4 和 IPv6),因此本文介绍搭建 IPv6 Ceph 集群的步骤。

IPv6 基础

  1. IPv6 地址有 128 位,使用以冒号分隔的多组十六进制字符串表示,每组 16 位,总共 8 组,如:fec0:0000:0000:0001:0000:0000:0000:0002, 可以通过一套简写的规则[2]简写为:fec0::1:0:0:0:2 或 fec0:0:0:1::2;
  2. 与 IPv4 类似,IPv6 地址空间的划分也有固定的规则[3],比如 2000::/3 ~ 3fff::/3 是 Global Unicast 地址,ff00::/8 是 Multicast 地址,fe80::/10 ~ febf::/10 是 Link-Local Unicast 地址,fec0::/10 ~ feff::/10 是 Site-Local Unicast 地址;
  3. Site Local 地址和 Link Local 地址都是内网私有地址,其中 Site Local 地址类似于 IPv4 中的 192/172/10 网段的私有地址,可以在内网进行路由转发,而 Link Local 地址是 IPv6 特有的,只支持单个物理网络(即以太网的广播域)内的通信,因此使用该类型的报文无法通过路由转发;
  4. 类似于 IPv4,给服务器配置 IPv6 地址可以有静态和 DHCP 两种方式,除此之外,使能了 IPv6 的网口都会通过 SLAAC(Stateless Address Assignment)[4]得到一个 Link Local地址,此外 SLAAC 通过 NDP(Neighbor Discovery Protocol)[5]可以从路由器得到[6][7]一个 Global Unicast 地址,SLAAC 地址的低 64 位由链路层的 MAC 地址通过映射[8]得到,因此每个 SLAAC 地址都是全球唯一的;

CentOS 7.x 机器配置 IPv6 地址:

~# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
IPV6ADDR=fec0:0:0:1::1/64
IPV6ADDR_SECONDARIES="fec0:0:0:1::2/64 fec0:0:0:1::3/64"

[1] https://en.wikipedia.org/wiki/IPv6_address

[2] http://answers.google.com/answers/threadview/id/770645.html

[3] http://www.tcpipguide.com/free/t_IPv6AddressSpaceAllocation-2.htm

[4] https://tools.ietf.org/html/rfc4862

[5] https://tools.ietf.org/html/rfc4861

[6] https://chrisgrundemann.com/index.php/2012/introducing-ipv6-neighbor-discovery-slaac/

[7] http://holmahenkel.blogspot.com/2012/05/ipv6-autoconfiguration-with-slaac-and.html

[8] http://www.tcpipguide.com/free/t_IPv6InterfaceIdentifiersandPhysicalAddressMapping-2.htm

测试环境

测试环境由 3 个节点的 Linux 虚机组成,3 个节点组成一个 Ceph 集群,每个节点所使用的关键软件版本如下:

  • OS: CentOS 7.4
  • kernel: 3.10.0-693.el7.x86_64
  • Ceph: 12.2.2-8

Ceph 集群的配置如下:

  • 3 个 MON,3 个 MGR,3 x 4 = 12 个 bluestore OSD,2 副本;
  • OSD 基于单个 HDD,即没有独立的 WAL/DB 设备,block 设备独占使用基于整个 HDD 创建的 LV 设备;
  • 所有服务器地址 IPv6 地址全部静态配置,其中 public 网络为:fec0:0:0:1::/64,cluster 网络为:fec0:0:0:2::/64;

注意事项:

  1. 使用 ceph-volume 管理的 bluestore OSD 不再需要 metadata 设备,所有的 OSD 相关的信息都记录在 OSD 自身的二进制数据中, 当 OSD 启动时通过创建内存文件系统(tmpfs)生成临时 metadata 内存设备;
  2. 所有服务器的 NTP(chronyd) 和防火墙(firewalld)已配置好;
  3. 在某些场景下,可以利用 IPv6 的 SLAAC 特性简化服务器的网络配置(即不需要显式配置服务器的 IPv6 地址)[1](要求禁用系统的 SLAAC Privacy Extensions[2][3]):
  4. 如果 public 网络与 cluster 网络合一,可以结合 Ceph 的 ms_bind_ipv6 选项,直接使用 SLAAC 分配的 Link Local 地址;
  5. 如果 public 网络与 cluster 网络分离,但所有服务器为同构设备,可以结合 Ceph 的 ms_bind_ipv6public_network_interface/cluster_network_interface 选项,直接使用 SLAAC 分配的 Link Local 地址;
  6. 由于网络配置属于整体解决方案的一部分,存在各种可能性,本文并不便于对生产环境的网络配置做过多的猜测,因此本文假设所有的服务器使用最简单、最清晰的静态配置 IPv6 地址方式。

[1] http://lists.ceph.com/pipermail/ceph-users-ceph.com/2017-March/017227.html

[2] https://www.internetsociety.org/resources/deploy360/2014/privacy-extensions-for-ipv6-slaac/

[3] https://www.internetsociety.org/blog/2015/02/ipv6-security-myth-5-privacy-addresses-fix-everything/

部署集群

一个完整的 Ceph 集群包括 MON、MGR、OSD 等 RADOS 基础服务以及之上的存储接口服务:MDS、RGW(RADOS GW)、SGW(SAN GW)、NGW(NAS GW)等。本文的内容将只覆盖 RADOS 基础服务,具体的网关服务需要其它文档进行补充。

本文为了简化操作,直接使用 root 用户执行命令,在生产环境或管理系统中需要使用 sudo 用户。

  1. 在所有节点配置 yum 源并安装 Ceph 软件包(可以选择性安装必须的包)
~# vi /etc/yum.repos.d/base.repo
[os]
name = os
baseurl = http://mirrors.ustc.edu.cn/centos/7/os/x86_64
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[extras]
name = extras
baseurl = http://mirrors.ustc.edu.cn/centos/7/extras/x86_64/
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[updates]
name = updates
baseurl = http://mirrors.ustc.edu.cn/centos/7/updates/x86_64/
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name = epel
baseurl = http://mirrors.ustc.edu.cn/epel/7/x86_64/
gpgkey = http://mirrors.ustc.edu.cn/epel/RPM-GPG-KEY-EPEL-7

[ceph]
name = ceph
baseurl = http://mirrors.ustc.edu.cn/ceph/rpm-luminous/el7/x86_64/
gpgkey = http://mirrors.ustc.edu.cn/ceph/keys/release.asc

~# yum clean all && yum install ceph -y
Loaded plugins: fastestmirror
Cleaning repos: ceph epel extras os updates
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
Loaded plugins: fastestmirror
...
  1. 在第一个节点创建集群配置文件
~# uuidgen
b15055e5-d3d7-469d-a6c7-0bcc4810c4c7
~# vi /etc/ceph/ceph.conf
[global]
fsid = b15055e5-d3d7-469d-a6c7-0bcc4810c4c7
mon_host = fec0:0:0:1::11,fec0:0:0:1::12,fec0:0:0:1::13
mon_initial_members = a
public_network = fec0:0:0:1::/64
cluster_network = fec0:0:0:2::/64
osd_pool_default_size = 2
osd_pool_default_min_size = 1
  1. 在第一个节点创建首个 MON 服务
~# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
creating /tmp/ceph.mon.keyring
~# ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
creating /etc/ceph/ceph.client.admin.keyring
~# ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'allow profile bootstrap-osd'
creating /var/lib/ceph/bootstrap-osd/ceph.keyring
~# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
importing contents of /etc/ceph/ceph.client.admin.keyring into /tmp/ceph.mon.keyring
~# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
importing contents of /var/lib/ceph/bootstrap-osd/ceph.keyring into /tmp/ceph.mon.keyring
~# monmaptool --create --add a fec0:0:0:1::11 --fsid b15055e5-d3d7-469d-a6c7-0bcc4810c4c7 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: set fsid to b15055e5-d3d7-469d-a6c7-0bcc4810c4c7
monmaptool: writing epoch 0 to /tmp/monmap (1 monitors)
~# chmod +r /tmp/ceph.mon.keyring
~# sudo -u ceph ceph-mon --mkfs -i a --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
~# systemctl enable ceph-mon@a
Created symlink from /etc/systemd/system/ceph-mon.target.wants/ceph-mon@a.service to /usr/lib/systemd/system/ceph-mon@.service.
~# systemctl start ceph-mon@a
~# ceph -s
cluster:
id: b15055e5-d3d7-469d-a6c7-0bcc4810c4c7
health: HEALTH_OK
...
  1. 将集群配置文件及关键的 keyring 文件从第一个节点拷贝至第二、第三个集群节点,如果是客户端节点只需要拷贝集群配置文件及 client.admin keyring 文件(注意 scp 命令中 IPv6 地址的引用方法)
~# scp /etc/ceph/ceph.conf [fec0:0:0:1::12]:/etc/ceph
~# scp /etc/ceph/ceph.client.admin.keyring [fec0:0:0:1::12]:/etc/ceph
~# scp /var/lib/ceph/bootstrap-osd/ceph.keyring [fec0:0:0:1::12]:/var/lib/ceph/bootstrap-osd/
~# scp /var/lib/ceph/mon/ceph-a/keyring [fec0:0:0:1::12]:/tmp
...
  1. 在第二、三个集群节点创建 MON 服务(当然前提是 ssh 到相应的节点)
~# chmod +r /tmp/keyring
~# sudo -u ceph ceph-mon --mkfs -i b --keyring /tmp/keyring
~# systemctl enable ceph-mon@b
Created symlink from /etc/systemd/system/ceph-mon.target.wants/ceph-mon@b.service to /usr/lib/systemd/system/ceph-mon@.service.
~# systemctl start ceph-mon@b
...
  1. 在第一个集群节点创建首个 MGR 服务(当然可以在其它节点上创建首个 MGR 服务)
~# ceph auth get-or-create mgr.a mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.a]
        key = AQDFG3Ra1SkJAhAAMc4QwqE21cPc39rdn+tXZw==
~# sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-a
~# ceph auth export mgr.a -o /var/lib/ceph/mgr/ceph-a/keyring
export auth(auid = 18446744073709551615 key=AQDFG3Ra1SkJAhAAMc4QwqE21cPc39rdn+tXZw== with 3 caps)
~# chown ceph.ceph /var/lib/ceph/mgr/ceph-a/keyring
~# systemctl enable ceph-mgr@a
Created symlink from /etc/systemd/system/ceph-mgr.target.wants/ceph-mgr@a.service to /usr/lib/systemd/system/ceph-mgr@.service.
~# systemctl start ceph-mgr@a
  1. 在第二、三个集群节点创建 MGR 服务(除 MGR id 不同之外,与前一步骤完全一致,略)
  2. 在第一个集群节点创建 OSD 服务

ceph-disk 即将在 Mimic 版本中被废弃,因此我们使用新的工具 ceph-volume 进行 OSD 的部署。首先对 ceph-volume 进行简单的介绍,详细的文档请参考[1]: ceph-volume 是 ceph-disk 的替代者,用于辅助 OSD 的创建、上电自启动等,从 Luminous 版本引入 Ceph,当前相比 ceph-disk 还有一些功能的缺失(如加密盘需要在 12.2.3/4 版本中出现,不支持 OSD destroy/zap),但相比 ceph-disk,ceph-volume 更清晰、可靠(不依赖 udev)。

ceph-volume 主要命令如下:

  • ceph-volume lvm prepare:创建 OSD;
  • ceph-volume lvm activate:启动 OSD 服务进程;
  • ceph-volume lvm create:综合 prepare 与 activate 的功能,即创建并启动 OSD 服务进程;
  • ceph-volume lvm list:列出当前节点所有的 OSD 设备;

查看当前节点的硬盘基本信息(假设都是全新的硬盘,如果存在分区、LVM 等情况,则需要先进行相应的清理工作):

~# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdc  /dev/sdd  /dev/sde

下面使用 ceph-volume 将 /dev/sdb - /dev/sde 共四个硬盘创建成 OSD,如前所述,OSD 全部基于独立的 HDD 创建,因此 DB/WAL 设备没有单独指定:

~# ceph-volume lvm create --bluestore --data /dev/sdb
Running command: sudo vgcreate --force --yes ceph-b15055e5-d3d7-469d-a6c7-0bcc4810c4c7 /dev/sdb
 ...
Running command: sudo systemctl start ceph-osd@0
~# ceph-volume lvm prepare --bluestore --data /dev/sdc
Running command: sudo vgcreate --force --yes ceph-d6adc93d-dbcc-4818-8215-25c4a195e3e2 /dev/sdc
 ...
 stderr: 2018-02-04 16:48:23.531223 7f806c22cd00 -1 key AQDFyHZat7hdNxAAntLYk3JeF3XoGidWqvtdPQ==
~# ceph-volume lvm list

====== osd.1 =======

  [block]    /dev/ceph-d6adc93d-dbcc-4818-8215-25c4a195e3e2/osd-block-bbfcf004-39f4-4d0f-9fcf-f0c1141dfb37
      type                      block
      osd id                    1
      cluster fsid              b15055e5-d3d7-469d-a6c7-0bcc4810c4c7
      cluster name              ceph
      osd fsid                  bbfcf004-39f4-4d0f-9fcf-f0c1141dfb37
      block uuid                5xcVFf-dCGU-fnyc-TXGK-DLcP-XsJH-LKqWCA
      block device              /dev/ceph-d6adc93d-dbcc-4818-8215-25c4a195e3e2/osd-block-bbfcf004-39f4-4d0f-9fcf-f0c1141dfb37
...
~# ceph-volume lvm activate 1 bbfcf004-39f4-4d0f-9fcf-f0c1141dfb37
Running command: sudo ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev /dev/ceph-d6adc93d-dbcc-4818-8215-25c4a195e3e2/osd-block-bbfcf004-39f4-4d0f-9fcf-f0c1141dfb37 --path /var/lib/ceph/osd/ceph-1
...
Running command: sudo systemctl start ceph-osd@1
  1. 在剩余节点创建 OSD 服务(略)

至此,整个 Ceph 集群创建成功,集群基本信息如下:

~# ceph -s
  cluster:
    id:     b15055e5-d3d7-469d-a6c7-0bcc4810c4c7
    health: HEALTH_WARN

  services:
    mon: 3 daemons, quorum a,b,c
    mgr: a(active), standbys: b, c
    osd: 12 osds: 12 up, 12 in
...
~# ceph mon stat
e5: 3 mons at {a=[fec0:0:0:1::11]:6789/0,b=[fec0:0:0:1::12]:6789/0,c=[fec0:0:0:1::13]:6789/0}, election epoch 44, leader 0 a, quorum 0,1,2 a,b,c
~# ceph mgr dump
{
    "epoch": 35,
    "active_gid": 54218,
    "active_name": "a",
    "active_addr": "[fec0:0:0:1::11]:6804/1283",
...

~# ceph osd dump
...
osd.0 up   in  weight 1 up_from 25 up_thru 0 down_at 0 last_clean_interval [0,0) [fec0:0:0:1::11]:6800/2831 [fec0:0:0:2::11]:6800/2831 [fec0:0:0:2::11]:6801/2831 [fec0:0:0:1::11]:6801/2831 exists,up b0d82635-10b0-43aa-b8a7-4e312acf6da0
osd.1 up   in  weight 1 up_from 29 up_thru 0 down_at 0 last_clean_interval [0,0) [fec0:0:0:1::11]:6802/3330 [fec0:0:0:2::11]:6802/3330 [fec0:0:0:2::11]:6803/3330 [fec0:0:0:1::11]:6803/3330 exists,up bbfcf004-39f4-4d0f-9fcf-f0c1141dfb37
...

[1] http://docs.ceph.com/docs/master/ceph-volume/