之前介紹過Docker透過Linux Namespace方式銜接實體網路取得外部對應IP位址的方式,也談到同一主機內透過預設的docker0主系統橋接介面可以進行互連,接著進行網路設定。本文將接力介紹Docker容器的進階管理技巧,包括不同主機之間Docker容器隔離獨立網路互連,以及如何限制Docker容器使用資源。
下載這個套件檔案之後,使用「yum localinstall openvswitch-2.3.1-2.el7.x86_64.rpm」指令就可以將Open vSwitch安裝到系統內。然後使用「systemctl start openvswitch」指令,便可以啟動Open vSwitch,圖9所示為啟動Open vSwitch後系統的狀況。
|
▲圖9 Open vSwitch啟動後的系統資訊。 |
從中可以看到除了Open vSwitch本身伺服器ovs-vswitchd之外,Open vSwitch還有一個ovsdb-server在執行,這是Open vSwitch的資料庫伺服器,負責提供相關網路設定的存取。如果希望Open vSwitch一開機便自動啟動,則執行「systemctl enable openvswitch」指令。
不同主機之間Docker容器隔離獨立網路互連—使用Open vSwitch GRE/VxLAN技術
安裝好Open vSwich之後,開始介紹使用GRE技術及VxLAN技術來連通容器,GRE全名為Generic Routing Encapsulation的縮寫,GRE是思科(Cisco)開發出來的網路通道(Tunneling)技術,可以跨Internet建立虛擬的點對點網路來封裝各種網路協定讓兩邊區域網路可以互通,GRE最常應用在虛擬私人網路(Virtual Private Network,VPN)中。
不過,GRE無法處理Multicast與IPv6,因此另有專為網路虛擬化設計的VxLAN誕生了。
VxLAN的全稱是Virtual Extensible LAN,VxLAN原本是由VMware、Arista Networks及Cisco所發起開發的網路虛擬化(Network Virtualization)技術,用來改良在大型雲端運算部署時所會遇到的延展性(Scalability)擴充問題。
後續又有許多大廠如Broadcom、Citrix、Dell、Red Hat、Juniper Network背書。Linux在Kernel 3.7開始支援VxLAN,Open vSwitch則從1.10就開始支援。
首先透過GRE將不同主機的Docker容器連接起來,使用「ovs-vsctl add-br ovsbr0」指令新增一個Open vSwitch的橋接器設備,這個橋接器跟前面用iproute2所建的橋接器設備類似,只是iproute2所建的是Linux Kernel內建的橋接機制,而現在這個是Open vSwitch交換器軟體所建置的。建置之後,可使用「ovs-vsctl show」指令檢視目前橋接器的配置,如圖10所示。
|
▲圖10 使用Open vSwitch建立的橋接設備ovsbr0。 |
也可以使用「ip link show」指令進行檢視,從圖11中還可以看到另有一個Open vSwitch建立的設備ove-system。
|
▲圖11 使用「ip link show」指令檢視Open vSwitch建立的橋接設備ovsbr0。 |
接著,使用底下的指令為主機網路卡指定一個對外的IP位址:
這裡將兩主機上的enp0s3分別配置10.1.2.10及10.1.2.11的IP位址,設定好IP位址之後,使用ping指令確定設定的位址可以讓兩台主機透過enp0s3網路卡來連通。
接著使用「ovs-vsctl add-port ovsbr0 vethh0」指令將容器對應到主機的vethh0設備加到Open vSwitch的橋接設備ovsbr0中,添加完成之後,可以使用「ovs-vsctl show」指令檢視一下設定狀況,如圖12所示。
|
▲圖12 使用「ovs-vsctl show」指令檢視Open VSwitch設定狀況。 |
然後,在兩台主機上分別執行下列指令:
其中,remote_ip部分不是主機本身剛設定的IP位址,而是另一台欲連線主機的IP位址,因此如果是在10.1.2.11的主機上執行這個指令,那麼指令後面remoteip所指定的IP位址就是10.1.2.10。
也就是說,只要是欲相互連通的主機,均須執行建立這個GRE通道的指令,而gre0是這個建立的通道interface名稱,不同主機也需有不同名稱對應,譬如gre1、gre2、gre3等等。
最後,如果在CentOS 7中有開啟防火牆(Firewall),請使用「systemctl stop firewalld」指令停止Firewall的運作,並確定Firewall沒有運作。或是採用下面兩行指令,讓iptables打開GRE的連線:
在CentOS 7中,可以使用底下的指令讓firewalld打開GRE的連線:
打開GRE連線後,應該就可以在容器中以ping測試到容器中設定的192.168.56.21及192.168.56.22已經可以相互連通。
若是GRE要換成VxLAN,則建立VxLAN的指令與建立GRE類似,內容如下:
可以看出,最主要的差別只是type換成了vxlan而已,而設備名稱只是為了比較貼近改用VxLan,因此改名為vx0。
另外,VxLAN使用的是以UDP為基礎的協定,埠號是8472,因此防火牆也要配合打開,如果是在CentOS 7內用底下這兩個指令,便可打開firewalld的設定: