网络

Vlan和bond配置

​ 因为工作上的原因,需要开始着手研究部署Proxmox VE集群,选择最新的6.2版本。安装PVE的过程很简单,在安装阶段需要输入一个IP地址,注意这个IP必须是要能联通,通过这个地址可以访问https://IP:8006的Web UI管理页面,也可以通过这个IP直接SSH到Debian系统里。

​ 我在网络这一步遇到了第一个坑,先说下设备的物理环境:

几台Dell的物理机,都装有两块光纤网卡,一块连在一组S4810交换机上跑业务,一块连在一组S4810交换机上连接集中存储。业务交换机上划分了4个Vlan,服务器和交换机的口配置的是target。

​ 所以在安装系统的时候,我选择了一个用于管理的Vlan网段中的地址,但是安装完成后显然是连不上的,因为PVE系统安装后会自动的生成一个网桥的配置,类似于这种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@node03:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address 10.200.50.142
netmask 255.255.255.0
gateway 10.200.50.254
bridge_ports eno1
bridge_stp off
bridge_fd 0

iface eno2 inet manual
iface eno3 inet manual
iface eno4 inet manual
  1. 第一步需要进系统配置加载支持vlan的模块:
1
2
:~# modprobe 8021q
:~# echo "8021q" >> /etc/modules
  1. 第二步编辑网卡配置文件,重点是在bridge下新增虚拟网卡实现vlan:
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
root@node01:~# cat /etc/network/interfaces

auto lo
iface lo inet loopback

iface eno1 inet manual
iface eno3 inet manual
iface eno4 inet manual
iface enp4s0f1 inet manual

auto eno2
iface eno2 inet manual
auto enp4s0f0
iface enp4s0f0 inet manual
auto bond0
iface bond0 inet static
address 172.16.14.173/24
bond-slaves eno2 enp4s0f0
bond-miimon 100
bond-mode active-backup
bond-primary enp4s0f0
mtu 9000
#iscsi

auto vmbr0
iface vmbr0 inet manual
bridge-ports eno1
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094

auto vmbr0.555
iface vmbr0.555 inet static
address 10.1.255.35/24
gateway 10.1.255.254
#Management

auto vmbr0.301
iface vmbr0.301 inet static
address 10.10.2.245/24
#LAN

auto vmbr0.300
iface vmbr0.300 inet static
address 10.10.0.245/24
#LAN

auto vmbr0.547
iface vmbr0.547 inet static
address 10.10.247.245/24
#DMZ

​ 上面的配置中包含了两个部分,一个是网卡eno2 和enp4s0f0 组成了一个bond0,配置成主备模式,用来使用iscsi连接存储交换机。传送门:7种模式

​ 下面部分就是网桥vmbr0,以及在该网桥下新建的4个VLAN,注意vmbr0是绑定在eno1上,而IP是配置在网桥下的虚拟网卡里的。这种情况下虚拟机只要配置连接vmbr0,对应的虚拟机网卡里配置不同vlan网段的IP即可联通外面的网络。
3. 重启服务
​ 配置完成后,重启networking.service即可,如果想通过Web UI配置也可以,但是需要系统安装 ifupdown2包来实现web应用配置。

1
apt install ifupdown2

​ 关于vlan配置的问题,官方文档说:

VLAN on the Host
To allow host communication with an isolated network. It is possible to apply VLAN tags to any network device (NIC, Bond, Bridge). In general, you should configure the VLAN on the interface with the least abstraction layers between itself and the physical NIC.

​ 因此按推荐的应该可以直接在eno1的网卡下直接配置虚拟的vlan网卡,然后再在虚拟vlan网卡上起bridge,但是在我的环境下我如此部署测试不成功,所以最终选择了如上的配置。

​ 在这种模式下,因为所有的虚拟机都连着一个bridge所以物理上的流量是互通的,但是因为虚拟机各有各的Vlan标签和网段,他们之间是隔离开来的,这个还需要进一步的测试。

存储

iscsi配置共享存储

​ 因为我后端是一个磁盘阵列,所以可以配置各个服务器通过iscsi连接到存储上,共享一个或多个共享卷。网上的资料不是很多,以下为我摸索后可行的操作。首先保障磁盘阵列这边新建卷和服务器,服务器的bond配置正确可以ping通存储。

  1. 第一步:安装iscsi包,访问并登陆存储
    1
    2
    3
    4
    5
    6
    7
    apt-get install open-iscsi
    # 静态发现
    iscsiadm -m discovery -t sendtargets -p 172.16.14.29:3206
    # 登陆
    iscsiadm -m discovery -t st -p 172.16.14.29:3260 --login
    # 挂载
    iscsiadm -m node -T iqn.2002-03.com.compellent:5000d31000ae0b55 -p 172.16.14.29:3260,0 -l

​ 由于我后端存储使用了双控制器多路径,因此挂载时没条路径都要挂载一次,为此专门写了个脚本来在所有服务器上跑:

1
2
3
4
5
6
7
iscsiadm -m discovery -t st -p 172.16.14.29:3260 >> iscsi.txt
while read LINE
do
iscsi_ip=$(echo $LINE | awk '{print $1}')
iscsi_name=$(echo $LINE | awk '{print $2}')
iscsiadm -m node -T $iscsi_name -p $iscsi_ip -l
done < iscsi.txt

​ 然后在 /etc/iscsi/initiatorname.iscsi 配置文件里,可以看到本机的iscsi ID,全球唯一哦。利用这个ID可以在存储上添加HBA卡,绑定在之前配置的服务器上,然后将共享卷映射在服务器。

​ 使用命令:iscsiadm -m node -R 重新扫描iscsi,然后通过fdisk -l ,就可以看到映射的卷了。

​ 这使用前还有一个问题,因为我是通过多路径挂载的,所以会识别多个磁盘路径,在不同服务器自动生成的磁盘路径可能不同,所以使用起来也会有问题,这时候需要进行第二步。

  1. 第二步:安装multipath,配置多路径
    1
    apt-get install multipath-tools

​ 注意Debian系统的包与centos系列的包不太一样,推荐看下redhat的官方文档 : DM Multipath

然后启动服务 systemctl start multipathd.service

​ 启动完成后使用multipath -ll可以看到合并成一块盘了,默认名称可能是mpathb这种,通过修改配置文件可以给盘设置别名方便后面格式化的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
cat /etc/multipath.conf
# 黑名单里的磁盘不参与多路径
blacklist {
devnode "^sda"
devnode "^sdb"
}
# 设置别名
multipaths {
multipath {
wwid 36000d31000ae0b000000000000000097
alias pve35-data01
}
}

  1. 第三步,格式化硬盘创建分区

​ 使用fdisk来新建分区,注意第一步使用g命令转换为gpt格式,第二步n新建分区,第三步是输入来转换分区格式,输入31对应的是’Linux LVM’格式,可以输入L来看一共有多少种格式和没种格式对应的数字编号,最后输入w完成写入。

image-20200715221851341

这时再fdisk -l 就能看到新增的分区了

image-20200715221931613

  1. 第四步:创建PV和VG

​ 正常情况下如果是本地磁盘,可以直接在Web UI上存储-LVM的标签里新建LVM卷或者LVM_thin卷。但是iscsi共享的卷识别不出空闲硬盘,在硬盘选项卡里也显示不出来。同时iscsi共享卷不支持LVM_thin格式,这意味这新建虚拟机时分配了多少存储空间,就会直接占用该共享卷多少空间,不能支持超售了!

​ 这里遇到了第二个大坑,创建PV的时候一直报错,试过很多办法都不得解,最后还是觉得可能是多路径的原因导致的,因为以上的操作在服务器的一个节点上操作就可以,而我当时在另外一个节点上重复了操作,并且设置多路径别名的时候设置成了相同的。

​ 我把别名改成不同的,重新刷新多路径后,就可以创建PV了。

​ 在一个节点上完成上面的各个步骤以后,就可以在别的节点上依次使用 partprobe命令刷新系统的分区表,应该能看到相同的VG卷。
​ 刷新完成后在数据中心的存储标签下新建一个共享的LVM了。其实到这一步就能发现,PVE的LVM系统实际上是利用linux系统底层硬盘组成的VG卷,然后划分给虚拟机使用的存储空间是在VG卷上划分出的LV卷。

​ 创建完LVM就可以在上面新建虚拟机,虚拟机支持动态的在节点间迁移。

  1. 第五步,扩容共享LVM的空间

    想一次规划完硬盘的容量是不现实的,后期肯定会需要对硬盘进行扩容。扩容的步骤和新建其实差不多,包括以下几步:

  • 磁盘阵列上扩容存储卷

  • 重新扫描iscsi、重新刷新分区表、重启多路径

  • 使用fdisk命令新增第2个分区

  • 使用vgextend命令扩展VG卷

  • 其他节点使用 partprobe命令刷新分区表

    扩展完VG卷后刷新WEB UI,就可以看到LVM已经变成扩容后的容量了。

NFS配置共享目录

​ 因为需要一个共享的目录来存放各种系统的镜像文件以及虚拟机的备份、模板等,PVE系统默认的目录都是在本机的/var/lib/vz下面,空间又小还不支持共享。

​ 正好我在其中一个节点有块900的单独硬盘,拿来做NFS共享盘,提供共享目录。注意前面使用的iscsi共享卷只能做LVM,不能做目录来存放文件。步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 新建硬盘分区
fdisk /dev/sdb
# 格式化文件系统
mkfs -t ext4 /dev/sdb1
# 挂载到本地目录
mkdir /isodata
mount /dev/sdb1 /isodata
# 永久挂载
sed -i "/dev/sdb1 /isodata ext4 defaults 0 0" /etc/fstab
# 安装NFS服务端
apt-get install nfs-common nfs-kernel-server -y
# 创建共享目录
mkdir /isodata/iso
chmod 644 -R /isodata/iso
# 配置权限
sed -i "/isodata/iso  *(rw,sync,no_root_squash,no_subtree_check,insecure)" /etc/exports
# 启动服务
systemctl start nfs-kernel-server
systemctl enable nfs-kernel-server

​ 然后就可以在Web UI上添加共享NFS了,NFS支持存放所有类型的文件,其实也是可以作为虚拟机的共享存储,但是考虑到性能和容量,肯定是不如iscsi的共享存储,因此只配置存放ISO镜像和备份文件。

image-20200715230959742

Ceph分布式存储部署

​ 还是先说一下环境,有5台Dell的服务器,每台都有7-9块5.5T的硬盘,为了保证这几台服务器组成另外一个PVE的集群,提供共享存储和HA等功能,所以把5台服务器搭一个Ceph的集群。同时这些硬盘型号完全一致且没有做Raid,正合适组成Ceph。

​ 部署Ceph可以直接登陆终端使用命令,也可以直接使用Web UI上提供的页面功能,推荐使用Web页面上的。部署前需要做完基础环境的配置,重点是更改官方的企业源,不然安装升级ceph时可能会删除pve 的系统包!

  1. 节点上安装Ceph

​ 在节点上点击Ceph选项卡,会提示尚未安装,点击安装即可

image-20200720224504234

​ 安装过程中会提示安装200MB左右的包,速度可能会有点慢,耐心等待即可。

image-20200720224615697

​ 安装完成后,会要求选择Ceph的网络,这里需要注意下,如果你独立的存储网络最好,没有的话和业务网络使用一样的也可以。刷新页面后点击Ceph页签,可以看到配置、监视器。OSD等标签都激活了。在所有节点上都安装完毕,确认没有报错失败等问题。

  1. 配置Ceph

​ 按照mon、mgr、osd的顺序进行配置。

​ 添加监视器mon,最少1个,必须是奇数,我5台服务器的情况下选择3个mon正合适,在监视器页面选择创建。

​ 添加管理mgr,最少1个,可以添加多个,但是同时只有1个节点是激活状态,其他是standby,也在监视器页面创建。

image-20200720225647496

​ 然后可以创建OSD,OSD可以使用Web UI上创建,也可以使用命令。这里我选择了命令创建,主要是部分硬盘有分区,需要创建前进行格式化操作,此外因为硬盘数量有点多,点击太费事了。

​ 所以写了个简单的脚本,每个节点一共有6块盘,先彻底格式化,然后再创建osd,在每个节点上依次跑这个脚本即可。

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash

list=(c d e f g h)

for x in ${list[*]};
do
echo "############## $x################"
ceph-volume lvm zap /dev/sd$x --destroy
pveceph osd create /dev/sd$x
done
echo "#################################"

​ 创建完成的大概是这样的,osd从0开始,到29正好30个。

image-20200720231307777

  1. 创建pool

​ pool的整体概念就不细说了,在创建的时候,有两个参数需要注意,副本数(下图中的大小代表最大/小副本数)和pg_num。副本数就是数据会保存几份,主要一个副本要占用额外的一倍空间。pg_num是ceph的逻辑存储单元,每个PG的数据会分散到多个osd上。如果这个Target PGs per OSD的值太小,小于30,集群会一直处于不健康的状态。

​ 按照官方文档,如果osd不会发生大的扩展,这个值按100来算,由此可以反推出pg_num。注意这个值必须是2的N次幂,不然同样会报错,我这里选择1024来创建一个pool。

image-20200720233750174

  1. 创建RBD

最后一步比较简单,在集群目录下,点击存储标签,创建一个RBD类型的共享存储即可。选择在刚才创建的pool上添加。然后在创建虚拟机时就可以使用RBD存储了。RDB支持共享、精简、快照等功能。

image-20200720234024691

使用Ceph以后,也可以使用CephFS,目前我还没有测试这个文件系统,后续如果使用了再补充。