kubernetes中port、target port、node port的對比分析,以及kube-proxy代理

在學習前要知道一個服務下可能有多個pod,每個pod可能在不同的主機上。一個主機可能有多個服務。而每個container又幾乎模擬的是一個主機。所以不是隻有主機纔有ip和端口號。

容器網絡實例

這裏寫圖片描述

服務中的3個端口設置

這幾個port的概念很容易混淆,比如創建如下service:

apiVersion: v1
kind: Service
metadata:
  labels:
    name: app1
  name: app1
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30062
  selector:
    name: app1

port

即,這裏的port表示:service暴露在cluster ip上的端口,<cluster ip>:port 是提供給集羣內部客戶訪問service的入口。

nodePort

首先,nodePort是kubernetes提供給集羣外部客戶訪問service入口的一種方式(另一種方式是LoadBalancer),所以,<nodeIP>:nodePort 是提供給集羣外部客戶訪問service的入口。

targetPort

targetPort很好理解,targetPort是pod上的端口,從port和nodePort上到來的數據最終經過kube-proxy流入到後端pod的targetPort上進入容器。

port、nodePort總結

總的來說,port和nodePort都是service的端口,前者暴露給集羣內客戶訪問服務,後者暴露給集羣外客戶訪問服務。從這兩個端口到來的數據都需要經過反向代理kube-proxy流入後端pod的targetPod,從而到達pod上的容器內。

kube-proxy與iptables

當service有了port和nodePort之後,就可以對內/外提供服務。那麼其具體是通過什麼原理來實現的呢?奧妙就在kube-proxy在本地node上創建的iptables規則。

Kube-Proxy 通過配置 DNAT 規則(從容器出來的訪問,從本地主機出來的訪問兩方面),將到這個服務地址的訪問映射到本地的kube-proxy端口(隨機端口)。然後 Kube-Proxy 會監聽在本地的對應端口,將到這個端口的訪問給代理到遠端真實的 pod 地址上去。
這裏寫圖片描述

kube-proxy會在nat表裏生成4個chain,分別如上所示(主要是從容器出來的訪問,從本地主機出來的訪問兩方面)。

創建service以後,kube-proxy會自動在集羣裏的node上創建以下兩條規則:
KUBE-PORTALS-CONTAINER
KUBE-PORTALS-HOST
如果是NodePort方式,還會額外生成兩條:
KUBE-NODEPORT-CONTAINER
KUBE-NODEPORT-HOST

KUBE-PORTALS-CONTAINER

主要將由網絡接口到來的通過服務集羣入口:port的請求重定向到本地kube-proxy端口(隨機端口)的映射,即來自本地容器的服務訪問請求;

注:我認爲,這種情況的網絡包不可能來自外部網絡,因爲cluster ip是個virtual ip,外部網絡中不存在這樣的路由將該數據包發送到本機;所以該請求只能來自本地容器,從本地容器出來的訪問,服務訪問請求是通過本地容器虛擬網卡輸入到本地網絡接口的。

KUBE-NODEPORT-CONTAINER

主要將由網絡接口到來的通過服務集羣外部入口:nodePort的請求重定向到本地kube-proxy端口(隨機端口)的映射;即來自k8s集羣外部網絡的服務訪問請求,可以來自本機容器,也可以來自其他node的容器,還可以來自其他node的進程;

KUBE-PORTALS-HOST

主要將該node本地進程通過服務集羣入口:port的請求重定向到本地kube-proxy端口(隨機端口)的映射。

KUBE-NODEPORT-HOST

主要將該node本地進程通過服務集羣外部入口:nodePort的請求重定向到本地kube-proxy端口(隨機端口)的映射。

kube-proxy反向代理

不管是通過集羣內部服務入口:port還是通過集羣外部服務入口:nodePort的請求都將重定向到本地kube-proxy端口(隨機端口)的映射,然後將到這個kube-proxy端口的訪問給代理到遠端真實的 pod 地址上去。

案例

這裏寫圖片描述

另一個案例

這裏寫圖片描述

總結

所以這裏我們要知道的關於ip的東西。

我們部署k8s的服務器肯定不是隻有一臺主機。一般是多臺主機在一個局域網裏面。並能爲外界提供一個或多個外網ip。所以每臺主機會有局域網ip和外網ip。局域網ip爲192.168.xx.xx,而外網ip在阿里雲或華爲雲的控制檯中可以看到。

而k8s中對外提供服務的資源爲service。一個k8s集羣可能有多個service,要麼使用端口號進行區分,要麼使用ip地址+端口號進行區分。在k8s裏面,爲每個service設置了集羣ip。10.233.xxx.xxx:port

如果設置了service的ports屬性type爲nodeport,則請求每個服務器192.168.xx.xx上的nodePort端口號,都會映射到該service上。而service裏面包含多個容器組,不同的容器組部署在不同的服務器上,在service裏面服務器爲node。服務內部,可能會讀取node上的數據,所以一個服務裏面也會爲node分配ip。不同service內,同一個服務器代表的node,nodeip是不一樣的。

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