天天看點

玩轉kubernetes中Pod挂載公網IP

起因

在很多業務場景裡,是需要kubernetes裡的Pod去調用某些公網上服務的(無論這些公網服務是自建的還是其它服務提供商的)。但是通常Pod都是通過主機上SNAT的方式做出口,這樣容易被誤認為是某種資訊抓取程式或者是類似DDoS攻擊,進而容易被封閉對應的主機IP。

另外有些服務隻是對某種服務提供接入,需要設定白名單,但是kuberentes叢集裡又跑了多種服務,這些服務都是通過主機的SNAT出去,進而比較難限定對應的服務的白名單。如果将對應的服務固定在某幾個worker節點上雖然也是一個辦法,但是其靈活度以及容器彈性将收到一定的限制。

是否可以提供一個方式,讓對應的服務的Pod根據需要來挂載自己獨立的公網IP,進而避免上述問題呢?答案是可以的,這個就是我們kubernetes容器服務中特有的網絡插件

Terway

的一個很好的特性。

提前條件

  • 通過阿裡雲kubernetes容器服務來建構叢集,并且在進階選項中選擇對應的網絡插件為

    Terway

    玩轉kubernetes中Pod挂載公網IP
  • 建構叢集時,worker的規格選擇非共享型的ECS(這裡需要注意的是,不同規格的ECS能支援的彈性網卡的個數是有限,具體限制可以咨詢阿裡雲服務)

設定主機彈性網卡

建立彈性網卡

要使用

Terway

的方式,必須先給對應的ECS挂載對應的彈性網卡。可以在

ECS->網絡與安全->彈性網卡

的頁面中建立新的彈性網卡

玩轉kubernetes中Pod挂載公網IP

這裡必須選擇和kubernetes叢集相同的vpc, vswtich, 安全組。

這裡其實還可以達到一個目的,就是給這個彈性網卡固定一個内網IP。

綁定彈性網卡ENI

建立成功後,可以在界面上綁定該網卡到對應的kuberentes的worker節點上。現在給ECS綁定彈性網卡已經可以動态加載了,無需重新開機機器。

重複上述兩個步驟來給對應的worker節點挂載多個彈性網卡

給彈性網卡挂載公網IP

ECS->>網絡與安全->彈性公網IP

,建立EIP,然後挂載到對應的彈性網卡上。注意這裡必須選擇“普通模式”

玩轉kubernetes中Pod挂載公網IP

建立Pod并使用對應的彈性網卡

參考

https://help.aliyun.com/document_detail/97511.html?spm=a2c4g.11174283.6.660.15372ceeh3F1y5

如何判定這個Pod是通過彈性網卡還是通過主機的SNAT出去的呢?我們可以進入容器去通路外網,看看對應的IP是誰的IP就知道了。

#curl ifconfig.me           

通過通路這個url,得到的傳回資訊就是出口的IP位址。從中可以知道我們是通過彈性網卡的EIP出去的

Pod是否可以直接對外提供服務呢?

Pod已經具備了公網IP,那麼其是否可以直接提供對外服務呢?答案也是可以的。方法也很簡單,具體如下。不過從安全以及維護性的考慮不建議這樣做。以下隻是一種驗證網絡互通性:

方案非常簡單:給彈性網卡對應的安全組開放對應的端口,例如開放8000端口

玩轉kubernetes中Pod挂載公網IP

然後我們進入容器,以python最簡單的方式起個http服務來驗證

python -m SimpleHTTPServer 8000           

然後直接通過這個Pod挂載的彈性網卡的EIP來通路它就可

小結

從上述配置過程,可以提供了kubernetes叢集的Pod挂載公網IP的可行的方式,進而拓展了kubernetes的應用場景。

後續我們将繼續增強對于彈性網卡的控制,例如可以在Pod指定使用那塊彈性網卡等,如果您對于這個還有任何需求以及好的建議,可以通過工單的形式回報給我們容器團隊

繼續閱讀