當前位置:學者齋 >

計算機 >網路技術 >

計算機網路技術原理

計算機網路技術原理

Kubernetes(k8s) 源於古希臘語,意寓為舵手,管理者。Kubernetes 是Google開源的容器叢集管理系統,其提供應用部署、維護、擴充套件機制等功能,利用Kubernetes能方便地管理跨機器執行容器化的應用,下面跟著小編一起了解一些計算機網路技術原理。

計算機網路技術原理

其主要功能如下

以叢集的方式執行、管理跨機器的容器;

解決Docker 跨機器容器之間的通訊問題;

Kubernetes 的自我修復機制使得容器叢集總是執行在使用者期望的狀態。

實際上使用Kubernetes 只需要一個部署檔案,使用一條命令就可以部署一個完整叢集(以網部署k8s 的dashboard 為例):

kubectl create -f

現在先介紹一些核心的概念:

Pods:是連線在一起的容器組合並共享檔案卷。它們是最小的部署單元,由 Kubernetes 統一建立、排程、管理;

Replication controllers:管理 Pods 的生命週期, 它們確保指定數量的Pods 會一直執行;

Labels:被用來管理和選取基於鍵值對為基礎的物件組;

Services:提供獨立、可靠名稱和地址的 Pods 集合,它就像一個基礎版本的負載均衡器;

Node:相對master是工作主機,也叫Minon,物理機、虛擬機器均可。

Namespace:不同的namespace 形成邏輯上不同的`專案或使用者組。

Volume:Pod 中被多個容器訪問的共享目錄。

下圖是典型的Kubernetes 的架構圖:

在開始瞭解Kubernetes 的網路原理之前,我們先來看下docker 的網路模型。

2Docker的網路模型

docker network ls 這個命令用於列出所有當前主機上的網路:

在預設情況下會看到三個網路,它們是DockerDeamon 程序建立的。標準的Docker 支援一下4種網路模式:

Bridge模式:使用—net=bridge指定。容器使用獨立網路Namespace,並連線到docker0虛擬網絡卡(預設模式);

None模式:使用—net=none指定。容器沒有任何網絡卡,適合不需要與外部通過網路通訊的容器;

Host模式:使用—net=host指定。容器與主機共享網路Namespace,擁有與主機相同的網路裝置;

Container模式:使用—net=container:NAME_or_ID指定。

在Kubernetes 的管理模式下,通常只使用bridge 模式。在bridge 模式下,DockerDaemon 第一次啟動時建立一個虛擬的網橋,預設名字是docker0,然後按照RPC1918的模型,在私有網路空間中給這個網橋分配一個子網。Docker 創建出來的每一個容器,都會建立一個虛擬的Veth 裝置對,其中一端關聯到網橋上,另一端用Linux 的網路名稱空間技術,對映到容器內的eth0裝置,然後在網橋的地址段內分配一個IP地址。

Docker的預設橋接網路模型:

虛擬化技術中最為複雜的就是虛擬化網路技術,也是門檻很高的技術領域,Docker 很明智的早期並沒有提供跨主機的解決方案。

3什麼是kubernetes網路模型?

Kubernetes 網路設計的一個基本原則是:每個Pod 都有一個全域性唯一的IP, 而且假定所有的Pod 都在一個可以直接連通的,扁平的網路空間中,Pod 之間可以跨主機通訊,按照這種網路原則抽象出來的一個Pod 對應一個IP的設計模型也被稱作IP-per-Pod 模型。

相比於Docker 原生的NAT方式來說,這樣使得容器在網路層面更像虛擬機器或者物理機,複雜度整體降低,更加容易實現服務發現,遷移,負載均衡等功能。

容器間的通訊

建立的dashboard 容器資訊:

在yaml 檔案中你可以發現我們設定的replicas 的數量是1,但是卻發現了兩個容器在執行,第二個image名為_containers/pause:2.0,那麼第二個容器從何而來?

執行下圖中的命令可以發現:

第二個容器和第一個容器共享網路名稱空間。第一個容器是Netowrk Container,它不做任何事情,只是用來接管Pod 的網路。這樣做的好處在於避免容器間的相互依賴,使用一個簡單的容器來統一管理網路。

Pod 間的通訊

Pod 間的通訊使用的是一個內部IP,這個IP就是Network Container 的IP。

以dashboard 為例:

同一個Node 上的Pod 通過Veth 連線在同一個docker0 網橋上,地址段相同,原生能通訊。但是不同Node 之間的Pod 如何通訊的,本質是在網路上再架設一層overlay network 使容器的網路執行在這層overlay 網路上。現有的方案有Flannel,OpenVSwitch,Weave 等。本文Kubernetes 環境是採用Flannel。

Flannel 使用Linux 通用TUN/ TAP 裝置, 並使用UDP 封裝IP 資料包建立一個覆蓋網路。它使用etcd 維護子網的分配和overlay 網路和實際IP 的對映。

下圖是Flannel 的原理圖:

Pod 到Service 通訊

檢視dashboard 的Service 的VIP(Virtual IP) 和後端Pod 的IP:

那麼dashboard 就可以通過來進行訪問,執行iptables-save:

然後執行lsof –i:30250:

可以看到Kube-Proxy 程序監聽在30250埠上,這個程序可以看做是Service 的透明代理兼負載均衡器,對於Service 的訪問請求將被這個程序轉發到後端Pod。

對於Pod 的變化會及時重新整理。那麼Service 就是在Pod 間起到中轉和代理的作用。

下圖中可以很好的反映整個流程:

當一個客戶端訪問這個Service 時,這些iptable 規則就開始起作用,客戶端的流量被重定向到Kube-Proxy 為這個Service 開啟的埠上,Kube-Proxy 隨機選擇一個後端Pod 來進行服務。

外部到內部的通訊

Kubernetes 支援兩種對外服務的Service 的Type 定義:NodePort 和LoadBalancer。

NodePort:在每個Node 上開啟一個埠並且每個Node 的埠都是一樣的,通過:NodePort 的方式,Kubernetes 叢集外部的程式可以訪問Service;

LoadBalancer: 通過外部的負載均衡器來訪問。

  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/jsj/wl/00250n.html