preface
緊接上一章,我們這里開始部署網絡服務Neutron,可參考官網文檔:http://docs.openstack.org/newton/install-guide-rdo/neutron.html.
涉及到挺多網絡概念,如有本人理解錯誤的地方,還望指出,多謝。
安裝neutron網絡服務
先說說Openstack Neutron下的幾個概念
- 網絡:在Neutron的世界里,網絡將多個不同的雲主機連接起來。
- 子網: 在實際的物理環境下,在一個物理網絡中,我們可以將網絡划分為多個邏輯子網。在Neutron世界里,子網也隸屬於網絡下的。
- 端口: 在Neutron的世界里端口也隸屬於子網下,雲主機的網卡會對應到一個端口上。
- 路由器: 連接不同的網絡或者子網。
neutron的組成
-
neutron-server:
Neutron-server 可以理解一個專門用來接受Neutron Rest api調用的服務器,然后負責將不同的rest api分發到不同的neutron-plugin上。 -
neutron-plugin
Neutron-plugin可以理解為不同的網絡功能實現不同的入口,各個廠商可以開發自己的plugin,Neutron-plugin接收neutron-server分發過來的REST API,向neutron database完成一些信息的注冊,然后將具體要執行的業務操作和參數通知給自身對應的neutron agent。 -
neutron-agent
Neutron-agent可以直觀地理解為neutron-plugin在設備上的代理,接收相應的neutron-plugin通知的業務操作和參數,並轉換為具體的設備級操作,以指導設備的動作。當設備本地發生問題時,neutron-agent會將情況通知給neutron-plugin。 -
Neutron database
顧名思義就是Neutron的數據庫,一些業務相關的參數都存在這里。 -
Network provider
即為實際執行功能的網絡設備,一般為虛擬交換機(OVS或者Linux Bridge)。比如linux-bridge: linux網橋,其實就是插件。
plugin的兩類模塊-為core-plugin和service-plugin:
neutron-plugin分為core-plugin和service-plugin兩類。
- Core-plugin:
Core-plugin,Neutron中即為ML2(Modular Layer 2),負責管理L2的網絡連接。ML2中主要包括network、subnet、port三類核心資源,對三類資源進行操作的REST API被neutron-server看作Core API,由Neutron原生支持,其中:
名稱 | 解釋 |
---|---|
Network | 代表一個隔離的二層網段,是為創建它的租戶保留的一個廣播域。subnet和port始終分配給某個特定的network。network的類型包括flat,vlan,vxlan,gre等。 |
Subnet | 代表一個IPV4/V6的CIDR地址池,以及相關配置,如網關,DNS等,該subnet中的VM實例會自動繼承該配置。Subnet必須關聯一個network |
Port | 代表虛擬交換機上的一個虛擬交換端口,VM的網卡VIF連接port后,就會擁有MAC地址和IP地址。Port的IP地址就是從subnet地址池中分配的。 |
- Service-plugin
即為除core-plugin以外其它的plugin,包括l3 router、firewall、loadbalancer、VPN、metering等等,主要實現L3-L7的網絡服務。
這些plugin要操作的資源比較豐富,對這些資源進行操作的REST API被neutron-server看作Extension API,需要廠家自行進行擴展。
“Neutron對Quantum的插件機制進行了優化,將各個廠商L2插件中獨立的數據庫實現提取出來,作為公共的ML2插件存儲租戶的業務需求,使得廠商可以專注於L2設備驅動的實現,而ML2作為總控可以協調多廠商L2設備共同運行”。
在Quantum中,廠家都是開發各自的Service-plugin,不能兼容而且開發重復度很高,於是在Neutron中就為設計了ML2機制,使得各廠家的L2插件完全變成了可插拔的,方便了L2中network資源擴展與使用。
ML2作為L2的總控,其實現包括Type和Mechanism兩部分,每部分又分為Manager和Driver。Type指的是L2網絡的類型(如Flat、VLAN、VxLAN等),與廠家實現無關。Mechanism則是各個廠家自己設備機制的實現,如下圖所示。當然有ML2,對應的就可以有ML3,不過在Neutron中L3的實現只負責路由的功能,傳統路由器中的其他功能(如Firewalls、LB、VPN)都被獨立出來實現了,因此暫時還沒有看到對ML3的實際需求。
一般而言,neutron-server和各neutron-plugin部署在控制節點或者網絡節點上,而neutron agent則部署在網絡節點上和計算節點上。
Neutron支持層OSI模型,如下所示:
ML2(module Layer2)plug:
DHCP-Agent: dhcp分配功能
L3-Agent:網絡路由功能
聊聊Openstack-vlan模式
我們先說下vlan模式下的chunk鏈路與Access鏈路,如下圖所示:
- Access鏈路只允許一個vlan通過。
- Chunk鏈路允許多個vlan通過。
上圖的流程是:
PC1它處在vlan10下,當他需要與其他vlan10下的PC機通信時,它發起的包會通過交換機1封裝,打上vlan10的標簽,然后在vlan10下廣播,喊道“某某主機,PC1找你”,如果本交換機內部沒有找到,那么就通過chunk鏈路發送到對面的交換機2上,由於chunk鏈路支持多個vlan通行,所以vlan10到對面的交換機上沒有問題的。交換機2也進行vlan的廣播,找到pc1要找的主機。這就是在access和Chunk鏈路下簡單通信流程.
知道上面的知識以后,我們知道為了實現多個vlan在同一個鏈路傳播,那么必須使用chunk鏈路,所以Openstack服務器與交換機之間配置成chunk鏈路。
同時我們稱為這個為大二層網絡。什么是大二層網絡,大二層網絡就是一個交換機連接了一個交換機,另一個交換機又連了一個交換機等等,這里的大二層網絡就是Openstack宿主機的虛擬交換機與物理網絡的真實交換機形成的大二層網絡的。
Openstack內部網絡流程圖
-
tap設備是在宿主機上的,虛擬機想要到外網,那么必須通過tap設備進行轉發。
-
linux網橋是提供安全組,安全組就是基於iptables實現的。所以linux網橋通過iptables規則來控制網絡的進出。
-
划分vlan的動作是在br-int上操作的。每個vlan過來的數據包都會拆包后打上一個vlan標簽后再封裝轉發出去。只能划分4096個vlan。
-
br-ex是關聯物理網卡,做vlan轉換。把從虛擬機過來的vlan1的數據包,和物理交換機存在的vlan相互轉發,從而能夠在物理網絡中通信的。反之,從物理網絡過來的vlan包如果要到虛擬機上,那么br-eth也需要轉換下,從物理網絡的vlan1轉換到虛擬機之間的vlan1。
-
由於這種模式涉及到vlan的轉換,所以需要和物理網絡的vlan綁定。適合小規模部署,幾百台服務器部署正好。不適合大規模部署。
-
不需要網絡節點(Openstack-neutron-agent節點)。從雲主機出來的數據包到物理交換機是這樣的一個流程:經過tap->linux網橋->veth對->Openswitch br-in -> Openswitch br-ex -> 物理交換機。其中如果雲主機是vlan10的話,那么在經過Openswitch br-in 的會打上vlan10的標簽,然后通過Openswitch br-ex 再次轉換,由內部的vlan標簽轉換成物理網絡可識別的vlan標簽,此時在物理交換機如果設置了vlan10的默認網關,那么數據包就會直接被物理交換機轉發到網關上了。
雲主機跨物理機通信過程(同一個vlan)
如圖所示:
如果兩個雲主機在同一個物理機上且同一個vlan下的,那么他們之間數據包到br-int上就會進行vlan下的廣播,所以vm1與vm2上互ping比較快。
下面看看跨物理機的雲主機通信(在同一個vlan下面)。
- vm1和vm6假設處在vlan1下面。vm1虛擬機發起一個請求到vm6上,vm1發起的包首先經過tap設備轉發,然后到linux網橋,再到br-int上進行廣播,廣播無人回應,同時打上vlan1的標簽后轉發到br-ex上,br-ex上進行轉換,把vlan1的虛擬網絡vlan標簽轉換成物理網絡對應的vlan標簽后發到物理交換機上。
- 物理交換機上進行廣播,廣播包通過thunk鏈路到了右邊的物理機上。
- 首先還是經過br-ex,把物理網絡的vlan標簽進行轉換成虛擬網絡的標簽vlan1后發送到br-int上,br-int上對屬於vlan1的端口進行廣播。每個屬於vlan1端口的雲主機都收到了來自br-int的廣播,但是拆包發現目標IP不屬於自己的,都不響應,只有vm6發現目標IP是自己的才響應。
上訴過程就是雲主機跨物理網絡通信的流程。
雲主機跨vlan通信過程
如圖所示:
跨vlan的通信,必然涉及到路由設備。那么就說說雲主機跨vlan通信的過程。
vm1是屬於vlan1,vm2屬於vlan2上,vm1想要去和vm2通信,那么就要先判斷是不是在同一個網段內了。判斷兩個IP地址是不是在同一個網段,就將它們的IP地址分別與子網掩碼做與運算,得到的結果一網絡號,如果網絡號相同,就在同一子網,否則,不在同一子網。
1.當vm1計算后,發現vm2與自己不在同一個網段內,那么就把數據包發往自己的網關。流程為vm1-eth0 --> tap設備 --> linux網橋 --> veth對 --> br-int打上vlan標簽 --> br-ex vlan標簽轉換 --> 物理交換機轉發 --> Openstack 網絡節點(圖右邊那個)
2.openstack網絡節點收到包以后,br-ex轉換,br-int進行轉發到vlan1對應的虛擬路由器上,虛擬路由器由L3-agent虛擬出來的。虛擬路由器再把來自vm1的數據包轉發到vlan2網段內,然后原路返回到圖左中的Openstack計算節點。
3.計算節點收包后還是br-ex vlan轉換,br-int去vlan標簽后在vlan2中廣播目標IP為XXXX的。vm2收到廣播包后發現目標IP就是自己,那么進行響應。響應包原路返回。
即使在同一個計算節點上不同vlan的雲主機,他們通信也得經過Openstack網絡節點(neutron-agent)來實現跨vlan通信。
通過Openstack網絡節點與外網通信
Openstack網絡節點還是由Openswitch br-int,Openswith br-ex來做vlan的標簽轉發與打標簽。
右邊的網絡節點在openswitch上面是由L3-Agent虛擬出來的路由器實現三層轉發。由這個虛擬路由器轉發到物理交換機上,從而實現與外網的通信。
那總的說下虛擬機與外網通信的過程通過Openstack網絡節點:
雲主機發起一個到外網的請求,首先包通過tap設備映射轉發出去,然后到linux網橋,再到veth對上,到了openswitch br-int上,打上vlan的標簽,再轉發到openswitch br-ex上,把虛擬vlan標簽轉換成物理網絡可識別的vlan標簽。通過交換機到Openstack網絡節點上,網絡節點的openswitch br-ex進行轉換,由物理網絡的vlan標簽轉換到虛擬網絡的標簽,往openswitch br-int上,openswitch br-int對應一個路由設備(L3-agent提供),通過這個路由設備發往外網。
雲主機剛開始創建的時候,所分配的IP也是有DHCP-agent來分配的
說完了vlan模式,那我們總結下:
- vlan模式有上限的,最多支持4096個vlan,還包括系統保留的Vlan,我記得思科交換機就默認占用vlan1。
- MAC表爆滿。Openstack節點可以虛擬出很多台雲主機,如果每個雲主機都有2個MAC地址(對應2個網卡),那如果有5000個Openstack節點的時候,那么交換機的mac地址表那么得多大啊,甚至是溢出的表。
- 廣播風暴,vlan模式能夠很好的隔離大規模的廣播風暴。
- 基於IP地址的子網划分限制網絡規模。
GRE網絡模式
說完vlan,我們說說gre網絡模式。
gre網絡模式類似於vlan通過VPN一樣,通過gre-id來識別不同的網絡。我們先看看gre包的封裝(假設192.168.1.1 ping 192.168.2.1):
看其包封裝類型,其實很想ISCSI一樣,SCSI協議在外面封裝了一層IP協議,所以SCSI能夠在IP網絡通信了。gre也是一樣的原理。
下面看看gre通信過程:
我們就說說這個流程吧:
- 首先一台雲主機192.168.1.2去和192.168.1.3通信的話,由於不在同一節點上且跨了網段,那么就需要把包發給網關轉發到公網。
- 轉發到公網的之前,出口路由器會在這個報文的IP頭(此時源地址為雲主機192.168.1.2,目的IP是192.168.1.3)在封裝一層gre,在gre協議之上再次封裝一層源地址是左邊公網IP,目標地址右邊公網IP的IP層。隨后轉發出去。
- 右邊出口路由器收到后,發現IP地址是自己的,就拆包,然后發現是gre協議,那么就在對應的廣播域內廣播,尋找192.168.1.3的主機。
gre跨網段的封裝報文如下:
gre 在雲主機之間的通信過程:
流程圖如下:
- 左邊的br-tun是把來自雲主機的網絡包打上一層gre-tunnel-id(把vlan-id轉為gre-tunnel-id),然后再此之上,再封裝一層IP協議,這個源ip就是Openstack物理節點上的,目標IP就是另一個雲主機的宿主機的IP。
- 封裝完IP報文后再封裝其他的相關的網絡報文就轉發到交換機上,此時交換機到Openstack物理機上不走多個vlan了,所以可以使用access鏈路模式了。交換機接收到報文后可以直接轉發到對應的目標IP上。目標IP的Openstack節點收到包后,發現目標IP是自己的,便解開報文,露出gre-tunnel-id的報文,然后把gre-tunnel-id轉為對應的vlan-id后在對應的vlan進行廣播。
- 目標雲主機收到廣播后,便進行響應,回包流程也是一樣的。
那么總結下gre的網絡模式特點:
好處:
- gre是物理上的三層通信,虛擬機上的二層通信
- gre-id是2的24次方,因為是由24字節組成的。所以可以使用的id遠遠大於vlan
- 交換機只需要記錄Openstack物理機的MAC地址就行。
- 解決了子網划分的規模問題。無需考慮子網划分
壞處:
- 兩兩之間計算節點建立隧道。如果節點過多,那么建立的隧道量也特別多!
vxlan網絡模式
相比於GRE的通用性,VXLAN主要用於封裝、轉發2層報文。VXLAN全稱Virtual eXtensible Local Area Network,簡單的說就是擴充了的VLAN,其使得多個通過三層連接的網絡可以表現的和直接通過一台一台物理交換機連接配置而成的網絡一樣處在一個LAN中。其將二層報文加上個vxlan header,封裝在一個UDP包中進行傳輸。vxlan header會包括一個24位的ID(稱為VNI),含義類似於VLAN id或者上面提到的GRE的tunnel id。在上面GRE的例子中,是通過路由器來進行GRE協議的封裝和解封的,在VXLAN中這類封裝和解封的組件有個專有的名字叫做VTEP。相比起VLAN來說,好處在於其突破了VLAN只有4094子網的限制,同時架設在UDP協議上后其擴展性提高了不少(因為UDP是高層協議,屏蔽了底層的差異,換句話說屏蔽了二層的差異)。
封裝報文如下:
參考上面的圖文,可以得出總結:
- vxlan也是物理上的三層通信,虛擬上的二層通信。
- 封裝報文可以簡單理解為: 原始數據2層包+(1 vni-id ,2組播地址 )+udp報文+ip報文。
可以參考這篇博文:http://www.opencloudblog.com/?p=300
關於gre和vxlan二次封裝數據包的MTU問題
VXLAN 模式下虛擬機中的 mtu 最大值為1450,也就是只能小於1450,大於這個值會導致 openvswitch 傳輸分片,進而導致虛擬機中數據包數據重傳,從而導致網絡性能下降。GRE 模式下虛擬機 mtu 最大為1462。
計算方法如下:
- vxlan mtu = 1450 = 1500 – 20(ip頭) – 8(udp頭) – 8(vxlan頭) – 14(以太網頭)
- gre mtu = 1462 = 1500 – 20(ip頭) – 4(gre頭) – 14(以太網頭)
可以配置 Neutron DHCP 組件,讓虛擬機自動配置 mtu,
#/etc/neutron/dhcp_agent.ini
[DEFAULT]
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf#/etc/neutron/dnsmasq-neutron.conf
dhcp-option-force=26,1450或1462
重啟 DHCP Agent,讓虛擬機重新獲取 IP,然后使用 ifconfig 查看是否正確配置 mtu。
gre和vxlan的對比:
若br-tun之間兩兩點對點的連接,通信封包為GRE格式,那么這樣的網絡環境就是OVS-GRE網絡模式。同理,若br-tun之間跑三層網絡協議,封包方式為VXLAN格式,這樣的網絡環境就是OpenStack-Neutron-OVS-VXLAN網絡模式。對於GRE和VXLAN網絡模式而言,可以抽象地將每個br-tun看成隧道端點,有狀態的隧道點對點連接即為GRE;無狀態的隧道使用UDP協議連接則為VXLAN。
可以參考其他博文:http://www.sdnlab.com/11819.html
基礎工作要做好:
確保neutron用戶已經創建了,在linux-node1節點上查看:
[root@linux-node1 ~]# openstack user list #linux-node1節點上
+----------------------------------+---------+
| ID | Name |
+----------------------------------+---------+
| 00f8c9ca79f542d7b4a8e0582f2351b7 | glance |
| 1077bb04680840a688b62e10b0d58a7e | neutron | # neutron創建成功
| 1b24326bb39249bb9bec94f6fa63a12f | cinder |
| 54f2e8a7f28b42178692ae39f7ed9b37 | admin |
| 6895ff530fd24df08e289810fbce482b | demo |
| 8e4927503d1340a6aa3ca23bd91b08bf | nova |
+----------------------------------+---------+
這里選擇的是提供者網絡(Linuxbridge代理)模式,那么在linux-node1節點上操作。
[root@linux-node1 ~]# yum install openstack-neutron openstack-neutron-ml2 \
> openstack-neutron-linuxbridge ebtables
另一台機器計算節點也安裝Neutron網絡服務
[root@linux-node2 ~]# yum install openstack-neutron-linuxbridge ebtables ipset
配置控制節點:
1.首先更改數據庫配置
[root@linux-node1 ~]# vim /etc/neutron/neutron.conf
[database]
connection = mysql+pymysql://neutron:neutron@192.168.56.11/neutron
2.添加keystone認證:
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://192.168.56.11:5000
auth_url = http://192.168.56.11:35357
memcached_servers = 192.168.56.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
3.更改核心插件:
[DEFAULT]
# The core plugin Neutron will use (string value)
core_plugin = ml2
# The service plugins Neutron will use (list value)
service_plugins =
4.添加rabbitmq
[DEFAULT]
transport_url = rabbit://openstack:openstack@192.168.56.11 # 第530行
5.配置網絡服務來通知計算節點的網絡拓撲變化:
[DEFAULT]
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
[nova]
auth_url = http://192.168.56.11:35357
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = nova
password = nova
6.配置鎖路徑
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp # 在1135行左右
7.配置 Modular Layer 2 (ML2) 插件,ML2插件使用Linuxbridge機制來為實例創建layer-2虛擬網絡基礎設施.
[root@linux-node1 neutron]# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan #啟用flat和VLAN網絡,flat單一扁平網絡,指虛擬機和宿主機同一網絡。:
tenant_network_types = #禁用私有網絡:
mechanism_drivers = linuxbridge #啟用Linuxbridge機制:
extension_drivers = port_security # 啟用端口安全擴展驅動:
[ml2_type_flat]
flat_networks = public # 配置公共虛擬網絡為flat網絡:
[securitygroup]
enable_ipset = True # 啟用 ipset 增加安全組的方便性:
8.配置Linuxbridge代理,Linuxbridge代理為實例建立layer-2虛擬網絡並且處理安全組規則。
[root@linux-node1 neutron]# vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = public:eth0 #將公共虛擬網絡和公共物理網絡接口對應起來:
[vxlan]
enable_vxlan = False # 禁止VXLAN覆蓋網絡
[securitygroup]
enable_security_group = True # 啟用安全組並配置 Linux 橋接 iptables 防火牆驅動:
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
9.配置DHCP代理,這個DHCP代理提供了為虛擬網絡提供了DHCP服務
[root@linux-node1 neutron]# vim /etc/neutron/dhcp_agent.ini
[DEFAULT] # 配置Linuxbridge驅動接口,DHCP驅動並啟用隔離元數據,這樣在公共網絡上的實例就可以通過網絡來訪問元數據
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
10.配置元數據主機以及共享密碼(neutron和nova交互的密碼),還是還是/etc/neutron/metadata_agent.ini::
[DEFAULT]
nova_metadata_ip = 192.168.56.11 # 設置源數據服務器IP
metadata_proxy_shared_secret = oldboy # 設置IP
11.配置計算服務(nova服務)來使用網絡服務
[root@linux-node1 openrc]# vim /etc/nova/nova.conf
[neutron]
url = http://192.168.56.11:9696 # 9696是neutron的端口
auth_url = http://192.168.56.11:35357
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
service_metadata_proxy = True
metadata_proxy_shared_secret = oldboy # 要和上面元數據的共享密鑰一樣
12.做軟鏈接,網絡服務初始化腳本需要一個超鏈接/etc/neutron/plugin.ini 指向ML2插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini。如果超鏈接不存在,使用下面的命令創建它:
[root@linux-node1 ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
13.同步數據庫:
[root@linux-node1 ~]# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
''''''
OK # 最后一行顯示OK就說明同步成功了
14.重啟計算API 服務(only it)
[root@linux-node1 ~]# systemctl restart openstack-nova-api.service
15.設置開機啟動和啟動服務
# 設置開機啟動
[root@linux-node1 ~]# systemctl enable neutron-server.service \
> neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
> neutron-metadata-agent.service
# 啟動服務
[root@linux-node1 ~]# systemctl start neutron-server.service \
> neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
> neutron-metadata-agent.service
16.創建neutron服務實體:
[root@linux-node1 ~]# source admin_openrc # 一定要先source下它
[root@linux-node1 ~]# openstack service create --name neutron \
> --description "OpenStack Networking" network
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Networking |
| enabled | True |
| id | f0fb0c7015794d829e3f6d06a1dc8332 |
| name | neutron |
| type | network |
+-------------+----------------------------------+
17.創建網絡服務API端點:
[root@linux-node1 ~]# openstack endpoint create --region RegionOne network public http://192.168.56.11:9696
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 8c9da83c56504bd799b2b6436e460fe1 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | f0fb0c7015794d829e3f6d06a1dc8332 |
| service_name | neutron |
| service_type | network |
| url | http://192.168.56.11:9696 |
+--------------+----------------------------------+
[root@linux-node1 ~]# openstack endpoint create --region RegionOne network internal http://192.168.56.11:9696
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | ad84ba8453764b6cb17183a83079ffbc |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | f0fb0c7015794d829e3f6d06a1dc8332 |
| service_name | neutron |
| service_type | network |
| url | http://192.168.56.11:9696 |
+--------------+----------------------------------+
[root@linux-node1 ~]# openstack endpoint create --region RegionOne network admin http://192.168.56.11:9696
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 0182dfcc97db4ff9a9bc0eec461026a3 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | f0fb0c7015794d829e3f6d06a1dc8332 |
| service_name | neutron |
| service_type | network |
| url | http://192.168.56.11:9696 |
+--------------+----------------------------------+
[root@linux-node1 neutron]# openstack endpoint list |grep network # 執行這個命令查看下,出現下面三行說明添加成功哇
| 0182dfcc97db4ff9a9bc0eec461026a3 | RegionOne | neutron | network | True | admin | http://192.168.56.11:9696 |
| 8c9da83c56504bd799b2b6436e460fe1 | RegionOne | neutron | network | True | public | http://192.168.56.11:9696 |
| ad84ba8453764b6cb17183a83079ffbc | RegionOne | neutron | network | True | internal | http://192.168.56.11:9696 |
18.驗證控制節點neutron是否正常運行
[root@linux-node1 neutron]# neutron agent-list
+---------------------------+--------------------+-------------------------+-------------------+-------+----------------+---------------------------+
| id | agent_type | host | availability_zone | alive | admin_state_up | binary |
+---------------------------+--------------------+-------------------------+-------------------+-------+----------------+---------------------------+
| 362514ce-28a8-4847-98f5-c | Metadata agent | linux-node1.example.com | | :-) | True | neutron-metadata-agent |
| ea08fac88df | | | | | | |
| a2c0dcd0-33a4-40b9-a8ea- | DHCP agent | linux-node1.example.com | nova | :-) | True | neutron-dhcp-agent |
| efb09fcb952d | | | | | | |
| a98b616a-aae8-4c48-939d- | Linux bridge agent | linux-node1.example.com | | :-) | True | neutron-linuxbridge-agent |
| 60506edfe2f7 | | | | | | |
+---------------------------+--------------------+-------------------------+-------------------+-------+----------------+---------------------------+
上面alive列出現三個 😃 說明運行正常。。。
計算節點的配置(linux-node2)
1.安裝軟件:
[root@linux-node2 ~]# yum install openstack-neutron-linuxbridge ebtables ipset
2.修改neutron配置文件:
[root@linux-node2 ~]# vim /etc/neutron/neutron.conf
[DEFAULT]
auth_strategy = keystone # 認真方式
transport_url = rabbit://openstack:openstack@192.168.56.11 # rabbitmq消息隊列訪問方式
[keystone_authtoken]
auth_uri = http://192.168.56.11:5000
auth_url = http://192.168.56.11:35357
memcached_servers = 192.168.56.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
3.選擇提供者網絡服務模式之配置Linuxbridge代理
[root@linux-node2 ~]# vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge] # 將公共虛擬網絡和公共物理網絡接口對應起來:
physical_interface_mappings = public:eth0
[securitygroup] # 啟用安全組並配置 Linux 橋接 iptables 防火牆驅動:
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan] # 禁止VXLAN覆蓋網絡:
enable_vxlan = False
4.配置計算服務來使用網絡服務
[root@linux-node2 ~]# vim /etc/nova/nova.conf
[neutron]
url = http://192.168.56.11:9696 # 控制節點的url
auth_url = http://192.168.56.11:35357
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
5.重啟nova服務
[root@linux-node2 ~]# systemctl restart openstack-nova-compute.service
6.啟動Neutron服務
[root@linux-node2 ~]# systemctl enable neutron-linuxbridge-agent.service
[root@linux-node2 ~]# systemctl start neutron-linuxbridge-agent.service
7.到控制節點上查看neutron agent-list
[root@linux-node1 openrc]# neutron agent-list
+-------------------+-------------------+-------------------+-------------------+-------+----------------+--------------------+
| id | agent_type | host | availability_zone | alive | admin_state_up | binary |
+-------------------+-------------------+-------------------+-------------------+-------+----------------+--------------------+
| 52ead3f3-0a93-4f3 | DHCP agent | linux- | nova | :-) | True | neutron-dhcp-agent |
| 7-9488-264bd609eb | | node1.example.com | | | | |
| 84 | | | | | | |
| 8bfa50c7-07ec-403 | Metadata agent | linux- | | :-) | True | neutron-metadata- |
| 7-a4c9-c3f8172b3f | | node1.example.com | | | | agent |
| c3 | | | | | | |
| e6b57824-16e5-4e8 | Linux bridge | linux- | | :-) | True | neutron- |
| 1-b6f4-4af01bddfa | agent | node2.example.com | | | | linuxbridge-agent |
| 59 | | | | | | |
| e6ee0b7b-7e05-4e0 | Linux bridge | linux- | | :-) | True | neutron- |
| 5-9732-2ad00d8c9d | agent | node1.example.com | | | | linuxbridge-agent |
| ea | | | | | | |
+-------------------+-------------------+-------------------+-------------------+-------+----------------+--------------------+
[root@linux-node1 openrc]# nova service-list
+----+------------------+-------------------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+----+------------------+-------------------------+----------+---------+-------+----------------------------+-----------------+
| 1 | nova-conductor | linux-node1.example.com | internal | enabled | up | 2017-01-29T09:04:01.000000 | - |
| 3 | nova-consoleauth | linux-node1.example.com | internal | enabled | up | 2017-01-29T09:04:07.000000 | - |
| 4 | nova-scheduler | linux-node1.example.com | internal | enabled | up | 2017-01-29T09:04:07.000000 | - |
| 7 | nova-compute | linux-node2.example.com | nova | enabled | up | 2017-01-29T09:04:01.000000 | - |
+----+------------------+-------------------------+----------+---------+-------+----------------------------+-----------------
如果能夠看到linux-node2節點,那么說明linux-node2節點的neutron已經加入到網絡集群服務中了,已經被控制節點所識別了。
盡管看到了linux-node2在上面,那么我們還需要關注網絡節點的狀態,新添加到集群中的linux-node2節點狀態在neutron agent-list
的alive列必須是:-),在nova service-list
的status下必須是enabled。
創建虛擬機
首先在linux-node1檢測下環境是否正常:
端口狀態:
- 11211: memcached
- 9292/9191: glance
- 15672: rabbitmq web 界面
- 6080: novnc proxy
- 8774、8775:nova界面
- 5000 : keystone
- 35357: keystone admin
- 9696: neutron
[root@linux-node1 openrc]# openstack image list
[root@linux-node1 openrc]# neutron agent-list
[root@linux-node1 openrc]# nova service-list
創建虛擬機
我們可以參考官網:http://docs.openstack.org/newton/install-guide-rdo/launch-instance.html
創建網絡的時候我們選擇提供者網絡,
1.先預定義環境變量
[root@linux-node1 openrc]# source admin_openrc
2.創建網絡
這里需要注意的是,public這個是我們在前面定義好的名字,所以必須使用這個名字創建,定義使用public的配置文件如下:
# ml2_conf.ini 文件
[root@linux-node1 neutron]# grep flat_networks /etc/neutron/plugins/ml2/ml2_conf.ini
flat_networks = public
# linuxbridge_agent.ini 文件
[root@linux-node1 neutron]# grep physical_interface /etc/neutron/plugins/ml2/linuxbridge_agent.ini
physical_interface_mappings = public:eth0
了解之后,我們下面使用public這個名字來創建網絡
[root@linux-node1 openrc]# openstack network create --share --provider-physical-network public --provider-network-type flat public # –share選項允許所有項目使用虛擬網絡,provider是網絡名稱
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2017-01-29T13:32:07Z |
| description | |
| headers | |
| id | 5f693f46-8f51-47be-a04a-d3ddf7bb2899 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| mtu | 1500 |
| name | public |
| port_security_enabled | True |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| provider:network_type | flat |
| provider:physical_network | public |
| provider:segmentation_id | None |
| revision_number | 3 |
| router:external | Internal |
| shared | True |
| status | ACTIVE |
| subnets | |
| tags | [] |
| updated_at | 2017-01-29T13:32:08Z |
+---------------------------+--------------------------------------+
[root@linux-node1 openrc]# neutron net-list # 通過這個命令來查看剛才創建的
+--------------------------------------+--------+------------------------------------------------------+
| id | name | subnets |
+--------------------------------------+--------+------------------------------------------------------+
| 5f6c17a9-9bb8-4eb9-9318-d4a2dbd56742 | public | |
+--------------------------------------+--------+------------------------------------------------------+
3.創建子網:
provider是之前創建好的網絡
[root@linux-node1 neutron]# openstack subnet create --network public \
> --allocation-pool start=192.168.56.100,end=192.168.56.200 \
> --dns-nameserver 192.168.56.2 --gateway 192.168.56.2 \
> --subnet-range 192.168.56.0/24 public-subnet
參數解釋:
- --allocation-pool,IP地址池 start=地址段開始,end=地址段結束
- --dns-nameserver DNS地址設置
- --gateway 公共網絡的網關
- --subnet-range 網段/子網掩碼
- public-subnet 子網名稱,自定義
創建后查看創建的子網:
[root@linux-node1 neutron]# neutron subnet-list
+--------------------------------------+-----------------+-----------------+------------------------------------------+
| id | name | cidr | allocation_pools |
+--------------------------------------+-----------------+-----------------+------------------------------------------+
| e485ee35-d9bd-454f-bf08-4b829a710a92 | provider-subnet | 192.168.56.0/24 | {"start": "192.168.56.100", "end": |
| | | | "192.168.56.200"} |
+--------------------------------------+-----------------+-----------------+------------------------------------------+
4.創建雲主機
[root@linux-node1 openrc]# openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
[root@linux-node1 openrc]# openstack flavor list # 創建之后,可以通過這個命令來查看
5.生出和添加密鑰對
我們可以為雲主機添加一個密鑰對,這樣登陸雲主機的時候就不需要輸入密碼而可以直接登陸。
[root@linux-node1 openrc]# source demo_openrc
[root@linux-node1 openrc]# ssh-keygen -q -N ""
[root@linux-node1 openrc]# openstack keypair create --public-key /root/.ssh/id_rsa.pub mykey # 上傳公鑰對
+-------------+-------------------------------------------------+
| Field | Value |
+-------------+-------------------------------------------------+
| fingerprint | 62:af:4b:08:07:44:4c:c5:0b:85:fc:ae:6b:2c:c0:12 |
| name | mykey |
| user_id | f2e73b752b73445b9c2aedd63ce372c5 |
+-------------+-------------------------------------------------+
[root@linux-node1 openrc]# openstack keypair list # 檢測剛才上傳的key
+-------+-------------------------------------------------+
| Name | Fingerprint |
+-------+-------------------------------------------------+
| mykey | 62:af:4b:08:07:44:4c:c5:0b:85:fc:ae:6b:2c:c0:12 |
+-------+-------------------------------------------------+
6.增加安全組規則
默認情況下,網絡安全規則是對所有雲主機拒絕遠程訪問,所以我們應該放開SSH和ICMP來。
允許ICMP來訪
[root@linux-node1 openrc]# openstack security group rule create --proto icmp default
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| created_at | 2017-01-29T12:49:34Z |
| description | |
| direction | ingress |
| ethertype | IPv4 |
| headers | |
| id | cd8c6822-077e-4194-994b-9c663c4f8e2a |
| port_range_max | None |
| port_range_min | None |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| protocol | icmp |
| remote_group_id | None |
| remote_ip_prefix | 0.0.0.0/0 |
| revision_number | 1 |
| security_group_id | 4b72eaf7-69d7-466d-8fbf-9e1d73d1557c |
| updated_at | 2017-01-29T12:49:34Z |
+-------------------+--------------------------------------+
允許SSH來訪
[root@linux-node1 openrc]# openstack security group rule create --proto tcp --dst-port 22 default
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| created_at | 2017-01-29T12:50:55Z |
| description | |
| direction | ingress |
| ethertype | IPv4 |
| headers | |
| id | 3584e1ee-7a85-4fa2-95f5-398755da1f2c |
| port_range_max | 22 |
| port_range_min | 22 |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| protocol | tcp |
| remote_group_id | None |
| remote_ip_prefix | 0.0.0.0/0 |
| revision_number | 1 |
| security_group_id | 4b72eaf7-69d7-466d-8fbf-9e1d73d1557c |
| updated_at | 2017-01-29T12:50:55Z |
+-------------------+--------------------------------------+
7.查看當前資源:
啟動雲主機之前,我們可以查看下當前openstack的資源。
[root@linux-node1 openrc]# openstack network list
+--------------------------------------+--------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+--------+--------------------------------------+
| 5f693f46-8f51-47be-a04a-d3ddf7bb2899 | public | a15e0cf4-e456-4047-8793-ed366dce5087 |
+--------------------------------------+--------+--------------------------------------+
[root@linux-node1 openrc]# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 44205d84-d281-4966-acdf-0c87e19a4e53 | cirros | active |
+--------------------------------------+--------+--------+
[root@linux-node1 openrc]# openstack flavor list
+----+---------+-----+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+---------+-----+------+-----------+-------+-----------+
| 0 | m1.nano | 64 | 1 | 0 | 1 | True |
+----+---------+-----+------+-----------+-------+-----------+
[root@linux-node1 openrc]# openstack security group list
+--------------------------------------+---------+-------------+----------------------------------+
| ID | Name | Description | Project |
+--------------------------------------+---------+-------------+----------------------------------+
| 4b72eaf7-69d7-466d-8fbf-9e1d73d1557c | default | 缺省安全組 | c64cfb30d0cd4e04bdc40330b7d9403a |
+--------------------------------------+---------+-------------+----------------------------------+
8.啟動雲主機
net-id 這個是使用我們剛才創建的network-id(通過openstack network list 查看)號
[root@linux-node1 openrc]# openstack server create --flavor m1.nano --image cirros \
> --nic net-id=5f693f46-8f51-47be-a04a-d3ddf7bb2899 --security-group default \
> --key-name mykey demo-instance
+--------------------------------------+-----------------------------------------------+
| Field | Value |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-SRV-ATTR:host | None |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
| OS-EXT-SRV-ATTR:instance_name | |
| OS-EXT-STS:power_state | NOSTATE |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | zzdrSpTe4sVL |
| config_drive | |
| created | 2017-01-29T13:02:52Z |
| flavor | m1.nano (0) |
| hostId | |
| id | 2faa8089-cf2a-4b64-aaa3-74e8830ea82e |
| image | cirros (44205d84-d281-4966-acdf-0c87e19a4e53) |
| key_name | mykey |
| name | demo-instance |
| os-extended-volumes:volumes_attached | [] |
| progress | 0 |
| project_id | c64cfb30d0cd4e04bdc40330b7d9403a |
| properties | |
| security_groups | [{u'name': u'default'}] |
| status | BUILD |
| updated | 2017-01-29T13:02:54Z |
| user_id | f2e73b752b73445b9c2aedd63ce372c5 |
+--------------------------------------+-----------------------------------------------+
[root@linux-node1 openrc]# openstack server list # 可以通過這個命令來查看雲主機狀態
+--------------------------------------+---------------+--------+-------------------------+------------+
| ID | Name | Status | Networks | Image Name |
+--------------------------------------+---------------+--------+-------------------------+------------+
| 2faa8089-cf2a-4b64-aaa3-74e8830ea82e | demo-instance | ACTIVE | provider=192.168.56.102 | cirros |
+--------------------------------------+---------------+--------+-------------------------+------------+
9.連接雲主機
- 我們通過web界面來連接VNC,所以先要獲取URL
[root@linux-node1 nova]# openstack console url show demo-instance
+-------+------------------------------------------------------------------------------------+
| Field | Value |
+-------+------------------------------------------------------------------------------------+
| type | novnc |
| url | http://192.168.56.11:6080/vnc_auto.html?token=f7f4fe14-0428-4977-a78a-905a97dac076 |
+-------+------------------------------------------------------------------------------------+
我們摘取出URL出來,放在瀏覽器直接訪問即可。
- 通過ssh連接
[root@linux-node1 ~]# openstack server list
+--------------------------------------+---------------+--------+-----------------------+------------+
| ID | Name | Status | Networks | Image Name |
+--------------------------------------+---------------+--------+-----------------------+------------+
| 77c5e4a3-fdc5-43c9-baf8-10ff3eaf904b | demo-instance | ACTIVE | public=192.168.56.105 | cirros |
+--------------------------------------+---------------+--------+-----------------------+------------+
[root@linux-node1 ~]# ssh cirros@192.168.56.105 # 由於剛才把公鑰給提交上去了,所以這里的話不需要輸入密碼,ssh直接可以連接過去了。