1. 程式人生 > >十、Docker網路以及跨宿主機通訊

十、Docker網路以及跨宿主機通訊

講在前面:
1.目前實現的是單機部署,如何建立映象,管理映象;如何建立容器,管理容器;如何快速建立docker虛擬主機machine,如何快速部署多元件專案compose以及如何跨宿主機建立叢集swarm。
2.docker單機通訊是docker0橋接eth0,那麼跨主機如何使得不同的eth0之間以及docker0之間實現通訊呢? 這就是這兒要學習的地方了。

再給自己科普一下基礎的網路原理
二層交換技術:工作在OSI七層網路模型的第二層,通過MAC地址進行幀轉發。
三層交換技術:也稱為IP交換技術,工作在OSI七層網路模型的第三層,通過IP地址進行包轉發。它解決了區域網中網段劃
分之後,網段中子網必須依賴路由器進行管理的局面。
網橋(Bridge):工作在OSI七層網路模型的第二層,根據MAC地址轉發,類似於二層交換機。Linux網橋將不同的網路介面
連線起來,連線的網路介面可以來自不同的區域網,網橋決定了接收的資料包是轉發給同一個區域網內主機還是別的網路上。 VLAN( Virtual Local Area Network,虛擬區域網):在物理網路(通常路由器介面)基礎上建立一個或多個邏輯子網, 將一個大的廣播域切分若干小的廣播域。一個VLAN就是一個廣播域,VLAN之間通訊通過三層路由器來完成

容器跨主機通訊主流方案:
Docker Overlay
Docker Macvlan
Weave
OpenvSwitch
這裡我們依次做下實驗,然後看看架構圖,最後比較一下各種方案的優劣。

一、overlay(VXLAN NVGRE STT)
Overlay Network:覆蓋網路,在基礎網路上疊加的一種虛擬網路技術模式,該網路中的主機通過虛擬鏈路連線起來。 Overlay網路有以下三種實現方式:
VXLAN(Virtual Extensible Local Area Network,虛擬可擴充套件區域網),通過將物理伺服器或虛擬機發出的資料包封裝 到UDP中,並使用物理網路的IP/MAC作為外層報文頭進行封裝,然後在IP網路上傳輸,到達目的地後由隧道端點解封裝並將 資料傳送給目標物理伺服器或虛擬機器,擴充套件了大規模虛擬機器網路通訊。
由於VLAN Header頭部限制長度是12bit,導致只能分配4095個VLAN,也就是4095個網段,在大規模虛擬網路。VXLAN標準定 義Header限制長度24bit,可以支援1600萬個VLAN,滿足大規模虛擬機器網路需求。

VXLAN有以下核心技術組成:
就可基於三層 基礎網路建立二層虛擬化網路。
VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端點):封裝在NVE中,用於VXLAN報文的封裝和解封裝。
VNI(VXLAN Network Identifier,VXLAN網路標識ID):類似於VLAN ID,用於區分VXLAN段,不同的VXLAN段不能直接二層 網路通訊。

所以docker是如何基於overlay實現的跨主機通訊呢?
先決條件1:
VTEP作為隧道端點 分別在不同的宿主機上處理eth0來的請求,並且轉發到不同的容器
先決條件2:
VXLAN在不同宿主機之間建立tunnel網路(這裡實現報文封裝,通過IP實現傳輸),傳送udp報文到VTEP(報文解密),實現通訊。

另外兩種覆蓋網路簡介一下:
NVGRE(Network Virtual using Generic Routing Encapsulation,使用GRE虛擬網路):與VXLAN不同的是,NVGRE沒有采 用標準傳輸協議(TCP/UDP),而是藉助通用路由封裝協議(GRE)。採用24bit標識二層網路分段,與VXLAN一樣可以支援 1600萬個虛擬網路。
STT(Stateless Transport Tunneling,無狀態傳輸隧道):模擬TCP資料格式進行封裝,改造了TCP傳輸機制,不維護TCP 狀態資訊。

二、Docker主機之間容器通訊解決方案
橋接宿主機網路(建網橋)
埠對映(暴露埠 iptables轉發)
Docker網路驅動
- Overlay:基於VXLAN封裝實現Docker原生Overlay網路
- Macvlan:Docker主機網絡卡介面邏輯上分為多個子介面,每個子介面標識一個VLAN。容器介面直接連線Docker主機 網絡卡介面,通過路由策略轉發到另一臺Docker主機
第三方網路專案
隧道方案
-Flannel:支援UDP、VXLAN、Host-gw和AWS-VPC四種工作模式
-Weave:支援UDP(sleeve模式)和VXLAN(優先fastdp模式)
-OpenvSwitch:支援VXLAN和GRE協議
路由方案
- Calico:支援BGP協議和IPIP隧道。每臺宿住主機作為虛擬路由,通過BGP協議實現不同主機容器間通訊

三、實踐一波
test1.consul的實驗

Docker通過overlay網路驅動程式支援多主機容器網路通訊。 要想使用Docker原生Overlay網路,需要滿足以下任意條件:
Docker執行在Swarm模式
使用鍵值儲存的Docker主機叢集

我們這裡演示第二種,需要滿足以下條件:
1.叢集中主機連線到鍵值儲存,Docker支援Consul、Etcd和Zookeeper;
2.叢集中主機執行一個Docker守護程序;
3.叢集中主機必須具有唯一的主機名,因為鍵值儲存使用主機名來標識叢集成員;
4.叢集中Linux主機核心版本3.12+,支援VXLAN資料包處理,否則可能無法通訊。

節點1/鍵值儲存:192.168.101.200
節點2/擴充套件節點:192.168.101.201

下載並且安裝consul
# wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip
# unzip consul_0.9.2_linux_amd64.zip 
# mv consul /usr/bin/consul && chmod +x /usr/bin/consul

Server1 server

mkdir /opt/d_c
nohup consul agent -server -bootstrap -data-dir /opt/d_c -bind=192.168.101.200 &

Server2 agent

mkdir /opt/d_c
nohup consul agent -data-dir /opt/d_c -bind=192.168.81.59 &
加入server 
consul join 192.168.101.200
.節點配置節點201的守護程序連線Consul
# vi /lib/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul:// 192.168.101.200:8500 --cluster-advertise 192.168.101.200:2375 使得重啟的時候能找到consul的服務端
# systemctl restart docker

檢視Docker網路內的成員
consul members list

Server1:
docker run -d --net=multihost --name=web1 nginx
docker exec -it web1 /bin/bash
Server2:
docker run -d --net=multihost --name=web2 nginx
docker exec -it web2 /bin/bash

ping web1
ping web2

建立指定靜態IP的network
docker network create -d overlay --ip-range=192.168.2.0/24 --gateway=192.168.2.1 --subnet=192.168.2.0/24 multihost2

工作原理圖

test2.macvlan
Macvlan Bridge模式:
1.建立macvlan網路
docker network create -d macvlan –subnet=172.100.1.0/24 –gateway=172.100.1.1 -o parent=eth0 macvlan_net
2.測試互通
macvlan-01# docker run -it –net macvlan_net –ip=172.100.1.10 busybox
macvlan-02# docker run -it –net macvlan_net –ip=172.100.1.11 busybox ping 172.100.1.10
Macvlan VLAN Bridge模式:
1.建立一個VLAN,VLAN ID 50
ip link add link eth0 name eth0.50 type vlan id 50
2.建立Macvlan網路
docker network create -d macvlan –subnet=172.18.50.0/24 –gateway=172.18.50.1 -o parent=eth0.50 macvlan_net50
3.測試互通
macvlan-01# docker run -it –net macvlan_net50 –ip=172.18.50.10 busybox
macvlan-02# docker run -it –net macvlan_net50 –ip=172.18.50.11 busybox ping 172.18.50.10

test3.Weave

Weave優點

1)支援主機間通訊加密;

2)支援container動態加入或者剝離網路;

3)支援跨主機多子網通訊。

缺點

1)不支援服務發現,主機不能動態加入節點網路;

2)只能通過weave launch或者weave connect加入weave網路。

Weave是由Zett.io公司開發的,它能夠建立一個虛擬網路,用於連線部署在多臺主機上的Docker容器,這樣容器就像被接入了同一個網路交換機,那些使用網路的應用程式不必去配置埠對映和連結等資訊。外部裝置能夠訪問Weave網路上的應用程式容器所提供的服務,同時已有的內部系統也能夠暴露到應用程式容器上。Weave能夠穿透防火牆並執行在部分連線的網路上,另外,Weave的通訊支援加密,所以使用者可以從一個不受信任的網路連線到主機。
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

簡單使用

準備
1. host1: 10.0.2.6
2. host2: 10.0.2.8
3. host1上的應用容器1: 192.168.0.2/24 host1上的應用容器2: 192.168.1.2/24
4. host2上的應用容器1: 192.168.0.3/24
兩臺機上均安裝Docker及Weave,並均啟動好Weave路由容器。

在兩臺機上均啟動一個應用容器。可以直接使用weave run命令,也可以先使用docker run啟動好容器,然後使用weave attach命令給容器繫結IP地址。

# weave run 192.168.0.2/24 -itd ubuntu bash

或者

# docker run -itd ubuntu bash
# weave attach 192.168.0.2/24 $ID

此時發現兩個容器之間是不通的,需要使用weave connect命令在兩臺weave的路由器之間建立連線。

# weave connect 10.0.2.8

會發現,此時位於兩臺不同主機上的容器之間可以相互ping通了。但是處於不同子網的兩個容器是不能互聯的,這樣我們就可以使用不同子網進行容器間的網路隔離了。

我們會發現,如果不使用Docker的原生網路,在容器內部是不能訪問宿主機以及外部網路的。此時我們可以使用weave expose 192.168.0.1/24來給weave網橋新增IP,以實現容器與宿主機網路連通。但是,此時在容器內部依然不能訪問外部網路。
我們可以同時使用Docker的原生網路和weave網路來實現容器互聯及容器訪問外網和埠對映。使用外部網路及埠對映的時候就使用docker0網橋,需要容器互聯的時候就使用weave網橋。每個容器分配兩個網絡卡。

 IP地址管理(IPAM)
Weave自動為容器分配唯一的IP地址。可通過weave ps檢視
 命名和發現
命名的容器自動會註冊到Weave DNS中,並可以通過容器名稱訪問。
 負載均衡
允許註冊多個相同名稱的容器,Weave DNS隨機為每個請求返回地址,提供基本的負載均衡功能。
 手動指定IP地址
docker run –it –e WEAVE_CIDR=10.32.0.100/24 busybox
 動態拓撲
可以在不停止或重新配置剩餘Docker主機的情況下新增主機到Weave網路中或從Weave網路中刪除
 容錯
weave peer不斷交換拓撲資訊,監視和建立與其他peer的網路連線。如果有主機或網路出現故障,Weave會繞過這個主機,
保證兩邊容器可以繼續通訊,當恢復時,恢復完全連線。

test4.OpenvSwitch
什麼是OpenVSwich?
OpenvSwich:開放虛擬交換標準,是一種基於開源Apache2.0許可證的多層軟體交換機,專門管理多租賃雲端計算網路環境,支援KVM、Xen等虛 擬化技術。
支援以下功能:
1.支援標準802.1Q VLAN模組的Trunk和access埠模式;
2.QoS(Quality of Service)配置,及管理;
3.支援OpenFlow協議;
4.支援GRE、VXLAN、STT和LISP隧道;
5.具有C和Python介面配置資料庫;
6.支援核心態和使用者態的轉發引擎設定;
7.支援流量控制及監控。

主要組成部分:
ovs-vswitchd 一個實現交換機的守護程式
ovsdb-server 一個輕量級資料庫,ovs-vswitchd查詢以獲取其配置
ovs-dpctl 用於配置交換機的核心模組工具
ovs-vsctl 用於檢視和更新ovs-vswitchd的配置工具
ovs-appctl 一個向執行OVS守護程式傳送命令的工具
還提供了openflow的工具:
ovs-ofctl 用於檢視和控制OpenFlow交換機和控制器
ovs-pki 用於建立和管理公鑰
ovs-tcpundump 解析openflow訊息

安裝部署OVS並建立GRE隧道

節點1:192.168.101.200 容器網段:172.17.1.0/24
節點2:192.168.101.201 容器網段:172.17.2.0/24
1.安裝OVS

# apt-get install openvswitch-switch bridge-utils 
2.建立網橋並激活
# ovs-vsctl add-br br0
# ip link set dev br0 up
3.將gre0虛擬介面加入網橋br0,並設定介面型別和對端IP地址(遠端IP指定對端)
# ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.101.200  
4.新增docker0網橋到OVS網橋br0
# brctl addif docker0 br0
5.檢視網橋資訊
# ovs-vsctl show
# brctl show
6.新增靜態路由
# ip route add 172.17.0.0/16 dev docker0
7.驗證互通
# docker run -it busybox

原理圖
這裡寫圖片描述