1. 程式人生 > >多主機Docker容器的VLAN劃分

多主機Docker容器的VLAN劃分

targe spa ice -1 osc 接受 fail 調整 inf

原文發表於cu2016-06-06

參考文檔:

  1. Docker網絡的4種模式,pipework/ovs的簡單使用等:http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice
  2. Dockerpool全文檔:https://yeasy.gitbooks.io/docker_practice/content/index.html
  3. Ovs完全使用手冊:http://my.oschina.net/tantexian/blog/648965?fromerr=C7Pp6sMs

ovs相對linux自身的brctl

工具(yum install -y bridge-utils)功能上豐富許多,如vlan功能與分布式功能。

本文主要驗證利用ovsvlan功能實現跨主機的容器隔離與通信。

一.前置條件

1. 拓撲圖

技術分享

2. 環境說明

    1. Host1/2VMware ESXi中的vm host,安裝CentOS-7-x86_64-1511系統;
    2. 在宿主機Host1/2上各創建兩個Container,為Container創建eth1端口;
    3. Containereth1端口連接到ovs網橋,ovs網橋對接container的端口分別劃分到vlan10/20
    4. 宿主機Host1/2的網卡ens192分別橋接到各宿主機內部的
      ovs網橋;
    5. 宿主機Host1/2的網卡ens192需要設置成混雜模式,並且對接的交換機端口設置為trunk端口。
    6. 網橋需要安裝bridge-utils包;
    7. 常規情況下,加入bridge網絡的宿主機網卡自動進入promiscuous mode,並進入forwarding state (可以使用dmesg查看);但如果宿主機是vm,需要註意調整宿主機的網卡為promiscuous mode,調整"偽傳輸"模式為"接受",對接虛擬網橋的端口為trunk端口。如VMware ESXi默認拒絕接受混雜模式下的數據包並且不對數據包打tag;偽傳輸"模式默認為"拒絕"表示出站數據的源mac地址不同於
      .vmx文件中的源mac地址時,vswitch會丟棄該出站數據;"mac地址更改"模式默認為"拒絕"表示vm在操作系統層面將網卡的mac地址更改為不同於.vmx配置文件中的mac地址時,丟棄所有入站數據。

3. pipework

#pipework本質是一個shell腳本實現,相對docker自身比較薄弱的網絡配置處理方式,其可以方便地對docker網絡進行配置。
[[email protected] ~]# cd /usr/local/
[[email protected] local]# git clone https://github.com/jpetazzo/pipework

#可以使用軟連接,復制,或增加環境變量的多種方式將pipework設為可執行命令
[[email protected] local]# ln -s /usr/local/pipework/pipework /usr/local/bin/ 

一.多主機Docker容器的vlan劃分

以下操作沒有特別說明,都表示在Host1上操作,Host2按照Host1操作微調即可。

1. 啟動容器

#在Host1/2下啟動容器test1/2/3/4;
#"--net=none"設置容器啟動不帶網絡,由後期自定義,關於容器網絡的模式請參考鏈接文檔1
[[email protected] ~]# docker run -itd --net=none --name test1 centoswithssh
[[email protected] ~]# docker run -itd --net=none --name test2 centoswithssh
[[email protected] ~]# docker ps

技術分享

2. 為容器配置網絡

#用pipework添加ovs0網橋,test1網絡劃分到vlan10,test2網絡劃分到vlan20;
#pipework本質是采用shell腳本簡化了ovs的操作,pipework及ovs的具體操作請參考鏈接文檔3;
#這裏並沒有為ovs0網橋設置管理ip,可以根據需要設置,請參考鏈接1。
[[email protected] ~]# pipework ovs0 test1 192.168.1.11/24 @10
[[email protected] ~]# pipework ovs0 test2 192.168.1.12/24 @20

[[email protected] ~]# ovs-vsctl show
[[email protected] ~]# docker exec -it test1 ifconfig

技術分享

技術分享

3. 為網橋添加宿主機網卡

#Host1與Host2中的容器需要通信,需要把兩邊的網絡打通,即將宿主機網卡添加到虛擬網橋中
[[email protected] ~]# ovs-vsctl add-port ovs0 ens192
[[email protected] ~]# ovs-vsctl show

4. 驗證

[[email protected] ~]# docker exec -it test1 ping 192.168.1.12
[[email protected] ~]# docker exec -it test1 ping 192.168.1.13
[[email protected] ~]# docker exec -it test1 ping 192.168.1.14
[[email protected] ~]# docker exec -it test2 ping 192.168.1.13
[[email protected] ~]# docker exec -it test2 ping 192.168.1.14

預期:

  1. test1 ping test2: fail
  2. test1 ping test3: success
  3. test1 ping test4: fail
  4. test2 ping test3: fail
  5. test2 ping test4: success

根據驗證結果顯示,結果符合預期,請見截圖:

技術分享

技術分享

多主機Docker容器的VLAN劃分