起因
在很多業務場景裡,是需要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叢集相同的vpc, vswtich, 安全組。
這裡其實還可以達到一個目的,就是給這個彈性網卡固定一個内網IP。
綁定彈性網卡ENI
建立成功後,可以在界面上綁定該網卡到對應的kuberentes的worker節點上。現在給ECS綁定彈性網卡已經可以動态加載了,無需重新開機機器。
重複上述兩個步驟來給對應的worker節點挂載多個彈性網卡
給彈性網卡挂載公網IP
在
ECS->>網絡與安全->彈性公網IP
,建立EIP,然後挂載到對應的彈性網卡上。注意這裡必須選擇“普通模式”
建立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端口
然後我們進入容器,以python最簡單的方式起個http服務來驗證
python -m SimpleHTTPServer 8000
然後直接通過這個Pod挂載的彈性網卡的EIP來通路它就可
小結
從上述配置過程,可以提供了kubernetes叢集的Pod挂載公網IP的可行的方式,進而拓展了kubernetes的應用場景。
後續我們将繼續增強對于彈性網卡的控制,例如可以在Pod指定使用那塊彈性網卡等,如果您對于這個還有任何需求以及好的建議,可以通過工單的形式回報給我們容器團隊