K8S網路NAT問題分析與處理
阿新 • • 發佈:2018-11-19
在K8S環境中(叢集環境為自建),node節點上的pod網路互聯互通是採用網路外掛結合etcd實現的。 預設情況下pod訪問叢集外部的網路(例如:訪問百度)走的是對應node節點的nat規則。
最近收到研發反饋的需求,由於我們mysql這種公共服務並沒有放到k8s叢集內(對照生產環境使用的也是RDS這種雲服務),所以從mysql的information_schema.processlist這張表查詢到的客戶端連線地址全部都是node節點的ip,而一個node節點上又跑了許多的微服務,這就給研發人員排查客戶端連線問題帶來了一定的困擾,希望運維將pod連線這些外部公共服務的IP地址改成pod ip
一、需求分析
1、Oprman服務執行在server11這個node節點上,pod ip地址為172.35.69.12
2、在node節點server11上可以看到,預設的nat表POSTROUTING規則鏈對pod ip這個網段進行了MASQUERADE
3、exec方式進入pod內部,去訪問k8s叢集外部的mysql服務,發現pod ip被nat了
二、修改node節點防火牆規則
# iptables -t nat -D POSTROUTING 1 # kubectl exec -it oprman-test2-tomcat-8477bfdb59-gshzp /bin/sh # mysql -h 192.168.1.20 -u root -p123456 MySQL [(none)]> select * from information_schema.processlist where host like '%172.35%';
將node節點nat表中的POSTROUTING規則鏈MASQUERADE規則刪除,通過測試發現能符合研發的需求,但帶來新的問題,無法訪問外部服務。
三、改進node節點防火牆規則
# iptables -t nat -I POSTROUTING -s 172.35.69.0/24 ! -d 192.168.1.20/32 -j MASQUERADE
新增一條新的路由策略,將目的地址不是192.168.1.20的請求進行MASQUERADE,從而實現既能滿足研發需求,又能訪問網際網路的需求。
四、前提條件
因為網路是雙向的,所以需要在公共服務所在的主機上把路由規則新增好