【K8S系列】深入解析k8s網絡
思考問題
經過前面的學習,我們已經知道k8s是由各種組件、對象組成,那它是如何解決:
? Docker容器和Docker容器之間的網絡?
? Pod與Pod之間的網絡?
? Pod與Service之間的網絡?
? Internet與Service之間的網絡?
1 基本介紹
1.1 K8s網絡是什么
Kubernetes網絡是指在Kubernetes集群中不同組件之間進行通信和交互的網絡架構。
在Kubernetes中,每個容器都有自己的IP地址,這些容器組成了Pod,Pod是Kubernetes調度的最小單元。
Kubernetes網絡的設計目標是支持多種網絡模型,并提供可插拔的網絡插件,從而使Kubernetes能夠在不同的云和物理環境中運行。
Kubernetes網絡通常分為四個層次:
? 容器網絡接口(CNI)
? Pod網絡
? Service網絡
? Ingress網絡
容器網絡接口(CNI)層
Kubernetes網絡的底層是CNI層,它是一個獨立的插件系統,用于為容器分配IP地址、創建網絡接口和配置網絡環境。
CNI插件可以在Kubernetes的各種云和物理環境中使用,例如AWS、GCP、Azure、OpenStack、Bare metal等。
這一層解決的是—Docker容器和Docker容器之間的網絡
Pod是最小的可調度單元,通常包含一個或多個容器。Pod內的容器可以通過localhost(127.0.0.1)進行通信,這種通信方式不需要網絡環境的支持,因此可以實現較低的延遲和較高的吞吐量。
在Pod內部,容器之間可以通過共享網絡命名空間進行通信。所有容器共享Pod的IP地址和網絡命名空間,它們可以使用localhost或Pod的IP地址進行通信。可以通過在Pod的配置文件中指定容器之間的端口映射來定義容器之間的通信方式。
例如,在一個Pod中有兩個容器A和B,A需要向B發送HTTP請求。可以在Pod的配置文件中為容器A和容器B分別指定端口號,然后在容器A中使用localhost和容器B的端口號進行通信。容器B在接收到請求后可以返回HTTP響應。
Pod網絡層
Pod網絡層是容器的網絡層,它為Pod提供了單獨的IP地址和網絡空間。Pod網絡層可以使用多種網絡模型,如host模式、overlay模式、macvlan模式等。
這一層解決的是—Pod與Pod之間的網絡通訊
Pod間通信:
Pod是Kubernetes中最小的部署單元,每個Pod都有一個唯一的IP地址,Pod內的容器共享該IP地址和網絡命名空間。
Pod間通信可以使用多種技術,如Kubernetes默認的CNI插件、Flannel、Calico、Weave Net等。
Service網絡層
Service網絡層是Kubernetes網絡的中間層,它定義了Service之間的網絡通信,為Service提供了一個虛擬IP地址,將請求路由到后端Pod的實際IP地址。
Service網絡層可以使用ClusterIP、NodePort、LoadBalancer等多種類型。
這一層解決的是—Pod與Service之間的網絡
Ingress網絡層
Ingress網絡層是Kubernetes網絡的頂層,它允許外部流量進入Kubernetes集群,并將請求路由到不同的Service。
Ingress網絡層可以使用多種Ingress控制器,如Nginx、Traefik、HAProxy等。
這一層解決的是—Internet與Service之間的網絡
2 k8s網絡模型
Kubernetes網絡模型是一個為容器提供網絡連接的框架,它允許容器在Kubernetes集群內和外部進行通信。
Kubernetes網絡模型包括以下幾個方面:
1. Pod間通信:Pod是Kubernetes中最小的部署單元,每個Pod都有一個唯一的IP地址,Pod內的容器共享該IP地址和網絡命名空間。Pod間通信可以使用多種技術,如Kubernetes默認的CNI插件、Flannel、Calico、Weave Net等。
2. Pod與Service通信:Service是Kubernetes中用于訪問Pod的一種抽象機制,它為一組Pod提供一個統一的訪問入口,并分發請求到后端的Pod。Pod與Service之間的通信可以直接使用Service的IP地址或DNS名稱,Kubernetes會自動將請求路由到后端的Pod。
3. Pod與Node通信:Kubernetes中的Pod可以與它所在的節點進行通信,這種通信方式通常用于容器化應用需要訪問宿主機上的資源,如宿主機上的文件、設備等。Pod與Node之間的通信可以通過節點IP地址或本地環回地址(127.0.0.1)進行。
4. Service與外部網絡通信:Kubernetes中的Service可以暴露給外部網絡訪問,這可以通過Ingress、NodePort或LoadBalancer等機制實現。Ingress是一種Kubernetes中的資源對象,用于將外部HTTP/HTTPS流量路由到Service中,它可以提供負載均衡、SSL終止等功能。NodePort是一種Service類型,它將Service的端口映射到每個節點的固定端口上,從而允許外部網絡通過節點IP地址和該端口訪問Service。LoadBalancer是一種Service類型,它使用云提供商的負載均衡器將外部網絡流量路由到Service中。
Kubernetes網絡模型提供了一種靈活、可擴展、高可用、安全的網絡解決方案,使得容器之間能夠相互通信以及與外界進行通信,為容器化應用的部署和運行提供了強大的支持。
網絡方案
Kubernetes網絡模型是基于容器、Pod、Service和Ingress等抽象概念構建的,它提供了以下特性:
1. 容器間通信:容器可以直接通過Pod網絡進行通信,無需進行端口映射或NAT。
2. Service發現:Service網絡層為Service提供了一個虛擬IP地址,使得其他容器可以通過Service名稱和端口號訪問該服務。
3. 負載均衡:Kubernetes支持多種負載均衡算法,如Round Robin、IP Hash、Least Connection等。
4. 網絡隔離:Kubernetes支持通過網絡策略實現容器之間的網絡隔離,從而保護容器的安全性。
5. 外部流量管理:Ingress網絡層提供了外部流量管理機制,允許外部請求進入Kubernetes集群,并將請求路由到不同的Service。
Kubernetes網絡架構和網絡模型提供了高度可擴展性、可插拔性和高可用性的網絡解決方案,使得開發人員可以更加輕松地部署和管理容器化應用程序。
k8s網絡插件
Kubernetes 是一個強大的容器編排平臺,它提供了多種網絡插件,用于在集群中實現容器之間和容器與外部網絡的通信。以下是幾種常用的 Kubernetes 網絡插件:
1. Kube-router
2. Flannel
3. Calico
4. Weave Net
5. Cilium
1 Kube-router
Kube-router 是一種基于 BGP 協議的容器網絡方案,它可以在集群中創建一個虛擬網絡,并使用 BGP 協議來管理容器之間的通信。
具體來說,Kube-router 會為每個容器分配一個唯一的 IP 地址,并使用 BGP 協議將這些 IP 地址添加到路由表中。
Kube-router 還支持多種網絡拓撲結構,包括扁平網絡、網格網絡和點對點網絡等。
使用示例
以下是使用 Kube-router 網絡插件的示例代碼,
演示前提:已經安裝了 Kubernetes 集群和 Kube-router 網絡插件:
創建一個 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
創建一個 Kubernetes Service
apiVersion:v1 kind:Service#資源類型為service metadata: name:nginx-service spec: selector: app:nginx ports: -name:http port:80 targetPort:80 type:ClusterIP
創建一個 Kubernetes Pod,使用 Kube-router 網絡插件
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
在該示例中,
創建了一個 Pod,并使用 Kube-router 網絡插件來管理容器的網絡配置。
具體來說,是在容器中啟動了 Kube-router 進程,并通過命令行參數來配置插件的運行模式和網絡配置。
還使用了 hostPath 卷來掛載 CNI 插件所需的文件和配置。
需要注意的是,在使用 Kube-router 網絡插件時,需要根據不同的網絡需求和環境來配置參數和選項。具體的配置方法可以參考 Kube-router 的官方文檔和示例代碼。
2 Flannel
Flannel 是一種基于 VXLAN 或者 UDP 的虛擬網絡方案,它通過在每個節點上創建一個虛擬網絡來實現容器之間的通信。
具體來說,Flannel 會為每個節點分配一個唯一的 IP 地址段,并將每個容器的 IP 地址映射到這個 IP 地址段中。
Flannel 需要依賴 etcd 或者其他分布式鍵值存儲系統來存儲網絡配置信息。
使用示例
以下是使用 Flannel 網絡插件的示例代碼,
演示前提:已經安裝了 Kubernetes 集群和 Flannel 網絡插件:
創建一個 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
創建一個 Kubernetes Service
apiVersion:v1 kind:Service#資源類型 metadata: name:nginx-service spec: selector: app:nginx ports: -name:http port:80 targetPort:80 type:ClusterIP
創建一個 Kubernetes Pod,使用 Flannel 網絡插件
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#掛載
在該示例中,創建了一個 Pod,并使用 Flannel 網絡插件來管理容器的網絡配置。另外,在容器中啟動了 Flannel 進程,并通過命令行參數來配置插件的運行模式和網絡配置。
還使用了 configMap 卷來掛載 Flannel 的配置文件。
需要注意的是,在使用 Flannel 網絡插件時,需要根據不同的網絡需求和環境來配置參數和選項。
具體的配置方法可以參考 Flannel 的官方文檔和示例代碼。
3 Calico
Calico 是一種基于 BGP 協議的容器網絡方案,它使用 IP 路由表來管理容器之間的通信。具體來說,Calico 會為每個容器分配一個唯一的 IP 地址,并使用 BGP 協議將這些 IP 地址添加到路由表中。Calico 還提供了強大的網絡安全機制,可以保護容器網絡的安全性。
4 Weave Net
Weave Net 是一種基于 VXLAN 或者 UDP 的虛擬網絡方案,它可以在集群中創建一個虛擬網絡,從而實現容器之間的通信。具體來說,Weave Net 會為每個容器分配一個唯一的 IP 地址,并使用 VXLAN 或者 UDP 來在不同節點之間傳輸數據。Weave Net 還支持多種網絡拓撲結構,包括扁平網絡、網格網絡和點對點網絡等。
5 Cilium
Cilium 是一種基于 eBPF 技術的容器網絡方案,它可以在內核層面攔截和管理容器之間的通信。具體來說,Cilium 會在每個節點上創建一個 eBPF 過濾器,用于監控和管理容器之間的數據流。Cilium 還支持多種網絡層協議和應用層協議,并提供了強大的網絡安全機制,可以保護容器網絡的安全性。
總結
Kubernetes 提供了多種網絡插件,可以根據不同的網絡需求和環境來選擇適合的網絡方案。需要注意的是,在進行網絡插件的選擇和部署時,需要考慮網絡的可靠性、性能和安全性等因素。
鏈接:https://blog.csdn.net/weixin_36755535/article/details/130389839
-
網絡
+關注
關注
14文章
7796瀏覽量
90628 -
容器
+關注
關注
0文章
509瀏覽量
22409 -
Docker
+關注
關注
0文章
515瀏覽量
12857 -
kubernetes
+關注
關注
0文章
243瀏覽量
9021
原文標題:【K8S系列】深入解析k8s網絡
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
什么是 K8S,如何使用 K8S
OpenStack與K8s結合的兩種方案的詳細介紹和比較
如何使用kubernetes client-go實踐一個簡單的與K8s交互過程

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

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

常用的k8s容器網絡模式有哪些?
k8s云原生開發要求

評論