由于 Ceph 不支持双栈(即同时支持 IPv4 和 IPv6),因此本文介绍搭建 IPv6 Ceph 集群的步骤。
IPv6 基础
- IPv6 地址有 128 位,使用以冒号分隔的多组十六进制字符串表示,每组 16 位,总共 8 组,如:fec0:0000:0000:0001:0000:0000:0000:0002,
可以通过一套简写的规则[2]简写为:fec0::1:0:0:0:2 或 fec0:0:0:1::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 地址;
- Site Local 地址和 Link Local 地址都是内网私有地址,其中 Site Local 地址类似于 IPv4 中的 192/172/10 网段的私有地址,可以在内网进行路由转发,而 Link Local 地址是 IPv6 特有的,只支持单个物理网络(即以太网的广播域)内的通信,因此使用该类型的报文无法通过路由转发;
- 类似于 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 地址:
1 | ~# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8 |
[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;
注意事项:
- 使用 ceph-volume 管理的 bluestore OSD 不再需要 metadata 设备,所有的 OSD 相关的信息都记录在 OSD 自身的二进制数据中,
当 OSD 启动时通过创建内存文件系统(tmpfs)生成临时 metadata 内存设备; - 所有服务器的 NTP(chronyd) 和防火墙(firewalld)已配置好;
- 在某些场景下,可以利用 IPv6 的 SLAAC 特性简化服务器的网络配置(即不需要显式配置服务器的 IPv6 地址)[1](要求禁用系统的 SLAAC Privacy Extensions[2][3]):
- 如果 public 网络与 cluster 网络合一,可以结合 Ceph 的
ms_bind_ipv6
选项,直接使用 SLAAC 分配的 Link Local 地址; - 如果 public 网络与 cluster 网络分离,但所有服务器为同构设备,可以结合 Ceph 的
ms_bind_ipv6
及public_network_interface
/cluster_network_interface
选项,直接使用 SLAAC 分配的 Link Local 地址;
- 由于网络配置属于整体解决方案的一部分,存在各种可能性,本文并不便于对生产环境的网络配置做过多的猜测,因此本文假设所有的服务器使用最简单、最清晰的静态配置 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 用户。
- 在所有节点配置 yum 源并安装 Ceph 软件包(可以选择性安装必须的包)
1 | ~# vi /etc/yum.repos.d/base.repo |
- 在第一个节点创建集群配置文件
1 | ~# uuidgen |
- 在第一个节点创建首个 MON 服务
1 | ~# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *' |
- 将集群配置文件及关键的 keyring 文件从第一个节点拷贝至第二、第三个集群节点,如果是客户端节点只需要拷贝集群配置文件及 client.admin keyring 文件(注意 scp 命令中 IPv6 地址的引用方法)
1 | ~# scp /etc/ceph/ceph.conf [fec0:0:0:1::12]:/etc/ceph |
- 在第二、三个集群节点创建 MON 服务(当然前提是 ssh 到相应的节点)
1 | ~# chmod +r /tmp/keyring |
- 在第一个集群节点创建首个 MGR 服务(当然可以在其它节点上创建首个 MGR 服务)
1 | ~# ceph auth get-or-create mgr.a mon 'allow profile mgr' osd 'allow *' mds 'allow *' |
在第二、三个集群节点创建 MGR 服务(除 MGR id 不同之外,与前一步骤完全一致,略)
在第一个集群节点创建 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 等情况,则需要先进行相应的清理工作):
1 | ~# ls /dev/sd* |
下面使用 ceph-volume 将 /dev/sdb - /dev/sde 共四个硬盘创建成 OSD,如前所述,OSD 全部基于独立的 HDD 创建,因此 DB/WAL 设备没有单独指定:
1 | ~# ceph-volume lvm create --bluestore --data /dev/sdb |
- 在剩余节点创建 OSD 服务(略)
至此,整个 Ceph 集群创建成功,集群基本信息如下:
1 | ~# ceph -s |