k8s網絡模型

一、前言

k8s對Pods之間如何進行組網通信提出了要求,k8s對集群的網絡有以下要求:

  • 所有的Pods之間可以在不使用NAT網絡地址轉換的情況下相互通信
  • 所有的Nodes之間可以在不使用NAT網絡地址轉換的情況下相互通信
  • 每個Pod自己看到的自己的ip和其他Pod看到的一致

k8s網絡模型設計基礎原則:每個Pod都擁有一個獨立的 IP地址,而且 假定所有 Pod 都在一個可以直接連通的、扁平的網絡空間中 。 所以不管它們是否運行在同 一 個 Node (宿主機)中,都要求它們可以直接通過對方的 IP 進行訪問。設計這個原則的原因 是,用戶不需要額外考慮如何建立 Pod 之間的連接,也不需要考慮將容器端口映射到主機端口等問題。

由于 Kubemetes 的網絡模型假設 Pod 之間訪問時使用的是對方 Pod 的實際地址,所以一個
Pod 內部的應用程序看到的自己的 IP 地址和端口與集群內其他 Pod 看到的一樣。它們都是 Pod 實際分配的IP地址 (從dockerO上分配的)。將IP地址和端口在Pod內部和外部都保持一致, 我們可以不使用 NAT 來進行轉換,地址空間也自然是平的。

鑒于上面這些要求,我們需要解決四個不同的網絡問題::

  • Docker容器和Docker容器之間的網絡
  • Pod與Pod之間的網絡
  • Pod與Service之間的網絡
  • Internet與Service之間的網絡

下面我們一一進行討論每種網絡問題,以及如何解決。

二、容器和容器之間的網絡

image.png

  • 在k8s中每個Pod中管理著一組Docker容器,這些Docker容器共享同一個網絡命名空間。
  • Pod中的每個Docker容器擁有與Pod相同的IP和port地址空間,并且由于他們在同一個網絡命名空間,他們之間可以通過localhost相互訪問。
    什么機制讓同一個Pod內的多個docker容器相互通信那?其實是使用Docker的一種網絡模型:–net=container

container模式指定新創建的Docker容器和已經存在的一個容器共享一個網絡命名空間,而不是和宿主機共享。新創建的Docker容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等

每個Pod容器有有一個pause容器其有獨立的網絡命名空間,在Pod內啟動Docker容器時候使用 –net=container就可以讓當前Docker容器加入到Pod容器擁有的網絡命名空間(pause容器)

image.png

三、Pod與Pod之間的網絡

image.png

  • k8s中,每個Pod擁有一個ip地址,不同的Pod之間可以直接使用改ip與彼此進行通訊
  • 在同一個Node上,從Pod的視角看,它存在于自己的網絡命名空間中,并且需要