您好,登錄后才能下訂單哦!
深入淺析docker中的overlay式網絡?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
overlay(覆蓋)式網絡會在多個docker守護進程所在的主機之間創建一個分布式的網絡。這個網絡會覆蓋宿主機特有的網絡,并允許容器連接它(包括集群服務中的容器)來安全通信。顯然,docker會處理docker守護進程源容器和目標容器之間的數據報的路由。
當你初始化一個集群(swarm)或把一個docker宿主機加入一個已經存在的集群時,宿主機上會新建兩個網絡:
一個叫ingress的overlay式網絡,用來處理和集群服務相關的控制和數據傳輸。當你創建一個集群服務而且沒有把它連到用戶定義的overlay式網絡時,它默認會連到ingress網絡。
一個叫docker_gwbridge的bridge式網絡。用來連接本docker守護進程和集群中的其他守護進程。
你可以用docker network create命令創建用戶定義的overlay式網絡,就和你創建用戶定義的bridge式網絡一樣。服務和容器可以同時連到多個網絡。服務和容器只能和它所在的網絡中的其他對象通信。
雖然集群服務和單獨的容器都能連到overlay式網絡,但默認的表現和配置兩者都是不同的。因此,本主題后面的內容會分成三部分:應用于所有overlay式網絡的;應用于集群服務中的網絡的;應用于單獨的容器使用的overlay式網絡的。
適用于所有overlay網絡的操作
創建一個overlay網絡
先決條件
使用overlay網絡的docker守護進程需要的防火墻規則
要讓一個overlay網絡中的docker主機能夠相互通信,你需要打開下面的端口:
1.TCP端口2377,用來集群管理相關的通信
2.TCP和UDP端口7946,用來進行節點之間的通信
3.UDP端口4789,用來進行進行overlay網絡上的數據傳輸
在你能創建一個overlay網絡之前,你要么要通過docker swarm init把你的docker守護進程初始化成一個集群管理者(swarm manager),要么要通過docker swarm join把它加入到一個已存在的集群中。
不管哪種方式,默認創建并使用的都是叫做ingress的overlay式網絡。即使你不打算使用集群服務,也要這么做。
以后你可以創建用戶定義的overlay式網絡。
要創建一個用在集群服務中的overlay式網絡,用下面所示的命令:
$ docker network create -d overlay my-overlay
要創建一個既能用于集群服務,又能用于單獨的容器來和其他docker守護進程中的單獨的容器進行通信的網絡,加上--attachable標記:
$ docker network create -d overlay --attachable my-attachable-overlay
你可以指定IP地址范圍,子網,網關和其他選項。細節請查看docker network create --help。
overlay網絡上的加密傳輸
所有的服務管理相關的傳輸都默認用GCM模式的AES算法加密。集群中的管理節點每12個小時輪換加密用的鍵(key)。
如果要加密應用數據,在創建網絡時加上--opt encrypted。這個參數支持在vxlan級別的IPSEC加密。這個操作會導致不可忽略的性能下降,所以在應用到生產環境前要先測試。
當你開啟overlay加密后,docker會在所有網絡中服務被調度到的節點上創建IPSEC 隧道。這些隧道也會使用GCM模式的AES算法加密,并且每12個小時自動輪換加密用的鍵(key)。
❌不要把Windows節點加入到加密通信的overlay網絡中。
overlay網絡上的加密通信不支持Windows。如果Windows節點試圖連接到加密通信的overlay網絡,不會報錯,但這個節點會不能和其他節點通信。
集群模式的overlay網絡和單獨的容器
你可以用--opt encrypted --attachable或把沒有被管理的容器加入到網絡的方式來使用overlay網絡特性。
$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
修改默認的ingress網絡
大多數用戶不需要配置ingress網絡。但docker17.05以及更高版本允許你這么做。如果自動選擇的子網段和你網絡中已存在的網絡沖突了,或你需要修改其他底層的網絡設置比如MTU的時候,這個功能就很有用了。
修改ingress網絡需要刪除再創建它。這就要求你在集群中創建服務之前完成修改。如果有發布端口的服務,在你刪除ingress網絡之前要先刪除這些服務。
在ingress網絡不存在的時候,已存在的沒有發布端口的服務能繼續提供服務,但沒有負載均衡功能。那些發布端口的服務比如發布80端口的WordPress服務會受影響。
用docker network inspect ingress檢查ingress網絡,然后刪除所有所在容器連到ingress的服務。這些服務是發布端口的服務比如發布80端口的WordPress服務。如果所有這些服務沒有停掉,下一步會失敗。
刪除ingress網絡。
$ docker network rm ingress
WARNING! Before removing the routing-mesh network, make sure all the nodes in your swarm run the same docker engine version. Otherwise, removal may not be effective and functionality of newly created ingress networks will be impaired.
Are you sure you want to continue? [y/N]
3.用ingress標記創建新的overlay網絡,加上你想要的配置。下面的例子把MTU配置成1200,把子網設置成10.11.0.0/16,并把網關設成10.11.0.2。
$ docker network create \ --driver overlay \ --ingress \ --subnet=10.11.0.0/16 \ --gateway=10.11.0.2 \ --opt com.docker.network.mtu=1200 \ my-ingress
注意:你也可以把ingerss網絡命名成其他名字,但只能有一個。如果你試圖創建第二個,會失敗。
4.重啟你在第一步停掉的服務。
修改docker_gwbridge接口
docker_gwbridge是一個虛擬網橋,用來連接overlay網絡(包括ingress網絡)和一個特定的docker守護進程的物理網絡。當你初始化一個集群或把一個docker宿主機加入到一個集群時,docker會自動創建它,但它不是一個docker設備。它存在于docker宿主機的內核中。如果你要修改它的配置,你必須在把宿主機加入集群前完成,或暫時把宿主機從集群中脫離。
停掉docker
刪除docker_gwbridge接口
$ sudo ip link set docker_gwbridge down
$ sudo ip link del name docker_gwbridge
3.啟動docker,不要加入或初始化集群
4.用docker network create命令手動創建或重新創建docker_gwbridge網橋,加上你自定義的設置。下面的例子使用10.11.0.0/16子網。
$ docker network create \ --subnet 10.11.0.0/16 \ --opt com.docker.network.bridge.name=docker_gwbridge \ --opt com.docker.network.bridge.enable_icc=false \ --opt com.docker.network.bridge.enable_ip_masquerade=true \ docker_gwbridge
5.初始化或加入集群。由于網橋已經存在,docker不會再用默認配置創建它了。
集群服務中的操作
在overlay網絡上發布端口
連到同一個overlay網絡的集群服務會互相暴露所有端口。如果一個端口要從服務外部可訪問到,必須在docker service create或docker service update中用-p或--publish來發布。
遺留的冒號分割的語法和新的逗號分割的語法都是支持的。
更長的語法更好,因為某種意義上它是自解釋的。
參數 | 描述 |
---|---|
-p 8080:80 o或-p published=8080,target=80 | 把服務內的 TCP 端口 80映射到路由中的端口8080 |
-p 8080:80/udp 或-p published=8080,target=80,protocol=udp | 把服務內的 UDP 端口 80映射到路由中的端口8080 |
-p 8080:80/tcp -p 8080:80/udp 或 -p published=8080,target=80,protocol=tcp -p published=8080,target=80,protocol=udp | 把服務內的 TCP 端口 80映射到路由中的端口8080,并把服務內的 UDP 端口 80映射到路由中的端口8080 |
為集群服務繞開路由網
默認的,集群服務通過路由網來發布端口。當你連到任一集群節點(不管它有沒有運行端口所代表的服務)上的被發布的端口時,你都能重定向到運行著指定服務的節點。docker很有效的充當著你的集群服務的負載均衡器。使用路由網的服務運行在虛擬IP模式(VIP)下。即使一個服務運行在一個節點上(通過--global標記),也會使用路由網。當使用路由網時,不能保證哪個節點處理客戶端的請求。
要繞開路由網,你可以用DNS Round Robin (DNSRR)模式啟動服務。通過給dnsrr設置--endpoint-mode標記。你必須在服務前端運行你自己的負載均衡器。docker宿主機上的服務名的DNS查詢會返回運行著指定服務的節點的IP地址集合。配置你的負載均衡器來使用這份列表并在節點間平衡通信。
分離控制流和數據流
默認的,控制流和集群管理者聯系并在運行在同一網絡上的應用間傳輸,雖然控制流是加密的。你可以配置docker,讓它用不同的網絡接口來處理不同的流。當你初始化或加入集群時,分別指定--advertise-addr和--datapath-addr。你必須在每個要加入集群的節點上做這個操作。
overlay網絡上獨立容器能用的操作
把獨立容器連到overlay網絡
ingress網絡創建時沒有指定--attachable標記,這意味著只有集群服務能使用它,獨立容器不能。你可以把獨立容器連到用戶定義的,創建時指定了--attachablebiaoji d overlay網絡。這給了運行在不同docker上的獨立容器一種能力,即不需在特定docker宿主機上設置路由就能通信的能力。
發布端口
參數 | 描述 |
---|---|
-p 8080:80 | 把服務內的 TCP 端口 80映射到路由中的端口8080 |
-p 8080:80/udp | 把服務內的 UDP 端口 80映射到路由中的端口8080 |
-p 8080:80/tcp -p 8080:80/udp | 把服務內的 TCP 端口 80映射到路由中的端口8080,并把服務內的 UDP 端口 80映射到路由中的端口8080 |
看完上述內容,你們掌握深入淺析docker中的overlay式網絡的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。