Openstack 之 使用flat網絡

blob.png blob.png

 上面左邊是個人我的微信,如需進一步溝通,請加微信。  右邊是個人公衆號「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:)
相關文章
相關標籤/搜索