一 Kubernetes網路實現 1.1 Kubernetes網路優勢 在實際的業務場景中,業務組件之間的關係十分複雜,微服務的理念更是讓應用部署的粒度更加細小和靈活。為了支持業務應用組件的通信,Kubernetes網路的設計主要致力於解決以下問題。 容器到容器之間的直接通信。 抽象的Pod到Pod ...
一 Kubernetes網路實現
1.1 Kubernetes網路優勢
在實際的業務場景中,業務組件之間的關係十分複雜,微服務的理念更是讓應用部署的粒度更加細小和靈活。為了支持業務應用組件的通信,Kubernetes網路的設計主要致力於解決以下問題。- 容器到容器之間的直接通信。
- 抽象的Pod到Pod之間的通信。
- Pod到Service之間的通信。
- 集群外部與內部組件之間的通信。
二 Kubernetes網路通信
2.1 容器之間通信
同一個Pod內的容器(Pod內的容器是不會跨宿主機的)共用同一個網路命名空間,共用同一個Linux協議棧。所以對於網路的各類操作,就和它們在同一臺機器上一樣,它們甚至可以用localhost地址訪問彼此的埠。這種方式簡單、安全和高效,也能減小將已經存在的程式從物理機或者虛擬機移植到容器下運行的難度。 在Kubernetes使用如下方式利用Docker的網路模型: 如上圖所示,在Node1上運行著一個Pod實例,且運行著容器1和容器2。容器1和容器2共用一個網路的命名空間,共用一個命名空間的結果就是它們好像在一臺機器上運行,它們打開的埠不會有衝突,可以直接使用Linux的本地IPC進行通信(例如消息隊列或者管道)。其實,這和傳統的一組普通程式運行的環境是完全一樣的,傳統程式不需要針對網路做特別的修改就可以移植了,它們之間的互相訪問只需要使用localhost就可以。例如,如果容器2運行的是MySQL,那麼容器1使用localhost:3306就能直接訪問這個運行在容器2上的MySQL了。2.2 Pod之間的通信
每一個Pod都有一個真實的全局IP地址,同一個Node內的不同Pod之間可以直接採用對方Pod的IP地址通信,而且不需要採用其他發現機制,例如DNS、Consul或者etcd。Pod容器既有可能在同一個Node上運行,也有可能在不同的Node上運行,所以通信也分為兩類:同一個Node內Pod之間的通信和不同Node上Pod之間的通信。- 同一個Node內Pod之間的通信
- 不同Node上Pod之間的通信
- 在整個Kubernetes集群中對Pod的IP分配進行規劃,不能有衝突;
- 需要一種方案,將Pod的IP和所在Node的IP關聯起來,通過這個關聯讓Pod可以互相訪問。