k8s pod里访问不到外部ip_K8S容器网络如何实现通信?
Kubernetes(簡稱K8S)正迅速成為云計算中部署和管理軟件的新標準,那么K8S的容器網絡是如何通信的呢?在了解容器網絡通信原理之前,我們先學習下K8S中主要組件的定義,包括:節點(Node)、容器、POD、 外部網絡
節點:是K8s中最小的計算硬件單元。它是集群中單個機器的表示。在大多數生產系統中,節點很可能是數據中心中的物理機器,或者是托管在像谷歌云平臺這樣的云供應商上的虛擬機。
容器:在K8s上運行的程序被打包成Linux容器。容器是一個被廣泛接受的標準,因此已經有許多預先構建的映像可以部署在K8s上。容器化允許你創建自足式的Linux執行環境。任何程序和它的所有依賴項都可以打包成一個文件,然后在網絡上共享。任何人都可以下載該容器并在其基礎設施上部署它,所需的設置非常少。
POD:是K8s中最小的可部署和管理單元。換句話講,如果需要在K8s中運行單個容器,那么你就得為這個容器創建一個Pod。同時,一個Pod可以包含多個容器,這些容器往往是緊耦合的。怎么樣個緊耦合法呢?試著想象這么一個場景,一個Pod中的多個容器代表需要運行在同一個服務器上的多個進程。這種類比是合理的,因為在許多方面,Pod就類似于一臺服務器。
外部網絡:容器應用部署完成后,需要對外提供服務,這里的外部可能是互聯網、也可能是內部網絡。
那么容器網絡是如何實現在:POD內部通信、同節點的POD之間通信、不同節點的POD之間通信、外部網絡與POD之間通信的呢?下面我們分別來介紹:
1、POD內部通信:同一Pod中的任何容器都將共享相同的名稱空間和本地網絡,容器可以很容易地與其他容器在相同的容器中進行通信,k8s中每個Pod中管理著一組容器,這些容器共享同一個網絡命名空間,Pod中的每個容器擁有與Pod相同的IP和port地址空間,并且由于他們在同一個網絡命名空間,他們之間可以通過localhost相互訪問(可見POD內部的通信是不經過數據IP數據通信通信網絡的)。
2、同節點的POD之間通信:不同pod之間的通信,就是使用linux虛擬以太網設備或者說是由兩個虛擬接口組成的以太網接口對使不同的網絡命名空間鏈接起來,這些虛擬接口分布在多個POD上,通過網橋把不同的POD組成為一個以太網,直接進行二層以太網通信。
3、不同節點的POD之間通信:當跨POD通信時,本節點內無法找到目的POD的MAC地址,則會查找三層路由表轉發,這需要依靠不同節點間的網路配置來實現,對于如何來配置網絡,k8s在網絡這塊自身并沒有實現網絡規劃的具體邏輯,而是制定了一套CNI接口規范,開放給社區來實現,目前主流的網絡配置方案有:Flannel、weave、calico,Macvlan等,其中Flannel和weave方案都采用VXLAN網絡模型,calico采用的BGP三層路由網絡模型,Macvlan是Linux自帶的虛擬網卡實現簡單的二層通信。
4、外部網絡與POD之間通信:Pod之間通過他們自己的ip地址進行通信,但是pod的ip地址是不持久的,當集群中pod的規模縮減或者pod故障或者node故障重啟后,新的pod的ip就可能與之前的不一樣的。所以k8s中衍生出來Service來解決這個問題。k8s中 Service管理了一系列的Pods,每個Service有一個虛擬的ip,要訪問service管理的Pod上的服務只需要訪問你這個虛擬ip就可以了,這個虛擬ip是固定的,當service下的pod規模改變、故障重啟、node重啟時候,對使用service的用戶來說是無感知的,因為他們使用的service的ip沒有變。當數據包到達Service虛擬ip后,數據包會被通過k8s給該servcie自動創建的負載均衡器路由到背后的pod容器。
以上就是K8S容器網絡通信的基本原理,歡迎關注本賬號,帶你了解有意思的IT技術。
總結
以上是生活随笔為你收集整理的k8s pod里访问不到外部ip_K8S容器网络如何实现通信?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓签名生成工具_ios app如何进行
- 下一篇: PHP如何读取excel文,PHP-ph