【K8S系列】深入解析k8s網(wǎng)絡(luò)
思考問題
經(jīng)過前面的學(xué)習(xí),我們已經(jīng)知道k8s是由各種組件、對象組成,那它是如何解決:
? Docker容器和Docker容器之間的網(wǎng)絡(luò)?
? Pod與Pod之間的網(wǎng)絡(luò)?
? Pod與Service之間的網(wǎng)絡(luò)?
? Internet與Service之間的網(wǎng)絡(luò)?
1 基本介紹
1.1 K8s網(wǎng)絡(luò)是什么
Kubernetes網(wǎng)絡(luò)是指在Kubernetes集群中不同組件之間進(jìn)行通信和交互的網(wǎng)絡(luò)架構(gòu)。
在Kubernetes中,每個容器都有自己的IP地址,這些容器組成了Pod,Pod是Kubernetes調(diào)度的最小單元。
Kubernetes網(wǎng)絡(luò)的設(shè)計(jì)目標(biāo)是支持多種網(wǎng)絡(luò)模型,并提供可插拔的網(wǎng)絡(luò)插件,從而使Kubernetes能夠在不同的云和物理環(huán)境中運(yùn)行。
Kubernetes網(wǎng)絡(luò)通常分為四個層次:
? 容器網(wǎng)絡(luò)接口(CNI)
? Pod網(wǎng)絡(luò)
? Service網(wǎng)絡(luò)
? Ingress網(wǎng)絡(luò)
容器網(wǎng)絡(luò)接口(CNI)層
Kubernetes網(wǎng)絡(luò)的底層是CNI層,它是一個獨(dú)立的插件系統(tǒng),用于為容器分配IP地址、創(chuàng)建網(wǎng)絡(luò)接口和配置網(wǎng)絡(luò)環(huán)境。
CNI插件可以在Kubernetes的各種云和物理環(huán)境中使用,例如AWS、GCP、Azure、OpenStack、Bare metal等。
這一層解決的是—Docker容器和Docker容器之間的網(wǎng)絡(luò)
Pod是最小的可調(diào)度單元,通常包含一個或多個容器。Pod內(nèi)的容器可以通過localhost(127.0.0.1)進(jìn)行通信,這種通信方式不需要網(wǎng)絡(luò)環(huán)境的支持,因此可以實(shí)現(xiàn)較低的延遲和較高的吞吐量。
在Pod內(nèi)部,容器之間可以通過共享網(wǎng)絡(luò)命名空間進(jìn)行通信。所有容器共享Pod的IP地址和網(wǎng)絡(luò)命名空間,它們可以使用localhost或Pod的IP地址進(jìn)行通信??梢酝ㄟ^在Pod的配置文件中指定容器之間的端口映射來定義容器之間的通信方式。
例如,在一個Pod中有兩個容器A和B,A需要向B發(fā)送HTTP請求??梢栽赑od的配置文件中為容器A和容器B分別指定端口號,然后在容器A中使用localhost和容器B的端口號進(jìn)行通信。容器B在接收到請求后可以返回HTTP響應(yīng)。
Pod網(wǎng)絡(luò)層
Pod網(wǎng)絡(luò)層是容器的網(wǎng)絡(luò)層,它為Pod提供了單獨(dú)的IP地址和網(wǎng)絡(luò)空間。Pod網(wǎng)絡(luò)層可以使用多種網(wǎng)絡(luò)模型,如host模式、overlay模式、macvlan模式等。
這一層解決的是—Pod與Pod之間的網(wǎng)絡(luò)通訊
Pod間通信:
Pod是Kubernetes中最小的部署單元,每個Pod都有一個唯一的IP地址,Pod內(nèi)的容器共享該IP地址和網(wǎng)絡(luò)命名空間。
Pod間通信可以使用多種技術(shù),如Kubernetes默認(rèn)的CNI插件、Flannel、Calico、Weave Net等。
Service網(wǎng)絡(luò)層
Service網(wǎng)絡(luò)層是Kubernetes網(wǎng)絡(luò)的中間層,它定義了Service之間的網(wǎng)絡(luò)通信,為Service提供了一個虛擬IP地址,將請求路由到后端Pod的實(shí)際IP地址。
Service網(wǎng)絡(luò)層可以使用ClusterIP、NodePort、LoadBalancer等多種類型。
這一層解決的是—Pod與Service之間的網(wǎng)絡(luò)
Ingress網(wǎng)絡(luò)層
Ingress網(wǎng)絡(luò)層是Kubernetes網(wǎng)絡(luò)的頂層,它允許外部流量進(jìn)入Kubernetes集群,并將請求路由到不同的Service。
Ingress網(wǎng)絡(luò)層可以使用多種Ingress控制器,如Nginx、Traefik、HAProxy等。
這一層解決的是—Internet與Service之間的網(wǎng)絡(luò)
2 k8s網(wǎng)絡(luò)模型
Kubernetes網(wǎng)絡(luò)模型是一個為容器提供網(wǎng)絡(luò)連接的框架,它允許容器在Kubernetes集群內(nèi)和外部進(jìn)行通信。
Kubernetes網(wǎng)絡(luò)模型包括以下幾個方面:
1. Pod間通信:Pod是Kubernetes中最小的部署單元,每個Pod都有一個唯一的IP地址,Pod內(nèi)的容器共享該IP地址和網(wǎng)絡(luò)命名空間。Pod間通信可以使用多種技術(shù),如Kubernetes默認(rèn)的CNI插件、Flannel、Calico、Weave Net等。
2. Pod與Service通信:Service是Kubernetes中用于訪問Pod的一種抽象機(jī)制,它為一組Pod提供一個統(tǒng)一的訪問入口,并分發(fā)請求到后端的Pod。Pod與Service之間的通信可以直接使用Service的IP地址或DNS名稱,Kubernetes會自動將請求路由到后端的Pod。
3. Pod與Node通信:Kubernetes中的Pod可以與它所在的節(jié)點(diǎn)進(jìn)行通信,這種通信方式通常用于容器化應(yīng)用需要訪問宿主機(jī)上的資源,如宿主機(jī)上的文件、設(shè)備等。Pod與Node之間的通信可以通過節(jié)點(diǎn)IP地址或本地環(huán)回地址(127.0.0.1)進(jìn)行。
4. Service與外部網(wǎng)絡(luò)通信:Kubernetes中的Service可以暴露給外部網(wǎng)絡(luò)訪問,這可以通過Ingress、NodePort或LoadBalancer等機(jī)制實(shí)現(xiàn)。Ingress是一種Kubernetes中的資源對象,用于將外部HTTP/HTTPS流量路由到Service中,它可以提供負(fù)載均衡、SSL終止等功能。NodePort是一種Service類型,它將Service的端口映射到每個節(jié)點(diǎn)的固定端口上,從而允許外部網(wǎng)絡(luò)通過節(jié)點(diǎn)IP地址和該端口訪問Service。LoadBalancer是一種Service類型,它使用云提供商的負(fù)載均衡器將外部網(wǎng)絡(luò)流量路由到Service中。
Kubernetes網(wǎng)絡(luò)模型提供了一種靈活、可擴(kuò)展、高可用、安全的網(wǎng)絡(luò)解決方案,使得容器之間能夠相互通信以及與外界進(jìn)行通信,為容器化應(yīng)用的部署和運(yùn)行提供了強(qiáng)大的支持。
網(wǎng)絡(luò)方案
Kubernetes網(wǎng)絡(luò)模型是基于容器、Pod、Service和Ingress等抽象概念構(gòu)建的,它提供了以下特性:
1. 容器間通信:容器可以直接通過Pod網(wǎng)絡(luò)進(jìn)行通信,無需進(jìn)行端口映射或NAT。
2. Service發(fā)現(xiàn):Service網(wǎng)絡(luò)層為Service提供了一個虛擬IP地址,使得其他容器可以通過Service名稱和端口號訪問該服務(wù)。
3. 負(fù)載均衡:Kubernetes支持多種負(fù)載均衡算法,如Round Robin、IP Hash、Least Connection等。
4. 網(wǎng)絡(luò)隔離:Kubernetes支持通過網(wǎng)絡(luò)策略實(shí)現(xiàn)容器之間的網(wǎng)絡(luò)隔離,從而保護(hù)容器的安全性。
5. 外部流量管理:Ingress網(wǎng)絡(luò)層提供了外部流量管理機(jī)制,允許外部請求進(jìn)入Kubernetes集群,并將請求路由到不同的Service。
Kubernetes網(wǎng)絡(luò)架構(gòu)和網(wǎng)絡(luò)模型提供了高度可擴(kuò)展性、可插拔性和高可用性的網(wǎng)絡(luò)解決方案,使得開發(fā)人員可以更加輕松地部署和管理容器化應(yīng)用程序。
k8s網(wǎng)絡(luò)插件
Kubernetes 是一個強(qiáng)大的容器編排平臺,它提供了多種網(wǎng)絡(luò)插件,用于在集群中實(shí)現(xiàn)容器之間和容器與外部網(wǎng)絡(luò)的通信。以下是幾種常用的 Kubernetes 網(wǎng)絡(luò)插件:
1. Kube-router
2. Flannel
3. Calico
4. Weave Net
5. Cilium
1 Kube-router
Kube-router 是一種基于 BGP 協(xié)議的容器網(wǎng)絡(luò)方案,它可以在集群中創(chuàng)建一個虛擬網(wǎng)絡(luò),并使用 BGP 協(xié)議來管理容器之間的通信。
具體來說,Kube-router 會為每個容器分配一個唯一的 IP 地址,并使用 BGP 協(xié)議將這些 IP 地址添加到路由表中。
Kube-router 還支持多種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),包括扁平網(wǎng)絡(luò)、網(wǎng)格網(wǎng)絡(luò)和點(diǎn)對點(diǎn)網(wǎng)絡(luò)等。
使用示例
以下是使用 Kube-router 網(wǎng)絡(luò)插件的示例代碼,
演示前提:已經(jīng)安裝了 Kubernetes 集群和 Kube-router 網(wǎng)絡(luò)插件:
創(chuàng)建一個 Kubernetes Deployment
apiVersion:apps/v1 kind:Deployment#資源類型為Deployment metadata: name:nginx-deployment spec: replicas:2 selector: matchLabels: app:nginx template: metadata: labels: app:nginx spec: containers: -name:nginx image:nginx:latest ports: -containerPort:80
創(chuàng)建一個 Kubernetes Service
apiVersion:v1 kind:Service#資源類型為service metadata: name:nginx-service spec: selector: app:nginx ports: -name:http port:80 targetPort:80 type:ClusterIP
創(chuàng)建一個 Kubernetes Pod,使用 Kube-router 網(wǎng)絡(luò)插件
apiVersion:v1 kind:Pod#資源類型為pod metadata: name:kube-router-pod spec: containers: -name:kube-router-container image:kube-router/kube-router:v1.3 command: - kube-router - run args: - --run-router=false - --run-firewall=false - --run-service-proxy=false - --run-egress=false - --enable-cni=true - --cni-bin-dir=/opt/cni/bin - --cni-conf-dir=/etc/cni/net.d - --cni-network-config='{ "cniVersion": "0.3.1", "name": "kube-router", "type": "kube-router" }' volumeMounts: -name:cni-bin mountPath:/opt/cni/bin -name:cni-conf mountPath:/etc/cni/net.d volumes: -name:cni-bin hostPath: path:/opt/cni/bin -name:cni-conf hostPath: path:/etc/cni/net.d
在該示例中,
創(chuàng)建了一個 Pod,并使用 Kube-router 網(wǎng)絡(luò)插件來管理容器的網(wǎng)絡(luò)配置。
具體來說,是在容器中啟動了 Kube-router 進(jìn)程,并通過命令行參數(shù)來配置插件的運(yùn)行模式和網(wǎng)絡(luò)配置。
還使用了 hostPath 卷來掛載 CNI 插件所需的文件和配置。
需要注意的是,在使用 Kube-router 網(wǎng)絡(luò)插件時(shí),需要根據(jù)不同的網(wǎng)絡(luò)需求和環(huán)境來配置參數(shù)和選項(xiàng)。具體的配置方法可以參考 Kube-router 的官方文檔和示例代碼。
2 Flannel
Flannel 是一種基于 VXLAN 或者 UDP 的虛擬網(wǎng)絡(luò)方案,它通過在每個節(jié)點(diǎn)上創(chuàng)建一個虛擬網(wǎng)絡(luò)來實(shí)現(xiàn)容器之間的通信。
具體來說,F(xiàn)lannel 會為每個節(jié)點(diǎn)分配一個唯一的 IP 地址段,并將每個容器的 IP 地址映射到這個 IP 地址段中。
Flannel 需要依賴 etcd 或者其他分布式鍵值存儲系統(tǒng)來存儲網(wǎng)絡(luò)配置信息。
使用示例
以下是使用 Flannel 網(wǎng)絡(luò)插件的示例代碼,
演示前提:已經(jīng)安裝了 Kubernetes 集群和 Flannel 網(wǎng)絡(luò)插件:
創(chuàng)建一個 Kubernetes Deployment
apiVersion:apps/v1 kind:Deployment#資源類型 metadata: name:nginx-deployment spec: replicas:2 selector: matchLabels: app:nginx template: metadata: labels: app:nginx spec: containers: -name:nginx image:nginx:latest ports: -containerPort:80
創(chuàng)建一個 Kubernetes Service
apiVersion:v1 kind:Service#資源類型 metadata: name:nginx-service spec: selector: app:nginx ports: -name:http port:80 targetPort:80 type:ClusterIP
創(chuàng)建一個 Kubernetes Pod,使用 Flannel 網(wǎng)絡(luò)插件
apiVersion:v1 kind:Pod#資源類型 metadata: name:flannel-pod spec: containers: -name:flannel-container image:quay.io/coreos/flannel:v0.14.0 command: -/opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr - --iface=eth0 securityContext: privileged: true volumeMounts: - name: flannel-cfg mountPath: /etc/kube-flannel/ volumes: -name:flannel-cfg configMap: name:kube-flannel-cfg#掛載
在該示例中,創(chuàng)建了一個 Pod,并使用 Flannel 網(wǎng)絡(luò)插件來管理容器的網(wǎng)絡(luò)配置。另外,在容器中啟動了 Flannel 進(jìn)程,并通過命令行參數(shù)來配置插件的運(yùn)行模式和網(wǎng)絡(luò)配置。
還使用了 configMap 卷來掛載 Flannel 的配置文件。
需要注意的是,在使用 Flannel 網(wǎng)絡(luò)插件時(shí),需要根據(jù)不同的網(wǎng)絡(luò)需求和環(huán)境來配置參數(shù)和選項(xiàng)。
具體的配置方法可以參考 Flannel 的官方文檔和示例代碼。
3 Calico
Calico 是一種基于 BGP 協(xié)議的容器網(wǎng)絡(luò)方案,它使用 IP 路由表來管理容器之間的通信。具體來說,Calico 會為每個容器分配一個唯一的 IP 地址,并使用 BGP 協(xié)議將這些 IP 地址添加到路由表中。Calico 還提供了強(qiáng)大的網(wǎng)絡(luò)安全機(jī)制,可以保護(hù)容器網(wǎng)絡(luò)的安全性。
4 Weave Net
Weave Net 是一種基于 VXLAN 或者 UDP 的虛擬網(wǎng)絡(luò)方案,它可以在集群中創(chuàng)建一個虛擬網(wǎng)絡(luò),從而實(shí)現(xiàn)容器之間的通信。具體來說,Weave Net 會為每個容器分配一個唯一的 IP 地址,并使用 VXLAN 或者 UDP 來在不同節(jié)點(diǎn)之間傳輸數(shù)據(jù)。Weave Net 還支持多種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),包括扁平網(wǎng)絡(luò)、網(wǎng)格網(wǎng)絡(luò)和點(diǎn)對點(diǎn)網(wǎng)絡(luò)等。
5 Cilium
Cilium 是一種基于 eBPF 技術(shù)的容器網(wǎng)絡(luò)方案,它可以在內(nèi)核層面攔截和管理容器之間的通信。具體來說,Cilium 會在每個節(jié)點(diǎn)上創(chuàng)建一個 eBPF 過濾器,用于監(jiān)控和管理容器之間的數(shù)據(jù)流。Cilium 還支持多種網(wǎng)絡(luò)層協(xié)議和應(yīng)用層協(xié)議,并提供了強(qiáng)大的網(wǎng)絡(luò)安全機(jī)制,可以保護(hù)容器網(wǎng)絡(luò)的安全性。
總結(jié)
Kubernetes 提供了多種網(wǎng)絡(luò)插件,可以根據(jù)不同的網(wǎng)絡(luò)需求和環(huán)境來選擇適合的網(wǎng)絡(luò)方案。需要注意的是,在進(jìn)行網(wǎng)絡(luò)插件的選擇和部署時(shí),需要考慮網(wǎng)絡(luò)的可靠性、性能和安全性等因素。
鏈接:https://blog.csdn.net/weixin_36755535/article/details/130389839
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7795瀏覽量
90617 -
容器
+關(guān)注
關(guān)注
0文章
509瀏覽量
22408 -
Docker
+關(guān)注
關(guān)注
0文章
514瀏覽量
12843 -
kubernetes
+關(guān)注
關(guān)注
0文章
243瀏覽量
9017
原文標(biāo)題:【K8S系列】深入解析k8s網(wǎng)絡(luò)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
什么是 K8S,如何使用 K8S
OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較
如何使用kubernetes client-go實(shí)踐一個簡單的與K8s交互過程

Docker不香嗎為什么還要用K8s
簡單說明k8s和Docker之間的關(guān)系
K8S集群服務(wù)訪問失敗怎么辦 K8S故障處理集錦

k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres
什么是K3s和K8s?K3s和K8s有什么區(qū)別?
k8s生態(tài)鏈包含哪些技術(shù)

常用的k8s容器網(wǎng)絡(luò)模式有哪些?
k8s云原生開發(fā)要求

評論