第二十五章 九析帶你輕鬆完爆 Istio - k8s 流量進入集羣之 hostPort

系列文章:


總目錄索引:九析帶你輕鬆完爆 istio 服務網格系列教程

目錄

1 前言

2 邀約

3 hostPort 樣例

4 hostPort 與 hostNetwork 異同

    4.1 相同點

    4.2 不同點

5 hostPort 使用場景

6 注意


1 前言

        如果你對博客有任何疑問,請告訴我。1.png


2 邀約

        你可以從 b 站搜索 “九析”,獲取免費的、更生動的視頻資料:clipboard2.png


3 hostPort 樣例

        樣例代碼如下所示:clipboard3.png

        pod 發佈之後,便會將容器端口開放給了外部網絡。外部可以通過 pod 所在宿主機和 hostPort 值訪問到 Pod 內的容器提供的服務。


4 hostPort 與 hostNetwork 異同

4.1 相同點

        hostPort 與 hostNetwork 本質上都是暴露 pod 宿主機 IP 給終端用戶,因爲 pod 生命週期並不固定,隨時都有可能被完爆,故 IP 的不確定最終導致用戶使用上的不方便;此外宿主機端口占用也導致不能在同一臺機子上有多個程序使用同一端口。因此一般情況下,不要使用 hostPort 方式。

4.2 不同點

        使用 hostNetwork,pod 實際上用的是 pod 宿主機的網絡地址空間:即 pod  IP 是宿主機 IP,而非 cni 分配的 pod IP,端口是宿主機網絡監聽接口。

使用 hostPort,pod IP 並非宿主機 IP,而是 cni 分配的 pod IP,跟其他普通的 pod 使用一樣的 ip 分配方式,端口並非宿主機網絡監聽端口,只是使用了 DNAT 機制將 hostPort 指定的端口映射到了容器的端口之上(可以通過 iptables 命令進行查看)。外部訪問此 pod 時,仍然使用宿主機和 hostPort 方式。pod ip 跟宿主機 ip 截圖如下:clipboard4.png

        有關端口 DNAT 通過 iptables 命令進行查看,如下截圖所示:clipboard5.png

        由上圖可知,pod 所在宿主機上的 iptables nat 表流向如下:

1 當客戶端發起 pod 訪問時,比如 curl http://pod_in_host:hostPort

2 網絡包會流經 pod 宿主機的 prerouting chain,會命中 CNI-HOSTPORT-DNAT 鏈

3 網絡包會流經 CNI-HOSTPORT_DNAT 鏈中的第 3 條規則,即 DNAT 目標,此時會將 9998 端口訪問的流量路由到 80 端口去

        基於此,當客戶端訪問 pod 所在主機的 9998 端口時,流量會自動被路由到 IP 爲 10.244.11.55(也就是 pod ip)的 80 端口上。


5 hostPort 使用場景

        nginx-ingress-controller 就使用到了 hostPort 方式,同時開啓了 80 和 443 端口,如下截圖所示:clipboard6.png


6 注意

        當 pod 同時使用了 hostNetwork 和 hostPort,那麼 hostNetwork 將會直接使用宿主機網絡命名空間,hostPort 其實就形同虛設了。可以認爲 hostNetwork 選項優先級要高於 hostPort。

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