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

 更新时间:2025年10月24日 09:28:24   作者:嗷大猫...  
在学习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地址去访问,访问成功:

总结

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

相关文章

  • docker for windows 容器内网通过独立IP直接访问的方法

    docker for windows 容器内网通过独立IP直接访问的方法

    这篇文章主要介绍了docker for windows 容器内网通过独立IP直接访问的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 详解如何使用Docker部署Django+MySQL8开发环境

    详解如何使用Docker部署Django+MySQL8开发环境

    这篇文章主要介绍了详解如何使用Docker部署Django+MySQL8开发环境,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • docker拉取乌班图并且ssh连接方式

    docker拉取乌班图并且ssh连接方式

    文章介绍了如何在Docker中拉取Ubuntu镜像并使用SSH连接到容器,首先,确保容器正在运行,然后使用`docker exec`进入容器,接着,安装并配置OpenSSH服务器,设置root密码,并配置SSH允许root登录,最后,映射端口以便从宿主机连接到容器的SSH服务
    2025-03-03
  • Docker查看正在运行的容器目录的实现方式

    Docker查看正在运行的容器目录的实现方式

    这篇文章主要介绍了Docker查看正在运行的容器目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Docker配置MySql环境的实现步骤

    Docker配置MySql环境的实现步骤

    通过使用Docker,开发人员可以更容易地构建、测试和交付应用程序,同时减少了环境配置和依赖项管理的复杂性,本文主要介绍了Docker配置MySql环境的实现步骤,文中通过示例代码介绍的非常详细,感兴趣的可以了解一下
    2024-02-02
  • Mysql 在 Docker 中的时区问题记录

    Mysql 在 Docker 中的时区问题记录

    Mysql 时区一般是跟着系统走的,而在 Docker 中安装 Mysql 默认时区是 UTC,下面介绍,创建Docker容器前、后,分别如何设置 Mysql 时区,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Docker部署MySQL镜像的完整指南

    Docker部署MySQL镜像的完整指南

    这篇文章主要为大家详细介绍了使用Docker部署MySQL镜像的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-07-07
  • Docker-CE安装的两种实现方式

    Docker-CE安装的两种实现方式

    文章指导如何卸载失败安装的Docker,并提供两种安装方式:官方脚本一键安装与手动安装Docker CE,步骤涵盖更新系统、添加密钥和仓库、安装组件、启动服务及验证安装
    2025-09-09
  • Docker Hub运行原理及实现过程解析

    Docker Hub运行原理及实现过程解析

    这篇文章主要介绍了Docker Hub运行原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Docker 修改docker存储位置 修改容器镜像大小限制操作

    Docker 修改docker存储位置 修改容器镜像大小限制操作

    这篇文章主要介绍了Docker 修改docker存储位置 修改容器镜像大小限制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论