上面左边是个人我的微信,如需进一步沟通,请加微信。 右边是个人公众号“Openstack私有云”,若有兴趣,请关注。web
原来写过一遍文章“Openstack 之 kolla 新增flat网络”是在部署完成以后在物理机上新增网卡并做为flat网络使用的状况下的解决方法,昨天给一个朋友远程支持了一下另一个需求,在只有2块网卡的状况下,第1块做为内部网路vxlan使用,第2块直接做为flat网络而非external flat网络,直接桥接到外部网络使虚拟机可以直接链接flat网络到外部网络,而不是像默认安装后经过openstack的内部路由分配floating ip映射外网地址。
安全
对于这个需求我可能须要多啰嗦几句,openstack最初是为公有云设计的,对于外网IP资源在它看来是稀有的,所以,“外部网络”使用floating ip提供外网资源。可是咱们实际使用过程当中,咱们所说的“外部网络”只是相对于openstack私有云自己网络来讲的,并非公有云里面的外部网络概念,并且通常都是须要虚拟机可以直接链接到这个“外部网络”,同时,另外一个需求是可以分配静态IP地址。bash
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属性,对应的命令是:
ssh
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
另外就是建立路由:curl
openstack router create demo-router openstack router add subnet demo-router demo-subnet openstack router set --external-gateway public1 demo-router
而且设置了上面建立的vxlan网络须要经过这个路由到达external flat网络。tcp
最终的结果就是,运行这个init-runonce初始化脚本以后,你的虚拟机只能配置内部的vxlan网络地址,好比10.0.0.10,而且须要在openstack内部路由上生成floating ip 绑定到虚拟机上才能被外部网络访问以及访问外部网络。ide
若是须要使虚拟机直接链接第二块网卡的flat网络和外部网络互通,要怎么操做呢?我昨天采用了本身手工建立网络的方式,等会儿记录一下,其实过后我才发现还有更加简单的办法,那就是,执行完init-runonce以后,进web管理界面,直接将脚本建立的public1这个外部网络的external属性取消掉就能够了!使用手工建立的方式能更好的帮助理解这个过程,下面记录一下不执行init-runonce脚本,而是使用手工建立的方式的过程:
post
一、kolla部署完成后,执行 kolla-ansible post-deploy 生成 /etc/kolla/admin-openrc.sh 环境变量文件,并执行生效
kolla-ansible post-deploy source /etc/kolla/admin-openrc.sh
二、经过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 //子网名称能够本身定义
三、经过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内部的路由器链接,因此不能加这个参数。
四、完成测试镜像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里面摘取出来的,能够直接复制粘贴到命令窗口执行。
五、最后就是验证测试了,最简单的验证方法就是,在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 cirros@192.168.1.101 //密码 cubswin:)