分布式部署规则
1、平常都是两台Node安装OpenStack平台,那如果想分布式部署该怎么做?比如:部署两台Nova服务,一台单独的Neutron服务,一台单独的存储节点等。
整体思想:
-
如果想要部署两台Nova服务,那就在controller节点安装管理端服务,分别在不同的节点安装Nova服务端。并且运行"su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova"命令去发现新添加的Nova节点。如果想把Controller节点也变成一个计算服务节点,也是安装Nova(compute)节点安装的一样,其中修改配置文件时,有许多部分都是已经修改过的,需要修改两点(这里只是大概,具体的操作看实际情况):[VNC]中需要修改,[libvirt]中virt_type = qemu需要修改。
最后别忘重启systemctl restart libvirtd.service openstack-nova-compute.service服务,这个是点睛之笔。
-
普遍的情况下,除了controller节点安装neutron组件,每一个安装了Nova节点上需要安装neutron服务。
如果想单独一台节点作为neutron服务那就直接按照部署在Nova节点的方式一样就行。
但是记得如果想要云主机能上网,一台neutron需要三个网卡:一个用于提供provider网络(flat),一个用于Vxlan网络,一个用于集群内部通信网络。
-
如果想要一台节点单独做存储节点的话(这里指的是LVM类型的存储),如果是分布式存储,比如:Ceph,Swift那就另当别论)直接按照cinder客户端的方式安装就行,my_ip别忘修改。
网络实战
1、前面也已经说过了,只要云主机想访问外网,就需要三块网卡:
-
provider网络(flat),这个网络是provider network(物理网络),必须要由admin用户创建,在配置文件中关于flat网络的配置:provider:ens33,实际上就是做了物理网络和虚拟网络的映射,provider可以随意定义,但是在创建flat网络指定物理网络名称是需要指定自定义的名称。我们创建了flat网络后,虚拟机使用了flat网络后,所发出的数据包实际上就是相当于是由ens33网络发出去的数据包,这样只要ens33网卡能上网那云主机也能上网,所以ens33网卡所在的网络类型需要是NAT模式(这个是在VM Workstation说的,因为实验室基于虚拟机做的),当然这个ens33网卡就需要配置网关,DNS等,而且在创建的flat网络时也需要配置网关和DNS,须和ens33的配置信息保持一致。在OpenStack中创建flat网络选上"external(外部网络)",然后共享网络
当然vlan类型的网络也是一样的。因为flat和vlan在openstack中是属于同一种网络的,只是底层实现效果不一样,具体的:vlan出去的数据包需要打tag,而flat出去的数据包不需要打tag。
重要思想:就可以把flat网络实现的效果理解为公有云上的公网IP。只要有了它云主机就能上网。
-
Vxlan网络:它是一个虚拟的网络,也叫做tenant network,所以vxlan网络是由tenant(租户创建的)这样它才有实际意义。为啥说Vxlan是个虚拟的网络?因为它本身不需要依赖于具体的物理网络,它不需要和某个物理网络对应,满足Vxlan的条件,在虚拟机上单独添加一块网卡,比如:ens38,这个ens38的类型是NAT,Host Only,桥接都行,并且ens38网卡配置信息,不需要网关。然后在创建Vxlan网络时,首先/etc/neutron/plugins/ml2/linuxbridge_agent.ini 配置文件中的[vxlan]分组中的local_ip = 192.168.17.10,填写本地你想当做Vxlan那块网卡的IP就行了。
然后是在Openstack中创建Vxlan,网段随便创建,并不需要和实际的物理网络相对应,因为Vxlan是个基于IP叠加的网络,也就是说只要Vxlan底层有个IP就行,网关不用写,这样就行了。
重要思想:Vxlan网络的效果就相当于公有云中云服务器中的私网IP,它既不能上外网,也不能和其它不同网段的服务器的通信。
但是想要使得具有Vxlan的网络的云主机能上外网并且和不同网络的云主机通信该怎么解决?
这就需要路由器,接口,浮动IP的接入了,稍后实战。
2、创建flat网络:
flat的网络就这样设置,DNS应该不用个ens33的一致,也能上网,但是必须有效。
就这样创建一台云主机并且使用flat网络,云主机就能上网了。
3、密钥对的使用
创建密钥分为两种:
- 创建密钥对:创建好之后会下载,注意这个密钥只能下载一次,所以妥善保管:
- 导入公钥
我们现在服务器上创建个密钥对
shell
#生成密钥对,-t rsa指定rsa算法
[root@controller ~]# ssh-keygen -t rsa
#copy公钥到openstack中
[root@controller ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGbJMMjvMc/T0mQAWvjXxCbefIeamvWEk2AAAi3jUudLCsmtzswIFkgNTASiXQbx1OtYkfpPC5seulEAO9+RxPfE4v8G4xQAHC8mERrUavj+L3OUc0le9UsFsxmJ6dC/OJD8+zUOEVvwiku03au7mBYMtn4soBzzHwKuRXJZdkW4yY9GaYmvdOdONmQs4mEP+PPc7CTE7u+npnsdr1BusmyqkIXLGbjnGPMOeOXPmOyhU4PKktZFmGfOqChMbrWGZB/4kDCqcuhuSAK77oauYMTEhBBSIut/ubJYWOsh8hB2jiydsnqZOlVpD6Oat/B6cCv2BiXkIy1ZhJkEk0SsKN root@controller
密钥对有了,然后创建云主机,看看如何使用密钥去连接云主机:
在Win的DOC窗口测试,xshell过几天研究。
1、这个是使用密钥对的方式连接
shell
#centos.pem是在下载下来密钥文件
C:\Users\郑波>ssh -i centos.pem cirros@192.168.9.183 #可以看到登陆成功!!!
Warning: Identity file centos.pem not accessible: No such file or directory.
cirros@192.168.9.183's password:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether fa:16:3e:22:f6:a3 brd ff:ff:ff:ff:ff:ff
inet 192.168.9.183/24 brd 192.168.9.255 scope global eth0
inet6 fe80::f816:3eff:fe22:f6a3/64 scope link
valid_lft forever preferred_lft forever
2、使用导入公钥的方式连接:
shell
[root@controller ~]# ssh cirros@192.168.9.173 #在controller,compute等节点连接可以,在Win上一样也可以。
The authenticity of host '192.168.9.173 (192.168.9.173)' can't be established.
RSA key fingerprint is SHA256:wJuOUWxA/6S++RA0p/bfJpOkmW7MvcJtGn33ia5YCr4.
RSA key fingerprint is MD5:2a:6a:5d:01:ed:22:0d:55:71:39:8c:21:c1:d7:c4:b2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.9.173' (RSA) to the list of known hosts.
cirros@192.168.9.173's password:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether fa:16:3e:59:7e:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.9.173/24 brd 192.168.9.255 scope global eth0
inet6 fe80::f816:3eff:fe59:7e13/64 scope link
valid_lft forever preferred_lft forever
$
4、创建Vxlan
在项目中创建的网络默认就是Vxlan网络,在管理员中创建也行。在管理员中创建Vxlan网络需要制定个段ID,只要在配置文件中的范围就行。
这里在项目中创建Vxlan网络,就正常创建即可,这里不再演示。
当然如果想要上外网还需要配置DNS:114.114.114.114(这个随意,只要有效即可),IP池还规定一下吧0.100-0.200
1、重点:现在Vxlan网络和外界是完全不互通的,要想胡同需要创建路由器。因此在创建了Vxlan网络之后,接下来就需要创建路由器。
在项目--->路由中创建路由:
2、重点:创建了路由,我们要在路由中创建个接口。
点击路由器名称--->接口会发现有一个接口了,而且IP是:192.168.9.109,
会显示flat网络中的IP地址,问什么?其实是这样的:这是个路由器,是负责实现nat工作的。我现在想使用Vxlan网络去上网,而Vxlan默认是私网IP不可能可外部网络进行通信,但是现在flat能访问外网啊,因此我们在添加个Vxlan网络的接口,将此接口和192.168.9.109接口做映射,其实就是SNAT,DNAT转换,这一样以来Vxlan就能上网了。
创建如下:
这个网关IP通常是172.30.0.1或172.30.0.254
创建好之后,刷新查看,是否是"UP"的状态,如果是"DOWN"的状态,那就是L3-agent代理配置错了。
接下来使用此Vxlan网络创建实例,检测其网络的可通性。
重点结论!!!:
- 此时在云主机上可以ping通baidu.com,还可以ping controller,compute等节点,也就是说使用Vxlan网络的云主机已经可以访问外网了。
- 但是!!!在我Win这个物理机上,或者controller,compute等主机上都不能ping通云主机,
这时如果还想实现外面的平通云主机,就需要浮动IP了(Float IP)
(1)在项目中创建浮动IP:
(2)创建好了浮动IP,我们需要将此浮动IP绑定在"vm02-vxlan"云主机上
这样绑定之后,在Win上或者controller,compute上就能ping通云主机了,只不过ping的是192.168.9.101,
此时我们可以ssh连接vm02-vxlan主机上。
shell
#需要注意的是,绑定的192.168.9.101浮动IP不会在云主机中显示,云主机是无感知的。
[root@controller ~]# ssh cirros@192.168.9.101
The authenticity of host '192.168.9.101 (192.168.9.101)' can't be established.
RSA key fingerprint is SHA256:pJIDlBRxckl5eeFjVwVT1iJOT1UjqDstgHeqpmmO7uE.
RSA key fingerprint is MD5:3a:51:5e:b2:e2:2d:7c:63:53:b0:b0:79:85:4c:52:11.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.9.101' (RSA) to the list of known hosts.
cirros@192.168.9.101's password:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
link/ether fa:16:3e:7c:16:85 brd ff:ff:ff:ff:ff:ff
inet 172.30.0.193/24 brd 172.30.0.255 scope global eth0
inet6 fe80::f816:3eff:fe7c:1685/64 scope link
valid_lft forever preferred_lft forever
网络拓扑分析
基于以上实验,形成如下网络拓扑
5、Vxlan使用的一些场景
场景一:同一网络下各子网默认互通
此测试:在同一个Vxlan网络下,其包含的各个子网是否能互通?
答案:默认能互通(标题既是答案)
实验测试:
在vxlan_172.30网络已经有个172.30.0.0/24的网络了,现在在创建个子网:172.30.1.0/24
创建步骤:
-
创建vxlan_172.30.1
-
创建路由
-
基于上述路由创建接口,做NAT映射转换,具体来说时SNAT,因为外部ping不通内部所以没有DNAT,
-
创建实例,用于检测。为了创建的云主机实例在172.30.1.0/24这个网络下面,我们可以通过指定端口的方式操作。
在项目--->网络--->网络名称--->端口操作:
-
创建实例。既然指定了端口,那就直接选端口即可。
场景二:不同网络下的子网不能互通,需要添加静态路由实现
实验步骤:
- 创建个Vxlan_172.40.0网络(172.40.0.0/24)
- 基于172.40创建个路由
- 基于路由创建接口,用于SNAT转换
- 创建云主机实例
现在172.40.0和172.30.0是不互通的,那如何实现互通?
答案:做静态路由
1、记录下40,30外部网关的IP,在路由器中
40的外部网关IP:192.168.9.145
30的外部网关IP:192.168.9.109
2、添加静态路由,现在40网络上面添加:
项目--->路由--->点击40的路由--->静态路由:
那如上配置之后,在40上就可以ping通30了,但是我们没有在30上配置40的静态路由,因此在30上还不能ping通40
3、添加静态路由,在30上面添加,做法和上面一样,不在演示。
这样不同网络的云主机实例就能互相ping通了。
6、实例的升降配与实例的冷迁移
在定义实例规格时,不建议定义根磁盘大小,如果定义,则将所有规格对磁盘大小定义设置为相同
根磁盘大小可以由镜像上传时定义最小根磁盘大小,也可以在创建实例时指定根磁盘大小。
1、实例升降配时均会重启实例
2、实例升降配时需要手动确认,若需要自动确认,需要在计算节点[DEFAULT]部分增加,如下配置:
-
计算节点上添加,用于实例升降配自动确认,自动确认时间,0是禁止,1代表1s自动确认:
resize_confirm_window = 1
3、实例升降配会出现实例迁移(当前所在计算节点资源不够时),所以还需要添加如下参数,同时要配置支持冷迁移或热迁移:
- allow_resize_to_same_host = true
- allow_migrate_to_same_host = true
但是通常情况下冷迁移会报错,因为一个计算节点资源不够,会迁移到另一个计算节点上去,但由于计算节点的nova用户不能互相通信,所以我们需要进行配置:
冷迁移配置
1、配置计算节点之间nova用户ssh对等性,即互相访问免密登陆
nova用户在安装nova软件时就已经创建了,只是限制登陆,需要修改为允许登陆,这个可以在/etc/passwd中查看。
如下配置:
shell
#设置nova用户可登录
[root@compute01 ~]# usermod -s /bin/bash nova
#给nova用户设置密码,便于后面scp密钥使用,要是不设置密码,还需要切换至root用户去scp密码
[root@compute01 ~]# echo "nova" |passwd --stdin nova
#登陆nova用户
[root@compute01 ~]# su - nova
Last login: Sat Apr 30 10:46:39 EDT 2022 from controller on pts/3
-bash-4.2$ pwd
/var/lib/nova
#生成密钥对
-bash-4.2$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/nova/.ssh/id_rsa):
Created directory '/var/lib/nova/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/nova/.ssh/id_rsa.
Your public key has been saved in /var/lib/nova/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:DO85l2PxWiTRVjORpAYEUrJVRgUEm2sqJz0OSzHc7Mc nova@compute01
The key's randomart image is:
+---[RSA 2048]----+
| o.=BOo..*o |
| = + o o.o |
| o o . = |
| . o + . + |
| + o S o . |
| = = . * |
| = * E = o |
| . B o + + |
| . . . |
+----[SHA256]-----+
#在一个计算节点生成密钥以及authorized_keys文件
-bash-4.2$ ssh-copy-id compute01
#把密钥scp至每一个计算节点上面:
-bash-4.2$ scp -rp .ssh/ compute02:~/
#注意scp的文件要保证文件的属性一致
#登陆测试
测试本身,测试非本身的登陆
比如我们在compute01上测试
-bash-4.2$ ssh compute02 #02的免密登陆
Last login: Sun May 1 10:57:00 2022
-bash-4.2$ exit
logout
Connection to compute02 closed.
-bash-4.2$ ssh compute01 #01的也免密登陆
Last login: Sun May 1 10:49:23 2022
同样在compute02上也测试一下
2、修改配置文件/etc/nova/nova.conf
shell
[DEFAULT]
allow_resize_to_same_host= true #允许在本机进行迁移
allow_migrate_to_same_host= true
resize_confirm_window=1 #这个和冷迁移关系不大
7、主机聚合
主机聚合(Host Aggregate)允许将硬件进行逻辑分组,并在用户创建实例时能指定对应的组,通常将相同规格硬件计算节点归类在一个组,
1、只有计算节点才能使用主机聚合
2、创建主机聚合时,必须要自定义一个域(可用区/可用域)
3、创建主机聚合时,会自动添加一个元数据avaliability_zone,值默认等于主机聚合名称
4、通过一个计算节点只能归属于一个可用域,即不能同属于两个或两个以上可用域
5、删除主机聚合时,必须先移除该主机聚合组下的所有计算节点,否则无法删除该主机聚合。
6、主机聚合可以让实例创建在指定的计算节点上。大部分情况,实例创建时是由调度器决定创建在哪台计算节点上,但在需要错误排查或编排服务资源分配时,希望能够直接在指定计算节点上创建实例,就可以用到主机聚合来实现。
7、主机聚合可以让管理员对终端用户透明的方式定义计算资源,同时根据目的进行逻辑地分组,当主机分组的元数据与实例类型的元数据匹配,并且使用该类型启动实例时,就会调度主机聚合中的计算节点创建实例。
8、可用域(可用区)是对计算资源的逻辑隔离,用户启动实例时可以选择选择对应的可用域,如果没有自定义可用域,默认为nova域。如果有多个可用域,则用户创建多个实例时可以指定不同的可用域,避免某-个可用域故障带来的问题。
8、主机组与虚拟机调度
主机组与主机聚合作用的对象不同。
主机聚合是针对宿主机计算节点,而主机组是针对虚拟机实例
1、按照关联、不关联、软关联、软不关联四种策略对用户创建的虚拟机进行管理。实现约束虚拟机与虚拟机在物理机上的部署关系。
(1)、关联:将实例创建在同-个计算节点上, 当该计算节点资源不够时就会失败。例如, 2个计算节点,批量创建3个实例, 选择"关联"组,则实例全部创建在其中-个计算节点上, 不会在另-个计算节点若资源不够时将会失败,关联组实例不支持迁移。
(2)、不关联:将实创建在不同计算节点上,当计算节点数等于"不关联"组中实例个数时,再创建实例到"不关联"组就失败。
(3)、软关联:将实例尽量创建在同-个计算节点上,当评估该计算节点资源不够时不会失败,会落到另一个计算节点。
(4)、软不关联:将实例尽量创建在不同计算节点上,当计算节点数量不够时,实例会落到同一个计算节点上。
2、Openstack的虚拟机调度策略默认是用FilterScheduler来实现。通过调度算法实现
(1)、先过滤掉不满足虚机flavor要求的计算节点
(2)、对剩余计算节点进行权重计算
(3)、选取权重值最优的计算节点返回
3、在控制节点上nova.conf中的vailable. filters用于配置可用的fiter,默认所有nova内置的ilter都可以用于过滤操作。 enabled, filters用于指定可用的过滤器。
filter. scheduler将按照enabled. filters值的顺序进行过滤。
[iter. scheduler]
available_ filters=nova.scheduler.fiters.all filters
enabled_fltrs=RtrylilteravailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapaliltieFilter,ImagePropertiesFilter,ServerGroupAtiftinityFilterServerGroupAinityFilter
- RetryFilter
过滤掉已经尝试过调度且失败的节点 - AvibiltyZoneFilter
为提高容灾性和隔离性,可以将计算节点划分到不同的可用域中,Openstack默认只有一 个命名为"nova"的可用域, 所有计算节点默认都是放在"nova"可用域中,用户可以通过主机聚合创建自定义域,在创建实例时可以选择自定义域。 - RamFilter
将不能满足flavor内存的计算节点过滤掉,为了提高系统的资源使用率,Openstack允许计算节点超额使用内存,也就是可以超过实际内存大小,可通过ram. alocation. ration=1.5 配置,默认初始超比率initial ram. alcation. ratio=1.5.同样还有CPU和磁盘超额配置。
[DEFAULT]
cpu allocation ratio=1.0
ram_ allocation ratio=1.0
initial .cpu_ allocation_ ratio=16.0
initial_ ram_ allocation_ ratio=1.5
、 ComputeFilter
确保只能正常的计算节点才能被nova-scheduler调度, ComputeFilter 是必须的过滤器 - ComputeCapabiltiesFilter
根据计算节点的特性来过滤,比如计算节点有x86和ARM架构,如果想指定实例部署到x86_ 64架构节点上,就要使用ComputeCapailisiter,.同时还需要在flavor中添加metadata.添加Architecture=>86. .64
6、ImagePropertiesFilter
根据所选image的属性来过滤计算节点跟favor类似,image也有metadata, 用于指定其属性。 - ServerGroupfityFiltr (亲和性)
将实例尽量创建在同一个计算节点上,结合主机组实现.要创建一个关联"主机组或"软关联"组。
03:53
ram,cpu配额的参数配置
shell
[root@compute02 ~]# vi /etc/nova/nova.conf
[DEFAULT]
cpu_allocation_ratio=1.0
ram_allocation_ratio=1.0
initial_cpu_allocation_ratio=1.0
initial_ram_allocation_ratio=1.0