blob.png blob.png

 上面左边是我的个人微信,如需进一步沟通,请加微信。  右边是我的公众号“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:)