原文 https://www.myf5.net/post/2343.htm
現象:
從內部某個pod的容器里直接訪問service的cluster地址,請求可以被正常轉發到各個node上的pod里
但是從外部網絡,訪問nodeport發布的服務,則發現請求不能被轉發到其他node上
排錯發現,請求沒有被轉發到其他node的物理接口,說明問題出在接受請求的那台node本身上
查看iptables filter表發現,轉發數據包匹配一條docker創建的規則導致丟棄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@docker3 ~]# iptables -nL -v --line-number
Chain INPUT (policy ACCEPT 525 packets, 70924 bytes)
num pkts bytes target prot opt in out source destination
1 258K 33M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0
2 259K 33M KUBE-SERVICES all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain FORWARD (policy DROP 1 packets, 64 bytes)
num pkts bytes target prot opt in out source destination
1 1657 205K DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
2 1657 205K DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
3 790 132K ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
4 35 2224 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
5 818 70064 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
6 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
7 35 2224 ACCEPT all -- !docker0 docker0 0.0.0.0/0 0.0.0.0/0
|
forward鏈中的 第1,2規則都導致丟棄
強制增加iptables -I FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT 規則后,問題解決
但重啟會失效,持久化的一個方法見此文最后 http://www.cnadn.net/post/2304.htm
ps:筆者在網上找了一堆資料,基本沒有提及過nodeport轉發不通的問題,因為目前所有的iptables規則都是k8s安裝完后自動生成,沒有做過任何修改, 從A機器訪問kube-proxy的nodeport能轉發到B機器的 targetport, 但是從外網訪問A機器的kube-proxy的nodeport就無法轉發出去,集群網絡是通的,但就是無法轉發,后面看到此文加上iptables -I FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT 果然可行