1、基本概念
容器:Container(容器)是一種便攜式、輕量級的操作系統級虛擬化技術。它使用 NameSpace 隔離不同的軟件運行環境,并通過鏡像自包含軟件的運行環境,從而使得容器可以很方便的在任何地方運行。
Pod:Kubernetes 使用 Pod 來管理容器,每個 Pod 可以包含一個或多個緊密關聯的容器,一對多的關系。
Service:Service 是應用服務的抽象,通過 labels 為應用提供負載均衡和服務發現。匹配 labels 的 Pod IP 和端口列表組成 endpoints,由 kube-proxy 負責將服務 IP 負載均衡到這些 endpoints 上。
Namespace:Namespace是Linux提供的一種對于系統全局資源的隔離機制;從進程的視角來看,同一個namespace中的進程看到的是該namespace自己獨立的一份全局資源,這些資源的變化只在本namespace中可見,對其他namespace沒有影響。容器就是采用namespace機制實現了對網絡,進程空間等的隔離。不同的Container(在K8S中是以Pod為單位)屬于不同namespace,實現了Container或Pod之間的資源互相隔離,互不影響。
Network namespace允許你在Linux中創建相互隔離的網絡視圖,每個網絡名字空間都有自己獨立的網絡配置,包括:網卡、回環設備、網絡棧;網絡設備、路由表、IPTables規則。
2、k8s網絡模型
kubernetes網絡模型設計的目的是給pod、service等提供一個簡單、一致的網絡視圖和使用體驗,對他們屏蔽了宿主機環境的網絡拓撲的同時,也屏蔽了網絡模型上實現的細節;
同時要求每個Pod都擁有一個獨立的IP地址,而且假定所有Pod都在一個可以直接連通的、扁平的網絡空間中;
如何對扁平的網絡進行理解:
- 所有的 Pod 可以與任何其他 Pod 直接通信,無需使用 NAT 映射(network address translation);
- 所有節點可以與所有 Pod 直接通信,無需使用 NAT 映射;
- Pod 內部獲取到的 IP 地址與其他 Pod 或節點與其通信時的 IP 地址是同一個;
k8s的網絡組成有:
- 集群內:同一個pod上不同容器的通信、pod間通信,pod和服務(service)之間的通信,
- 集群外:外部和service服務間的通信
接下來具體分析k8s對集群內網絡模型的解決方案
同一個pod上不同容器的通信
Kubernetes創建Pod時,首先會創建一個infra容器,為Pod指派一個唯一的IP地址。然后,以infra的網絡命名空間為基礎,創建同一個Pod內的其它容器;因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost進行通信。
pod間通信
使用兩個虛擬接口組成的veth對可以使不同的網絡命名空間連接起來,這些虛擬接口分布在多個網絡命名空間上,這里通過veth對讓pod1的eth0和veth0、pod2的eth0和veth1關聯起來;
再通過網橋把veth0和veth1組成為一個以太網,從而讓pod1和pod2相互通信。