硬件環境:
兩台物理機:
172.16.114.210(master主機)
172.16.114.211(node主機)
軟件環境:
kubernetes 1.5.2
flannel 0.5.5
問題描述:
部署了一個mysql的NodePort服務,指定nodePort端口為30010,telnet 172.16.114.211 30010是通的,但是telnet 172.16.114.210 30010是不通的。
問題分析
查看172.16.114.210主機的情況如下,
1、30010端口已經監聽
2、iptables -S -t nat | grep mysql,nat表規則均正常
3、iptables -S -t filter 如下:
[root@localhost ~]# iptables -S -t filter -P INPUT ACCEPT -P FORWARD DROP -P OUTPUT ACCEPT -N DOCKER -N DOCKER-ISOLATION -N KUBE-SERVICES -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT -A FORWARD -j DOCKER-ISOLATION -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES -A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT -A DOCKER-ISOLATION -j RETURN
有一條規則-P FORWARD DROP,意思是本機默認的轉發規則是丟棄(DROP),因為nodeport服務本身是部署在node主機上的,telnet master主機時,會根據iptables的規則,將該請求轉發給node主機上的pod,所以當master主機的默認轉發規則是丟棄時,就出現了telnet master主機 加nodeport端口不通的情況。
解決辦法
修改master主機上的iptables規則,將默認轉發的action修改為accept,執行命令為iptables -P FORWARD ACCEPT,修改后規則如下:
[root@localhost ~]# iptables -P FORWARD ACCEPT [root@localhost ~]# iptables -S -t filter -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N DOCKER -N DOCKER-ISOLATION -N KUBE-SERVICES -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT -A FORWARD -j DOCKER-ISOLATION -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES -A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT -A DOCKER-ISOLATION -j RETURN
此時在telnet master主機加nodeport端口,就通了