計算機網(wǎng)絡(luò)技術(shù)原理
Kubernetes(k8s) 源于古希臘語,意寓為舵手,管理者。Kubernetes 是Google開源的容器集群管理系統(tǒng),其提供應(yīng)用部署、維護、擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應(yīng)用,下面跟著小編一起了解一些計算機網(wǎng)絡(luò)技術(shù)原理。
其主要功能如下:
以集群的方式運行、管理跨機器的容器;
解決Docker 跨機器容器之間的通訊問題;
Kubernetes 的自我修復機制使得容器集群總是運行在用戶期望的狀態(tài)。
實際上使用Kubernetes 只需要一個部署文件,使用一條命令就可以部署一個完整集群(以網(wǎng)部署k8s 的dashboard 為例):
kubectl create -fhttps://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml
現(xiàn)在先介紹一些核心的概念:
Pods:是連接在一起的容器組合并共享文件卷。它們是最小的部署單元,由 Kubernetes 統(tǒng)一創(chuàng)建、調(diào)度、管理;
Replication controllers:管理 Pods 的生命周期, 它們確保指定數(shù)量的Pods 會一直運行;
Labels:被用來管理和選取基于鍵值對為基礎(chǔ)的對象組;
Services:提供獨立、可靠名稱和地址的 Pods 集合,它就像一個基礎(chǔ)版本的負載均衡器;
Node:相對master是工作主機,也叫Minon,物理機、虛擬機均可。
Namespace:不同的namespace 形成邏輯上不同的`項目或用戶組。
Volume:Pod 中被多個容器訪問的共享目錄。
下圖是典型的Kubernetes 的架構(gòu)圖:
在開始了解Kubernetes 的網(wǎng)絡(luò)原理之前,我們先來看下docker 的網(wǎng)絡(luò)模型。
2Docker的網(wǎng)絡(luò)模型
docker network ls 這個命令用于列出所有當前主機上的網(wǎng)絡(luò):
在默認情況下會看到三個網(wǎng)絡(luò),它們是DockerDeamon 進程創(chuàng)建的。標準的Docker 支持一下4種網(wǎng)絡(luò)模式:
Bridge模式:使用—net=bridge指定。容器使用獨立網(wǎng)絡(luò)Namespace,并連接到docker0虛擬網(wǎng)卡(默認模式);
None模式:使用—net=none指定。容器沒有任何網(wǎng)卡,適合不需要與外部通過網(wǎng)絡(luò)通信的容器;
Host模式:使用—net=host指定。容器與主機共享網(wǎng)絡(luò)Namespace,擁有與主機相同的網(wǎng)絡(luò)設(shè)備;
Container模式:使用—net=container:NAME_or_ID指定。
在Kubernetes 的管理模式下,通常只使用bridge 模式。在bridge 模式下,DockerDaemon 第一次啟動時創(chuàng)建一個虛擬的網(wǎng)橋,缺省名字是docker0,然后按照RPC1918的模型,在私有網(wǎng)絡(luò)空間中給這個網(wǎng)橋分配一個子網(wǎng)。Docker 創(chuàng)建出來的每一個容器,都會創(chuàng)建一個虛擬的Veth 設(shè)備對,其中一端關(guān)聯(lián)到網(wǎng)橋上,另一端用Linux 的網(wǎng)絡(luò)命名空間技術(shù),映射到容器內(nèi)的eth0設(shè)備,然后在網(wǎng)橋的地址段內(nèi)分配一個IP地址。
Docker的缺省橋接網(wǎng)絡(luò)模型:
虛擬化技術(shù)中最為復雜的就是虛擬化網(wǎng)絡(luò)技術(shù),也是門檻很高的技術(shù)領(lǐng)域,Docker 很明智的早期并沒有提供跨主機的解決方案。
3什么是kubernetes網(wǎng)絡(luò)模型?
Kubernetes 網(wǎng)絡(luò)設(shè)計的一個基本原則是:每個Pod 都有一個全局唯一的IP, 而且假定所有的Pod 都在一個可以直接連通的,扁平的網(wǎng)絡(luò)空間中,Pod 之間可以跨主機通信,按照這種網(wǎng)絡(luò)原則抽象出來的一個Pod 對應(yīng)一個IP的設(shè)計模型也被稱作IP-per-Pod 模型。
相比于Docker 原生的NAT方式來說,這樣使得容器在網(wǎng)絡(luò)層面更像虛擬機或者物理機,復雜度整體降低,更加容易實現(xiàn)服務(wù)發(fā)現(xiàn),遷移,負載均衡等功能。
容器間的通信
創(chuàng)建的dashboard 容器信息:
在yaml 文件中你可以發(fā)現(xiàn)我們設(shè)置的replicas 的數(shù)量是1,但是卻發(fā)現(xiàn)了兩個容器在運行,第二個image名為gcr.io/google_containers/pause:2.0,那么第二個容器從何而來?
執(zhí)行下圖中的命令可以發(fā)現(xiàn):
第二個容器和第一個容器共享網(wǎng)絡(luò)命名空間。第一個容器是Netowrk Container,它不做任何事情,只是用來接管Pod 的網(wǎng)絡(luò)。這樣做的好處在于避免容器間的相互依賴,使用一個簡單的容器來統(tǒng)一管理網(wǎng)絡(luò)。
Pod 間的通信
Pod 間的通信使用的是一個內(nèi)部IP,這個IP就是Network Container 的IP。
以dashboard 為例:
同一個Node 上的Pod 通過Veth 連接在同一個docker0 網(wǎng)橋上,地址段相同,原生能通信。但是不同Node 之間的Pod 如何通信的,本質(zhì)是在網(wǎng)路上再架設(shè)一層overlay network 使容器的網(wǎng)絡(luò)運行在這層overlay 網(wǎng)絡(luò)上。現(xiàn)有的方案有Flannel,OpenVSwitch,Weave 等。本文Kubernetes 環(huán)境是采用Flannel。
Flannel 使用Linux 通用TUN/ TAP 設(shè)備, 并使用UDP 封裝IP 數(shù)據(jù)包創(chuàng)建一個覆蓋網(wǎng)絡(luò)。它使用etcd 維護子網(wǎng)的分配和overlay 網(wǎng)絡(luò)和實際IP 的映射。
下圖是Flannel 的原理圖:
Pod 到Service 通信
查看dashboard 的Service 的VIP(Virtual IP) 和后端Pod 的IP:
那么dashboard 就可以通過10.254.104.235來進行訪問,執(zhí)行iptables-save:
然后執(zhí)行l(wèi)sof –i:30250:
可以看到Kube-Proxy 進程監(jiān)聽在30250端口上,這個進程可以看做是Service 的透明代理兼負載均衡器,對于Service 的訪問請求將被這個進程轉(zhuǎn)發(fā)到后端Pod。
對于Pod 的變化會及時刷新。那么Service 就是在Pod 間起到中轉(zhuǎn)和代理的作用。
下圖中可以很好的反映整個流程:
當一個客戶端訪問這個Service 時,這些iptable 規(guī)則就開始起作用,客戶端的流量被重定向到Kube-Proxy 為這個Service 打開的端口上,Kube-Proxy 隨機選擇一個后端Pod 來進行服務(wù)。
外部到內(nèi)部的通信
Kubernetes 支持兩種對外服務(wù)的Service 的Type 定義:NodePort 和LoadBalancer。
NodePort:在每個Node 上打開一個端口并且每個Node 的端口都是一樣的,通過:NodePort 的方式,Kubernetes 集群外部的程序可以訪問Service;
LoadBalancer: 通過外部的負載均衡器來訪問。
【計算機網(wǎng)絡(luò)技術(shù)原理】相關(guān)文章:
1.揮桿原理
3.手寫速記的原理
4.cpu的工作原理
6.計算機的組成原理
7.冬病夏治原理