tnblog
首页
视频
资源
登录
愿你出走半生,归来仍是少年
排名
3
文章
317
粉丝
22
评论
14
bootstrap 栅格布局一小例子
剑轩 : 后端写样式有点痛苦哇
一点flex布局的运用
剑轩 : 后端写样式有点痛苦哇
vue.js常用指令
剑轩 : 可以可以,多总结一点
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

kubectl port-forward 踩坑记录。k8s 发布后外部无法访问

12348人阅读 2022/6/25 17:33 总访问:2060954 评论:0 收藏:1 手机
分类: k8s

前言

最近在学习k8s,直接使用命令部署应用并给外界访问:

  1. kubectl run nginx --image nginx:latest
  2. 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

  1. kubectl run nginx --image nginx:latest
  2. 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)

评价