自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

網(wǎng)絡(luò) 通信技術(shù)
Kubernetes(簡(jiǎn)稱(chēng)K8S)是開(kāi)源的容器集群管理系統(tǒng),可以實(shí)現(xiàn)容器集群的自動(dòng)化部署、自動(dòng)擴(kuò)縮容、維護(hù)等功能。它既是一款容器編排工具,也是全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。

[[332340]]

前言

Kubernetes(簡(jiǎn)稱(chēng)K8S)是開(kāi)源的容器集群管理系統(tǒng),可以實(shí)現(xiàn)容器集群的自動(dòng)化部署、自動(dòng)擴(kuò)縮容、維護(hù)等功能。它既是一款容器編排工具,也是全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。在Docker技術(shù)的基礎(chǔ)上,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等功能,提高了大規(guī)模容器集群管理的便捷性。

基礎(chǔ)概念

Container

Container(容器)是一種便攜式、輕量級(jí)的操作系統(tǒng)級(jí)虛擬化技術(shù)。它使用 NameSpace 隔離不同的軟件運(yùn)行環(huán)境,并通過(guò)鏡像自包含軟件的運(yùn)行環(huán)境,從而使得容器可以很方便的在任何地方運(yùn)行。由于容器體積小且啟動(dòng)快,因此可以在每個(gè)容器鏡像中打包一個(gè)應(yīng)用程序。一對(duì)一的關(guān)系

POD

Kubernetes 使用 Pod 來(lái)管理容器,每個(gè) Pod 可以包含一個(gè)或多個(gè)緊密關(guān)聯(lián)的容器。一對(duì)多的關(guān)系

 

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

 

Node

Node 是 Pod 真正運(yùn)行的主機(jī),可以是物理機(jī),也可以是虛擬機(jī),也稱(chēng)為宿主機(jī)。為了管理 Pod,每個(gè) Node 節(jié)點(diǎn)上至少要運(yùn)行docker 、kubelet 服務(wù)。

 

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

 

Namespace

Namespace 是對(duì)一組資源和對(duì)象的抽象集合,比如可以用來(lái)將系統(tǒng)內(nèi)部的對(duì)象劃分為不同的項(xiàng)目組或用戶組。常見(jiàn)的 pods, services, replication controllers 和 deployments 等都是屬于某一個(gè) namespace 的(默認(rèn)是 default),而 node, persistentVolumes 等則不屬于任何 namespace

Service

Service 是應(yīng)用服務(wù)的抽象,通過(guò) labels 為應(yīng)用提供負(fù)載均衡和服務(wù)發(fā)現(xiàn)。匹配 labels 的 Pod IP 和端口列表組成 endpoints,由 kube-proxy 負(fù)責(zé)將服務(wù) IP 負(fù)載均衡到這些 endpoints 上

網(wǎng)絡(luò)通訊方式

了解了上面的基本概念后,我們考慮一下K8s集群中docker容器之間是如何通訊的?我們這里需要區(qū)分一下不同的場(chǎng)景

1)在同一個(gè)POD上Container通信

2)同一個(gè)Node,不同POD

3)不同Node,不同POD

我們先來(lái)看看上面的不同場(chǎng)景是怎么通信的

同一個(gè)POD上Container通信

在k8s中每個(gè)Pod中管理著一組Docker容器,這些Docker容器共享同一個(gè)網(wǎng)絡(luò)命名空間,Pod中的每個(gè)Docker容器擁有與Pod相同的IP和port地址空間,并且由于他們?cè)谕粋€(gè)網(wǎng)絡(luò)命名空間,他們之間可以通過(guò)localhost相互訪問(wèn)。

什么機(jī)制讓同一個(gè)Pod內(nèi)的多個(gè)docker容器相互通信?就是使用Docker的一種網(wǎng)絡(luò)模型:–net=container

container模式指定新創(chuàng)建的Docker容器和已經(jīng)存在的一個(gè)容器共享一個(gè)網(wǎng)絡(luò)命名空間,而不是和宿主機(jī)共享。新創(chuàng)建的Docker容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個(gè)指定的容器共享 IP、端口范圍等

在k8s中每個(gè)Pod容器有一個(gè)pause容器有獨(dú)立的網(wǎng)絡(luò)命名空間,在Pod內(nèi)啟動(dòng)Docker容器時(shí)候使用 –net=container就可以讓當(dāng)前Docker容器加入到Pod容器擁有的網(wǎng)絡(luò)命名空間(pause容器)

 

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

 

這里就是為什么k8s在調(diào)度pod時(shí),盡量把關(guān)系緊密的服務(wù)放到一個(gè)pod中,這樣網(wǎng)絡(luò)的請(qǐng)求耗時(shí)就可以忽略,因?yàn)槿萜髦g通信共享了網(wǎng)絡(luò)空間,就像local本地通信一樣。

同一個(gè)Node,不同Pod

 

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

 

 

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

 

上圖就是同一個(gè)node,不同pod之間的通信,就是使用linux虛擬以太網(wǎng)設(shè)備或者說(shuō)是由兩個(gè)虛擬接口組成的veth對(duì)使不同的網(wǎng)絡(luò)命名空間鏈接起來(lái),這些虛擬接口分布在多個(gè)網(wǎng)絡(luò)命名空間上(這里是指多個(gè)Pod上)。

通過(guò)網(wǎng)橋把veth0和veth1組成為一個(gè)以太網(wǎng),他們直接是可以直接通信的,另外這里通過(guò)veth對(duì)讓pod1的eth0和veth0、pod2的eth0和veth1關(guān)聯(lián)起來(lái),從而讓pod1和pod2相互通信。

不同Node,不同Pod

 

Kubernetes之POD、容器之間的網(wǎng)絡(luò)通信

 

上圖就是不同node之間的pod通信,Node1中的Pod1如何和Node2的Pod4進(jìn)行通信的,我們來(lái)看看具體流程:

1)首先pod1通過(guò)自己的以太網(wǎng)設(shè)備eth0把數(shù)據(jù)包發(fā)送到關(guān)聯(lián)到root命名空間的veth0上

2)然后數(shù)據(jù)包被Node1上的網(wǎng)橋設(shè)備接受到,網(wǎng)橋查找轉(zhuǎn)發(fā)表發(fā)現(xiàn)找不到pod4的Mac地址,則會(huì)把包轉(zhuǎn)發(fā)到默認(rèn)路由(root命名空間的eth0設(shè)備)

3)然后數(shù)據(jù)包經(jīng)過(guò)eth0就離開(kāi)了Node1,被發(fā)送到網(wǎng)絡(luò)。

4)數(shù)據(jù)包到達(dá)Node2后,首先會(huì)被root命名空間的eth0設(shè)備

5)然后通過(guò)網(wǎng)橋把數(shù)據(jù)路由到虛擬設(shè)備veth1,最終數(shù)據(jù)表會(huì)被流轉(zhuǎn)到與veth1配對(duì)的另外一端(pod4的eth0)

每個(gè)Node都知道如何把數(shù)據(jù)包轉(zhuǎn)發(fā)到其內(nèi)部運(yùn)行的Pod,當(dāng)一個(gè)數(shù)據(jù)包到達(dá)Node后,其內(nèi)部數(shù)據(jù)流就和Node內(nèi)Pod之間的流轉(zhuǎn)類(lèi)似了

補(bǔ)充說(shuō)明:對(duì)于如何來(lái)配置網(wǎng)絡(luò),k8s在網(wǎng)絡(luò)這塊自身并沒(méi)有實(shí)現(xiàn)網(wǎng)絡(luò)規(guī)劃的具體邏輯,而是制定了一套CNI(Container Network Interface)接口規(guī)范,開(kāi)放給社區(qū)來(lái)實(shí)現(xiàn)。Flannel就是k8s中比較出名的一個(gè)。

flannel

flannel組建一個(gè)大二層扁平網(wǎng)絡(luò),pod的ip分配由flannel統(tǒng)一分配,通訊過(guò)程也是走flannel的網(wǎng)橋。

每個(gè)node上面都會(huì)創(chuàng)建一個(gè)flannel0虛擬網(wǎng)卡,用于跨node之間通訊。所以容器直接可以直接使用pod id進(jìn)行通訊。

跨節(jié)點(diǎn)通訊時(shí),發(fā)送端數(shù)據(jù)會(huì)從docker0路由到flannel0虛擬網(wǎng)卡,接收端數(shù)據(jù)會(huì)從flannel0路由到docker0。

總結(jié)

 

上面老顧介紹了幾種網(wǎng)絡(luò)通信的場(chǎng)景,以及他們的通信流程,k8s的網(wǎng)絡(luò)通信遠(yuǎn)遠(yuǎn)不止這些,還有很重要的集群外如何訪問(wèn)集群內(nèi)部?以及Service訪問(wèn)是用來(lái)做什么的?

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2019-11-20 09:15:53

KubernetesPod

2022-12-05 09:25:17

Kubernetes網(wǎng)絡(luò)模型網(wǎng)絡(luò)通信

2022-05-13 10:59:14

容器網(wǎng)絡(luò)通信

2019-04-29 10:26:49

TCP網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)通信

2014-09-16 17:00:02

UDP

2024-02-20 19:53:57

網(wǎng)絡(luò)通信協(xié)議

2019-09-25 08:25:49

RPC網(wǎng)絡(luò)通信

2021-06-28 10:20:31

網(wǎng)絡(luò)技術(shù)Kubernetes通信

2020-11-12 08:52:16

Python

2022-04-02 08:14:25

K8s容器通信方案云原生

2021-11-22 08:00:00

Kubernetes容器集群

2019-08-29 14:46:15

Kubernetes網(wǎng)絡(luò)通信

2009-08-24 17:20:13

C#網(wǎng)絡(luò)通信TCP連接

2010-07-01 15:45:22

網(wǎng)絡(luò)通信協(xié)議

2017-01-15 17:44:56

node網(wǎng)絡(luò)通信Socket

2025-04-17 01:44:00

2010-06-09 11:57:42

網(wǎng)絡(luò)通信協(xié)議

2010-06-14 19:13:28

網(wǎng)絡(luò)通信協(xié)議

2010-06-29 10:15:31

局域網(wǎng)故障

2021-08-13 11:27:25

網(wǎng)絡(luò)通信數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)