在容器服務的叢集中,預設情況下的flannel會對POD通路到非POD的網段做SNAT,以確定POD到叢集外部的資源通路,但在某些情況下,比如在容器服務的VPC叢集中,POD到叢集外部的資源是直接可以通路的,這時我們就可以自己定義節點上的SNAT規則,而達到直接用容器IP通路VPC内其他服務。
然後我們使用如下指令判斷<code>ip-masq-agent</code>都已正常運作:
在配置好ip-masq-agent元件後,還是沒有起到作用的,因為預設情況下容器服務使用<code>flannel</code>的網絡插件,我們下面也将說明如何配置關閉掉<code>flannel</code>的<code>SNAT</code>的功能:
1. 修改CNI的配置:
打開修改編輯器後,修改其中的cni-config.json的内容,在其中添加兩處"ipMasq: false"的配置,修改如下:
然後儲存修改退出編輯器。
2. 修改flannel daemonset的配置:
打開修改編輯器後,修改flannel daemonset中kube-flannel容器的配置中的command,删除掉其中的<code>--ip-masq</code>,然後儲存,修改後如下:
3. 使修改生效:
因為kubernetes的daemonset配置後不會自動重新建立,需要手動重新建立flannel的pod,通過<code>kubectl</code>手動删除掉每個節點上的<code>flannel-ds</code>的pod使其重新建立:
這樣flannel就被配置為了不會建立SNAT的規則了。
4. 到每個節點上清理之前flannel建立的SNAT的規則:
在上面這個指令中可以看到我們部署的<code>ip-masq-agent</code>的規則已經加到最後了,然後我們需要移除掉<code>flannel</code>添加的叢集網段的4條規則,我們這個叢集中的叢集POD網段是<code>172.16.0.0/16</code>,這個需要根據您的叢集選擇的網段進行判斷,是以我們這個叢集中的<code>flannel</code>添加的規則是序号3~6這4條。
在機器重新開機時會重新生成iptables,我們可以重新開機下需要生效的節點,就會清理掉之前的iptables了,如果不希望影響運作中的服務,也可以通過iptables指令手動删除掉這4條多餘的iptables規則:
通過kubectl run啟動一個測試容器,并指定我們修改好的一個節點:
然後通過抓包檢視POD ping的包就不會再做SNAT了: