docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > kubectl port-forward踩坑

kubectl port-forward的踩坑过程及解决

作者:嗷大猫...

在学习K8S时遇到的问题:在K8S节点内用curl访问本机网卡IP192.168.22.151失败,而在K8S外部用PC浏览器访问该IP失败,原因是K8S默认只监听localhost地址,而192.168.22.151没有被监听,解决办法是使用--address0.0.0.0参数,让K8S监听所有地址

kubectl port-forward踩坑

最近在学习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物理网卡的地址。

出现这个问题之后,捣鼓了好一段时间,也没搞出个头绪。

灵光一闪

后来过了几天,在看《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参数引起的。

①在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拒绝了。

②在K8S外部,为什么用PC浏览器去访问IP192.168.22.151,会失败?

PC的IP也是没有被K8S监听,访问界面的流量被拒绝了,所以用浏览器访问失败。

如图:

③在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地址去访问,访问成功:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文