Weave是weaveworks開發的容器網絡解決方案。weave創建的虛擬網絡可以將部署在多個主機上的容器連接起來。對於容器來說,weave就像一個巨大的網絡交換機,容器可以直接通信,無需NAT和端口映射。除此之外,weave的DNS模塊是容器可以通過hostname訪問
weave不依賴分布式數據庫(例如:consul和etcd)交換網絡信息,每個主機上只需要運行weave組件就能建立起跨主機容器網絡,weave網絡能夠穿透防火牆並運行在部分連接的網絡上,weave支持加密網絡接連,用戶可以從一個不受信任的網絡連接到主機
weave官網地址: https://github.com/weaveworks/weave
開始部署weave:
1.linux內核版本為3.8以上,dockers版本為1.10.0 or later
2.curl -L git.io/weave -o /usr/local/bin/weave
3.更改權限chmod a+x /usr/local/bin/weave
4。初始化weave:weave launch
注:初始化weave前要保證有 bridge-utils
網橋工具包
初始化weave三個docker容器來輔助運行,會自動下載鏡像
weave:是主程序,負責建立weave網絡,收發數據,提供DNS等服務
自動創建網橋
自動創建一個docker網絡
driver是weave,subnet是10.32.0.0/12
分析weave的網絡結構:
1. eval $(weave env) 設置環境變量,這樣通過docker命令行啟動的容器就會自動地連接到weave網絡中了
可執行 eval $(weave env --restore)恢復之前的環境
2.docker run --name weave1 -itd busybox 注:-itd連用可使普通鏡像運行容器后,容器會保持運行狀態
3.查看weave1容器中得網絡
weave1容器有兩個網絡接口:eth0@if18,從他的IP可以看出是與host上得docker0同屬一個網段,所以還是默認連接在docker0上得
還有一個ethwe@if20,從名稱可以看出ethew與weave相關,他的對應編號是20,我們從host上面通過ip link進行查看
vethwep120768@if19是與ethwe是一對veth pair,而且被掛在了weave上
我們通過ip -d link深入分析一下現在host上得網絡
這里出現了很多新得interface
datapath:是一個openvswitch
vethwe-datapath@vethwe-bridge:是veth pair
vethwe-datapath:父設備是datapath
vxlan-6784:是vxlan interface,其maste也是datapath,weave主機之間通過Vxlan節能型通信
host1得網絡結構如下:盜圖
weave網絡包含兩個虛擬交換機:橋接的weave和openvswitch datapath,veth pair :vethwe-bridge將兩者連接在一起。
weave與datapath分工不同,weave負責將容器接入weave網絡,datapath負責在主機間建立vxlan隧道並收發數據
我們再運行一個容器
查看weave1的hostname1
weave DNS為容器創建了默認域weave1.weave.local
可以ping通
Weave的連通性和隔離性
1.之前我們是在docker1上進行的操作,現在我們在docker2上進行同樣的部署weave
2.啟動weave
這里必須指定IP 192.168.7.235這樣docker1和docker2才能加到同一個網絡
設置環境變量,在docker2上運行容器
eval $(weave env)
docker run -itd --name weave11 busybox
docker2上面的weave11能夠ping通docker1上的weave1
docker1上面的weave1的IP是10.32.0.1/12
docker2上的weave11的IP 是10.44.0.0/12
掩碼是12位的,實際上這個兩個IP 是在同一個subnet10.32.0.0/12.通過docker1和docker2之間的vxlan隧道,2個容器邏輯上在一個LAN中,肯定是能ping通的
盜圖
1.數據包的目的地址是10.32.0.1/12,docker2根據路由表,從ethwe發送出去
2.docker2查詢到目的主機,將數據通過vxlan發送給docker1
3.docker1收到數據,根據目的IP將數據轉發給weave1
weave的網絡隔離
默認配置下,weave使用一個大subnet(例如10.32.0.0/12),所有主機的容器都從這個地址空間中分配IP ,因為同屬一個subnet,容器可以直接通信。如果要實現網絡隔離,可以通過換環境變量WEAVE_CIDR為容器分配不同的subnet的IP
注:如果通過-e WEAVE_CIDR ,進入容器后沒有使用新的網段,那么重新設置一下變量 eval $(weave env)
容器分配到的IP 是10.32.2.128/24,無法ping通10.32.0.1
weave如何與外部進行通信
weave是一個私有的xvlan網絡,默認與外部網絡隔離。外部如何才能訪問到weave中的容器呢?
方法是:
1.首先將主機加入到weave網絡
2.然后把主機當作訪問weave網絡的網關。
要將主機加入到weave,執行weave expose
這個ip10.32.0.6會被配置到host上的weave的網橋上
現在docker1的網絡是,如盜圖:
weave網橋位於root namespace,它負責將容器接入weave網絡。給weave配置同一subnet的IP其本質就是將docker1接入weave網絡。docker1現在已經可以直接與同一weave網絡接入容器通信了,無論容器是否在docker1上
在docker1上ping同一個host上的容器
pingdocker2上的容器
下面我們看一下,如果host主機沒有加入到weave網絡,是否能ping通自己主機上的容器?
進入docker2上
沒有加入到weave網絡的主機 也無法ping通自己主機上的容器。如果是部署了weave服務可以直接通過weave expose加入到weave網絡,如果沒有部署weave網絡的主機如何與容器進行通信呢?
方法是:將非weave主機的網關指向docker1
如:像docker主機添加路由
測試后可以ping通
使用weave網絡,容器是如何方位外網的呢?
我們可以觀察到在weave環境下,我們運行的容器出本地網卡外都有兩個網卡,eth0和weave,我們知道這個eth0是連接docker0用的,所以容器訪問外網就是通過docker0實現的
IPAM:
我們在每個主機上通過weave launch使weave獲得subnet后,發現都是10.32.0.0/12網段的,我們也可以自定義subnet,可以通過--ipalloc-range分配特定的subnet
weave launch --ipalloc-range 10.2.0.0/16
但是一定要確保每個主機都使用相同的subnet