


前言
最近在学习k8s,直接使用命令部署应用并给外界访问:
kubectl run nginx --image nginx:latest
kubectl port-forward pod/nginx 80:80 #将本机80端口转发至Pod的80端口
然后本地PC用浏览器访问 NodeIP:80,访问nginx界面失败 。
在k8s节点里面用curl访问,出现了神奇现象:直接curl节点的物理网卡地址192.168.22.151,访问失败;而curl localhost或127.0.0.1,可以返回结果。
这个192.168.22.151是k8s节点的ens160物理网卡的地址,不是浮动IP地址或者其他花样,没有做其他花里胡哨的网络隔离措施。
出现这个问题之后,捣鼓了好一段时间,也没搞出个头绪。
灵光一闪
后来过了几天,在看《Kubernetes权威指南 第4版》这本书时,看到书上有关于port-forward的用法:
书上的案例多了一个- -address参数。kubectl port-forward —help查看参数说明
Options:
—address=[localhost]: Addresses to listen on (comma separated). Only accepts IP addresses or localhost as a value. When localhost is supplied, kubectl will try to bind on both 127.0.0.1 and ::1 and will fail if neither of these addresses are available to bind.
这个参数用于设置监听地址,默认值是localhost。如果设置为localhost,那么k8s会监听127.0.0.1和::1这两个地址。
看到这里,大概明白了。问题就是没有设置- -address参数引起的。
1:在K8S节点内,为什么用curl去访问本机的网卡IP192.168.22.151,会失败?
如图:
原因,查看路由表:
最后一条路由,通往192.168.22.0网段的数据包由本机ens160接口转发出去,而ens160接口IP是192.168.22.151。由于没有设置- -address参数,192.168.22.151这个地址并没有被K8S监听,所以从ens160接口出去的访问界面的流量被K8S拒绝了。
2:在K8S外部,为什么用PC浏览器去访问IP192.168.22.151,会失败?
PC的IP也是没有被K8S监听,访问界面的流量被拒绝了,所以用浏览器访问失败。
3:在K8S节点内,用curl访问 127.0.0.1或者localhost,能够访问成功。
解决办法:kubectl port-forward 设置参数- - address 0.0.0.0
kubectl run nginx --image nginx:latest
kubectl port-forward --address 0.0.0.0 pod/nginx 80:80
K8S会监听任何地址,不会再拒绝了,所以使用K8S节点的IP地址去访问,访问成功
原文地址:https://blog.csdn.net/aodamao/article/details/117292308
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)