上面左边是我的个人微信,如需进一步沟通,请加微信。 右边是我的公众号“Openstack私有云”,如有兴趣,请关注。
原来写过一遍文章“Openstack 之 kolla 新增flat网络”是在部署完成之后在物理机上新增网卡并作为flat网络使用的情况下的解决方法,昨天给一个朋友远程支持了一下另外一个需求,在只有2块网卡的情况下,第1块作为内部网路vxlan使用,第2块直接作为flat网络而非external flat网络,直接桥接到外部网络使虚拟机能够直接连接flat网络到外部网络,而不是像默认安装后通过openstack的内部路由分配floating ip映射外网地址。
对于这个需求我可能需要多啰嗦几句,openstack最初是为公有云设计的,对于外网IP资源在它看来是稀有的,因此,“外部网络”使用floating ip提供外网资源。但是我们实际使用过程中,我们所说的“外部网络”只是相对于openstack私有云本身网络来说的,并不是公有云里面的外部网络概念,而且一般都是需要虚拟机能够直接连接到这个“外部网络”,同时,另一个需求是能够分配静态IP地址。
openstack一般部署完成之后运行的init-runonce 初始化脚本新建2个网络,一个网络是vxlan网络,一个是网络是external flat网络,
vxlan网络和子网,对应的命令是:
openstack network create --provider-network-type vxlan demo-net openstack subnet create --subnet-range 10.0.0.0/24 --network demo-net \ --gateway 10.0.0.1 --dns-nameserver 8.8.8.8 demo-subnet
external flat网络和子网,注意这个--external属性,对应的命令是:
openstack network create --external --provider-physical-network physnet1 \ --provider-network-type flat public1 openstack subnet create --no-dhcp \ --allocation-pool ${EXT_NET_RANGE} --network public1 \ --subnet-range ${EXT_NET_CIDR} --gateway ${EXT_NET_GATEWAY} public1-subnet
另外就是创建路由:
openstack router create demo-router openstack router add subnet demo-router demo-subnet openstack router set --external-gateway public1 demo-router
并且设置了上面创建的vxlan网络需要通过这个路由到达external flat网络。
最终的结果就是,运行这个init-runonce初始化脚本之后,你的虚拟机只能配置内部的vxlan网络地址,比如10.0.0.10,并且需要在openstack内部路由上生成floating ip 绑定到虚拟机上才能被外部网络访问以及访问外部网络。
如果需要使虚拟机直接连接第二块网卡的flat网络和外部网络互通,要怎么操作呢?我昨天采用了自己手工创建网络的方式,等会儿记录一下,其实事后我才发现还有更加简单的办法,那就是,执行完init-runonce之后,进web管理界面,直接将脚本创建的public1这个外部网络的external属性取消掉就可以了!使用手工创建的方式能更好的帮助理解这个过程,下面记录一下不执行init-runonce脚本,而是使用手工创建的方式的过程:
1、kolla部署完成后,执行 kolla-ansible post-deploy 生成 /etc/kolla/admin-openrc.sh 环境变量文件,并执行生效
kolla-ansible post-deploy source /etc/kolla/admin-openrc.sh
2、通过web管理界面创建vxlan网络及子网,或者通过下面的命令创建(实际过程我是通过web方式,过程略):
openstack network create --provider-network-type vxlan demo-net //网络名称可以自己定义 openstack subnet create --subnet-range 10.0.0.0/24 --network demo-net \ --gateway 10.0.0.1 --dns-nameserver 8.8.8.8 demo-subnet //子网名称可以自己定义
3、通过web管理界面创建flat网络及子网,或者通过下面的命令创建(实际过程我是通过web方式,过程略):
openstack network create --provider-physical-network physnet1 \ //“physnet1”这个名称需要参考文件/etc/kolla/neutron-server/ml2_conf.ini中的 “flat_networks = physnet1” --provider-network-type flat public1 //网络名称可以自己定义 openstack subnet create --no-dhcp \ --allocation-pool 192.168.1.100,192.168.1.200 --network public1 \ //网络池可以自己定义 --subnet-range 192.168.1.0/24 --gateway 192.168.1.1 public1-subnet //子网范围、网关、子网名称可以自己定义
这里最关键的就是创建flat网络的时候,不要加--external参数,以及“physnet1”这个名称需要参考文件/etc/kolla/neutron-server/ml2_conf.ini中的 “flat_networks = physnet1” ,在web管理界面上面配置这个参数的时候也同样需要找到这个flat_networks 名称,很多人在这里就迷茫了,都卡在这个地方。
至于--external参数,如果有这个参数,那么创建的flat网络不能为虚拟机直接连接,只能跟openstack内部的路由器连接,所以不能加这个参数。
4、完成测试镜像cirros的下载和上传、默认安全组的创建、秘钥的生成等等初始化操作:
IMAGE_URL=http://download.cirros-cloud.net/0.3.4/ IMAGE=cirros-0.3.4-x86_64-disk.img IMAGE_NAME=cirros if ! [ -f "${IMAGE}" ]; then curl -L -o ./${IMAGE} ${IMAGE_URL}/${IMAGE} fi echo Creating glance image. openstack image create --disk-format qcow2 --container-format bare --public \ --file ./${IMAGE} ${IMAGE_NAME} # Get admin user and tenant IDs ADMIN_USER_ID=$(openstack user list | awk '/ admin / {print $2}') ADMIN_PROJECT_ID=$(openstack project list | awk '/ admin / {print $2}') ADMIN_SEC_GROUP=$(openstack security group list --project ${ADMIN_PROJECT_ID} | awk '/ default / {print $2}') # Sec Group Config openstack security group rule create --ingress --ethertype IPv4 \ --protocol icmp ${ADMIN_SEC_GROUP} openstack security group rule create --ingress --ethertype IPv4 \ --protocol tcp --dst-port 22 ${ADMIN_SEC_GROUP} # Open heat-cfn so it can run on a different host openstack security group rule create --ingress --ethertype IPv4 \ --protocol tcp --dst-port 8000 ${ADMIN_SEC_GROUP} openstack security group rule create --ingress --ethertype IPv4 \ --protocol tcp --dst-port 8080 ${ADMIN_SEC_GROUP} if [ ! -f ~/.ssh/id_rsa.pub ]; then echo Generating ssh key. ssh-keygen -t rsa -f ~/.ssh/id_rsa fi if [ -r ~/.ssh/id_rsa.pub ]; then echo Configuring nova public key and quotas. openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey fi
大家可以看到,其实上面都是从init-runonce里面摘取出来的,可以直接复制粘贴到命令窗口执行。
5、最后就是验证测试了,最简单的验证方法就是,在web管理界面上创建实例,选择测试镜像cirros,在选择网络这一块的时候,直接选择flat网络public1,这时候系统会自动分配一个flat地址,比如192.168.1.110 (上面的子网自动分配地址池是192.168.1.100-192.168.1.200),生成之后直接测试看看虚拟机是不是能够与192.168.1.0/24网络互访。现实情况下面,更多的是会使用静态分配IP的方式,过程如下:
1)进入web管理界面,管理员->网络->public1->端口->创建端口 ,输入“名称”比如cirros-1,选择“指定IP或子网”为“固定的IP地址”,输入“固定的IP地址”比如192.168.1.101,点击“创建端口”;
2)进入web管理界面,项目->实例->创建实例 ,输入“实例名称”比如cirros1,镜像选择cirros,“实例类型”选择tiny,“网络”跳过,“网络接口”选择上面生成的“cirros-1”,“安全组”选择default,“秘钥对”选择mykey,点击“创建实例”;
3)等cirros1实例生成完成之后,进入web管理界面,项目->实例,点击cirros1虚拟机->控制台,登录cirros1虚拟机,执行命令:
ifconfig eth0 192.168.1.101/24
登录进在192.168.1.0/24网段的主机对192.168.1.101镜像ping和ssh测试成功:
ping 192.168.1.101 ssh [email protected] //密码 cubswin:)