037.集群網路-Docker網路實現

来源:https://www.cnblogs.com/itzgr/archive/2020/03/22/12547403.html
-Advertisement-
Play Games

一 Docker網路 1.1 Docker網路類型 標準的Docker支持以下4類網路模式: host模式:使用--net=host指定。 container模式:使用--net=container:NAME_or_ID指定。 none模式:使用--net=none指定。 bridge模式:使用-- ...


一 Docker網路

1.1 Docker網路類型

標準的Docker支持以下4類網路模式:
  • host模式:使用--net=host指定。
  • container模式:使用--net=container:NAME_or_ID指定。
  • none模式:使用--net=none指定。
  • bridge模式:使用--net=bridge指定,為預設設置。
在Kubernetes管理模式下通常只會使用bridge模式,如下介紹在bridge模式下Docker是如何支持網路的。 提示:更多Docker網路參考《006.Docker網路管理》。

二 bridge模式

2.1 bridge模型

在bridge模式下,Docker Daemon第1次啟動時會創建一個虛擬的網橋,預設的名稱是docker0,然後在私有網路空間中給這個網橋分配一個子網。針對由Docker創建的每一個容器,都會創建一個虛擬的乙太網設備(Veth設備對),其中一端關聯到網橋上,另一端使用Linux的網路命名空間技術,映射到容器內的eth0設備,然後從網橋的地址段內給eth0介面分配一個IP地址。 如圖所示為Docker的預設橋接網路模型: clipboard 其中ip1是網橋的IP地址,Docker Daemon會在幾個備選地址段里給它選一個地址,通常是以172開頭的一個地址。這個地址和主機的IP地址是不重疊的。ip2是Docker在啟動容器時,在這個地址段選擇的一個沒有使用的IP地址分配給容器。相應的MAC地址也根據這個IP地址,在02:42:ac:11:00:00和02:42:ac:11:ff:ff的範圍內生成,這樣做可以確保不會有ARP衝突。 啟動後,Docker還將Veth對的名稱映射到eth0網路介面。ip3就是主機的網卡地址。 通常,ip1、ip2和ip3是不同的IP段,所以在預設不做任何特殊配置的情況下,在外部是看不到ip1和ip2的。 這樣做的結果就是,在同一臺機器內的容器之間可以相互通信,不同主機上的容器不能相互通信,實際上它們甚至有可能在相同的網路地址範圍內(不同主機上的docker0的地址段可能是一樣的)。 為了讓它們跨節點互相通信,就必須在主機的地址上分配埠,然後通過這個埠路由或代理到容器上。這種做法顯然意味著一定要在容器之間小心謹慎地協調好埠的分配,或者使用動態埠的分配技術。 在不同應用之間協調好埠分配是十分困難的事情,特別是集群水平擴展時。而動態的埠分配也會帶來高度複雜性,例如:每個應用程式都只能將埠看作一個符號(因為是動態分配的,所以無法提前設置)。 而且API Server要在分配完後,將動態埠插入配置的合適位置,服務也必須能互相找到對方等。這些都是Docker的網路模型在跨主機訪問時面臨的問題。 註意:更多跨主機的Docker通信方案,可參考《006.Docker網路管理》。

2.2 網路規則

  • 查看Docker啟動後的系統情況
Docker網路中,在bridge模式下Docker Daemon啟動時創建docker0網橋,併在網橋使用的網段為容器分配IP。 Docker Daemon剛啟動並且還沒有啟動任何容器時,網路協議棧的配置情況如下: [root@docker ~]# ip addr [root@docker ~]# iptables-save clipboard clipboard Docker創建了docker0網橋,並添加了iptables規則。docker0網橋和iptables規則都處於root命名空間中。對這些規則的說明如下:
  1. 在NAT表中有3條記錄,前兩條匹配生效後,都會繼續執行DOCKER鏈,而此時DOCKER鏈為空,所以前兩條只是做了一個框架,並沒有實際效果。
  2. NAT表第3條的含義是,若本地發出的數據包不是發往docker0的,即是發往主機之外的設備的,則都需要進行動態地址修改(MASQUERADE),將源地址從容器的地址(172段)修改為宿主機網卡的IP地址,之後就可以發送給外面的網路了。
  3. 在FILTER表中,第1條也是一個框架,因為後繼的DOCKER鏈是空的。
  4. 在FILTER表中,第3條是說,docker0發出的包,如果需要Forward到非docker0的本地IP地址的設備,則是允許的。這樣,docker0設備的包就可以根據路由規則中轉到宿主機的網卡設備,從而訪問外面的網路。
  5. FILTER表中,第4條是說,docker0的包還可以被中轉給docker0本身,即連接在docker0網橋上的不同容器之間的通信也是允許的。
  6. FILTER表中,第2條是說,如果接收到的數據包屬於以前已經建立好的連接,那麼允許直接通過。這樣接收到的數據包自然又走回docker0,並中轉到相應的容器。
除瞭如上Netfilter的設置,Linux的ip_forward功能也被Docker Daemon打開了: [root@docker ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@docker ~]# ip route default via 172.24.9.1 dev eth0 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.24.9.0/24 dev eth0 proto kernel scope link src 172.24.9.138
  • 查看容器啟動後的情況(容器無埠映射)
首先啟動一個容器,如Registry容器(不使用任何埠鏡像參數),看一下網路堆棧部分相關的變化: [root@docker ~]# docker run --name register -d registry #運行容器 [root@docker ~]# ip addr [root@docker ~]# iptables-save [root@docker ~]# ip route clipboard
  1. 宿主機器上的Netfilter和路由表都沒有變化,說明在不進行埠映射時,Docker的預設網路是沒有特殊處理的。相關的NAT和FILTER這兩個Netfilter鏈還是空的。
  2. 宿主機上的Veth對已經建立,並連接到容器內。
[root@docker ~]# docker exec -ti register /bin/sh #容器內查看相關信息 / # ip route / # ip addr clipboard 如上預設停止的迴環設備lo已經被啟動,外面宿主機連接進來的Veth設備也被命名成了eth0,並且已經配置了地址172.17.0.2。路由信息表包含一條到docker0的子網路由和一條到docker0的預設路由。 查看容器啟動後的情況(容器有埠映射) [root@docker ~]# docker run --name register -d -p 1180:5000 registry #帶埠映射啟動registry [root@docker ~]# iptables-save clipboard 如上新增的規則可以看出,Docker服務在NAT和FILTER兩個表內添加的兩個DOCKER子鏈都是給埠映射用的。在本例中我們需要把外面宿主機的1180埠映射到容器的5000埠。 通過分析可知,無論是宿主機接收到的還是宿主機本地協議棧發出的,目標地址是本地IP地址的包都會經過NAT表中的DOCKER子鏈。Docker為每一個埠映射都在這個鏈上增加了到實際容器目標地址和目標埠的轉換。經過這個DNAT的規則修改後的IP包,會重新經過路由模塊的判斷進行轉發。由於目標地址和埠已經是容器的地址和埠,所以數據自然就被轉發到docker0上,從而被轉發到對應的容器內部。 當然在Forward時,也需要在DOCKER子鏈中添加一條規則,如果目標埠和地址是指定容器的數據,則允許通過。在Docker按照埠映射的方式啟動容器時,主要的不同就是上述iptables部分。而容器內部的路由和網路設備,都和不做埠映射時一樣,沒有任何變化。

三 Docker網路局限

3.1 Docker的網路局限

從Docker對Linux網路協議棧的示例可知,Docker一開始沒有考慮到多主機互聯的網路解決方案。Docker一直以來的理念都是“簡單為美”。通常,虛擬化技術中最為複雜的部分就是虛擬化網路技術。 多主機互聯相關方案有Libnetwork,Libnetwork針對目前Docker的網路實現,Docker使用的Libnetwork組件只是將Docker平臺中的網路子系統模塊化為一個獨立庫的簡單嘗試,離成熟和完善還有一段距離。 提示:更多Docker網路實現方案參考:《007.基於Docker的Etcd分散式部署》、《008.Docker Flannel+Etcd分散式網路部署》。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C# Net 使用 openxml 寫入 對象 到 Excel 中 C# Net 使用openxml寫入對象到Excel中 文尾看效果 效果一(模板文件寫入集合對象) 效果二(新建文件寫入集合對象) 加入包:OpenXml 創建文件:ExcelWrite.cs 複製下麵全部代碼到文件 ExcelWr ...
  • 1、下載插件fiddler 獲取代碼,方式:https:////www.cnblogs.com/my2020/p/12458110.html 將左側拖入右側,點擊“Run Code”運行查看是否可行 2、打開VS,新建操作台程式 3、將fiddler中的代碼粘貼進行修改調試 4、進入“屬性”將“控制 ...
  • 在構思完系統思維腦圖後,小墨回到家中,便摩拳擦掌開始了開發工作。要想迅速完成系統開發,前期系統設計和準備尤其重要,因為小墨做過太多大大小小的業務系統,準備工作也是十分順利。 系統結構 整個系統工程結構如上,基於傳統的三層架構模式(不太懂的快去惡補一下) Web: 基於MVC工程模板搭建,系統模型,視 ...
  • 前面已經分析了伙伴管理演算法的釋放實現,接著分析一下伙伴管理演算法的記憶體申請實現。 伙伴管理演算法記憶體申請和釋放的入口一樣,其實並沒有很清楚的界限表示這個函數是入口,而那個不是,所以例行從稍微偏上一點的地方作為入口分析。於是選擇了alloc_pages()巨集定義作為分析切入口: 而alloc_pages_ ...
  • 我是一個學OI的高一蒟蒻QAQ Win10已經裝了幾個星期了,以前一直沒裝Microsoft office,用的WPS,感覺不行,今天花了一個多小時裝了一下免費office 2016 win10: 1.官網製作系統盤(具體見官網提示) 2.備份C盤 3.重啟,主板調到USB優先(重啟後瘋狂按F12或 ...
  • 我們經常會遇到新裝機器或者用別人的linux機器的時候找不到某個命令出自哪個軟體包而不知道如何安裝的情況,用如下命令可以解決 yum provides TARGET 舉例說明: 這裡因為我已經安裝了,所以提示了我文件位置(安裝了找不到也可以這樣找) 最重要的是如這行 說明是這個redhat lsb ...
  • 1.網卡文件位置 centos網卡配置文件一般位於:/etc/sysconfig/network scripts/ 文件名一般為:ifcfg eno或者ifcfg eth0類似的文件,可以先用ip addr 命令或者是ifconfig命令查看網卡信息 如果是新機器沒有配置文件一般也會有ifcfg l ...
  • 一 Kubernetes網路實現 1.1 Kubernetes網路優勢 在實際的業務場景中,業務組件之間的關係十分複雜,微服務的理念更是讓應用部署的粒度更加細小和靈活。為了支持業務應用組件的通信,Kubernetes網路的設計主要致力於解決以下問題。 容器到容器之間的直接通信。 抽象的Pod到Pod ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...