【问题标题】:Forwarding traffic from pod to service running on localhost将流量从 pod 转发到在 localhost 上运行的服务
【发布时间】:2020-09-11 18:18:09
【问题描述】:

我的 k8 集群在 minikube 上运行。

我熟悉 kubectl port-forward 命令,它允许将流量从 localhost 路由到集群。

有没有办法反其道而行之?我可以将流量从其中一个 pod 路由到在我的机器上本地运行的 Web 服务器吗?

【问题讨论】:

    标签: kubernetes minikube


    【解决方案1】:

    从您的minikube pod 连接到您的主机的方式在很大程度上取决于您使用的--driver 的类型。

    每个--driver 都可以改变从您的 pod 连接到您的主机的方式。我的意思是每个--driver 可以有多个选项来连接到您的主机。

    正如用户@Srikrishna B H 指出的那样

    确保在连接到在您的机器上本地运行的 Web 服务器时使用本地机器 IP 而不是 localhost

    我创建了 3 个示例:

    • 带有minikube start --driver=docker的Ubuntu
    • 带有minikube start --driver=hyperkit 的 Mac OS
    • 带有minikube start --driver=virtualbox 的窗口

    下面使用的 IP 地址仅用于示例目的!


    Ubuntu 与 Docker

    假设您有一台安装了 Docker 的 Ubuntu 机器,并且 nginx 作为您的 pod 将连接到的服务器:

    • $ minikube start --driver=docker
    • $ ip addr show:
      • docker0 - 码头工人界面
      • ensX - “物理”接口

    上面的命令会告诉你从你的 pod 连接的 IP 地址(在主机上)

    2: ensX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
        <----> 
        inet 10.0.0.2/32 scope global dynamic ensX 
        <----> 
    
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        <---->
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
        <---->
    

    然后你可以生成一个 pod 来检查你是否可以连接到你的 nginx:

    • $ kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
    • $ wget -q0 - IP_ADDRESS - busybox 图像没有安装 curl
      • 172.17.0.1
      • 10.0.0.2

    带有 Hyperkit 的 Mac OS

    假设你有一台 Mac OS 机器并且你已经在端口 8080 上配置了 nginx

    • $ minikube start --driver=hyperkit
    • $ ifconfig:
      • bridge100
      • enX - “物理”接口

    免责声明!

    您需要在防火墙中允许与localhost 之外的 nginx 的连接或完全禁用它(不推荐!)

    bridge100: flags=8a63<UP,BROADCAST,SMART,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
        <---->
        inet 192.168.64.1 netmask 0xffffff00 broadcast 192.168.64.255
        <---->
    
    enX: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        <----> 
        inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.0.255 
        <---->
    

    然后你可以生成一个 pod 来检查你是否可以连接到你的 nginx:

    • $ kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
    • $ wget -q0 - IP_ADDRESS - busybox 图像没有安装 curl
      • 192.168.64.1:8080
      • 192.168.1.101:8080

    带有 Virtualbox 的 Windows

    当您在 Windows 中使用 --driver=virtualbox 创建 minikube 实例时,它会创建带有 2 个网络接口的 VM

    • NAT - 用于与外部(互联网)通信
    • Virtualbox Host-Only Ethernet Adapter - 用于在 minikube 和您的主机之间进行通信

    假设您有一台装有 Virtualbox 的 Windows 机器,您已经在端口 80 上配置了 nginx,并且您还有一个正在运行的 minikube 实例。

    您需要获取 ($ ipconfig) 的 IP 地址:

    • 你的“物理”界面(例如Ethernet X
    • 你的Virtualbox Host-Only Ethernet Adapter
    Ethernet adapter Ethernet X:
       <----> 
       IPv4 Address. . . . . . . . . . . : 192.168.1.3 
       Subnet Mask . . . . . . . . . . . : 255.255.255.0
       Default Gateway . . . . . . . . . : 192.168.0.1
    
    Ethernet adapter VirtualBox Host-Only Network #X:
       <---> 
       IPv4 Address. . . . . . . . . . . : 192.168.99.1 
       Subnet Mask . . . . . . . . . . . : 255.255.255.0
       Default Gateway . . . . . . . . . :
    

    免责声明!

    您需要检查您的防火墙是否会接受发往 ngin 的流量(如果没有被阻止)。

    然后你可以生成一个 pod 来检查你是否可以连接到你的 nginx:

    • $ kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
    • $ wget -q0 - IP_ADDRESS - busybox 图像没有安装 curl
      • 192.168.99.1
      • 192.168.1.3

    【讨论】:

      【解决方案2】:

      是的,默认情况下,您可以将流量从您的 pod 路由到本地机器。 确保在连接到在您的计算机上本地运行的 Web 服务器时使用本地计算机 IP 而不是 localhost

      【讨论】:

        猜你喜欢
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多