網絡模型 - 每天5分鐘玩轉 Docker 容器技術(169)

本節我們討論 Kubernetes 網絡這個重要主題。

Kubernetes 作爲編排引擎管理着分佈在不同節點上的容器和 Pod。Pod、Service、外部組件之間需要一種可靠的方式找到彼此並進行通信,Kubernetes 網絡則負責提供這個保障。本章包括如下內容:

  1. Kubernetes 網絡模型

  2. 各種網絡方案

  3. Network Policy

Kubernetes 網絡模型

Kubernetes 採用的是基於扁平地址空間的網絡模型,集羣中的每個 Pod 都有自己的 IP 地址,Pod 之間不需要配置 NAT 就能直接通信。另外,同一個 Pod 中的容器共享 Pod 的 IP,能夠通過 localhost 通信。

這種網絡模型對應用開發者和管理員相當友好,應用可以非常方便地從傳統網絡遷移到 Kubernetes。每個 Pod 可被看作是一個個獨立的系統,而 Pod 中的容器則可被看做同一系統中的不同進程。

下面討論在這個網絡模型下集羣中的各種實體如何通信。知識點前面都已經涉及,這裏可當做複習和總結。

Pod 內容器之間的通信

當 Pod 被調度到某個節點,Pod 中的所有容器都在這個節點上運行,這些容器共享相同的本地文件系統、IPC 和網絡命名空間。

不同 Pod 之間不存在端口衝突的問題,因爲每個 Pod 都有自己的 IP 地址。當某個容器使用 localhost 時,意味着使用的是容器所屬 Pod 的地址空間。

比如 Pod A 有兩個容器 container-A1 和 container-A2,container-A1 在端口 1234 上監聽,當 container-A2 連接到 localhost:1234,實際上就是在訪問 container-A1。這不會與同一個節點上的 Pod B 衝突,即使 Pod B 中的容器 container-B1 也在監聽 1234 端口。

Pod 之間的通信

Pod 的 IP 是集羣可見的,即集羣中的任何其他 Pod 和節點都可以通過 IP 直接與 Pod 通信,這種通信不需要藉助任何的網絡地址轉換、隧道或代理技術。Pod 內部和外部使用的是同一個 IP,這也意味着標準的命名服務和發現機制,比如 DNS 可以直接使用。

Pod 與 Service 的通信

Pod 間可以直接通過 IP 地址通信,但前提是 Pod 得知道對方的 IP。在 Kubernetes 集羣中, Pod 可能會頻繁的銷燬和創建,也就是說 Pod 的 IP 不是固定的。爲了解決這個問題,Service 提供了訪問 Pod 的抽象層。無論後端的 Pod 如何變化,Service 都作爲穩定的前端對外提供服務。同時,Service 還提供了高可用和負載均衡功能,Service 負責將請求轉發給正確的 Pod。

外部訪問

無論是 Pod 的 IP 還是 Service 的 Cluster IP,它們只能在 Kubernetes 集羣中可見,對集羣之外的世界,這些 IP 都是私有的。

Kubernetes 提供了兩種方式讓外界能夠與 Pod 通信:

  1. NodePort
    Service 通過 Cluster 節點的靜態端口對外提供服務。外部可以通過 
    <NodeIP>:<NodePort> 訪問 Service。

  2. LoadBalancer
    Service 利用 cloud provider 提供的 load balancer 對外提供服務,cloud provider 負責將 load balancer 的流量導向 Service。目前支持的 cloud provider 有 GCP、AWS、Azur 等。

以上就是 Kubernetes 網絡模型的相關討論。
下一節我們來看看 Kubernetes 支持的網絡方案。

書籍:

1.《每天5分鐘玩轉Kubernetes》
https://item.jd.com/26225745440.html

2.《每天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html

3.《每天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章