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地址去访问,访问成功:
在这里插入图片描述

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值