k8s内容器不可访问

来源:互联网 发布:闺蜜 礼物 知乎 编辑:程序博客网 时间:2024/05/16 05:55

k8s创建的容器从节点主机外部无法访问

我们生产环境上用的Docker还是1.12、k8s是1.5的。最近有空装了一套新版的Docker和k8s环境(ubuntu16.04+Docker17.03 + k8s 1.6.3)准备体验一下新特性的,却碰到一个坑记录一下:

问题现象

在搭建好的k8s集群内创建的容器,只能在其所在的节点上curl可访问,但是在其他任何主机上无法访问容器占用的端口。

先是怀疑node上防火墙开着,查了一下ufw处于inactive状态,排除防火墙问题。

查了一下iptables,第二条规则先是“-P FORWARD DROP”,在底部看到我想暴露的tomcat都被ReJect了:

kube@xmk8s-node1:~$ sudo iptables -S-P INPUT ACCEPT-P FORWARD DROP-P OUTPUT ACCEPT-N DOCKER-N DOCKER-ISOLATION-N KUBE-FIREWALL-N KUBE-SERVICES-A INPUT -j KUBE-FIREWALL-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 OUTPUT -j KUBE-FIREWALL-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES-A DOCKER-ISOLATION -j RETURN-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP-A KUBE-SERVICES -p tcp -m comment --comment "kube-system/kubernetes-dashboard: has no endpoints" -m addrtype --dst-type LOCAL -m tcp --dport 30090 -j REJECT --reject-with icmp-port-unreachable-A KUBE-SERVICES -d 172.18.222.152/32 -p tcp -m comment --comment "kube-system/kubernetes-dashboard: has no endpoints" -m tcp --dport 9090 -j REJECT --reject-with icmp-port-unreachable-A KUBE-SERVICES -p tcp -m comment --comment "xmspace/tomcat8: has no endpoints" -m addrtype --dst-type LOCAL -m tcp --dport 30080 -j REJECT --reject-with icmp-port-unreachable-A KUBE-SERVICES -d 172.18.74.70/32 -p tcp -m comment --comment "xmspace/tomcat8: has no endpoints" -m tcp --dport 8080 -j REJECT --reject-with icmp-port-unreachable

github上有个issue《docker 1.13 container is not reachable after giving IP-address #211》

解决方案

原来安装1.13以上的Docker时把–ip-forward设成false了。

vim /etc/sysctl.conf找到这一行,放开注释# Uncomment the next line to enable packet forwarding for IPv4net.ipv4.ip_forward=1

重启主机,再查iptables -s ,第二行变成“-P FORWARD ACCEPT”,底部的几行拒绝的规则也没有了。再访问http://10.156.129.38:30080就可访问了,至此问题解决。

kube@xmk8s-node1:~$ sudo iptables -S-P INPUT ACCEPT-P FORWARD ACCEPT-P OUTPUT ACCEPT-N DOCKER-N DOCKER-ISOLATION-N KUBE-FIREWALL-N KUBE-SERVICES-A INPUT -j KUBE-FIREWALL-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 OUTPUT -j KUBE-FIREWALL-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES-A DOCKER-ISOLATION -j RETURN-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP

image