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