【问题标题】:Access NodePort service from another machine in the same network从同一网络中的另一台机器访问 NodePort 服务
【发布时间】:2023-03-21 21:26:01
【问题描述】:

我在我的 Mac 上安装了 minikube,并为我的 nodejs 应用程序创建了部署和服务。我通过使用以下命令获取我的服务的 URL 来测试一切正常:

minikube service my-nodejs-app --url 然后我在浏览器中运行这个 URL 并得到结果。问题是当我尝试从同一网络内的另一台机器访问相同的 URL 时它不起作用。

我的服务 .yml 文件是:

apiVersion: v1
kind: Service
metadata:
  name: my-nodejs-app
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 1337 
    protocol: TCP
    name: app-server
  selector:
    app:  my-nodejs-app  

我尝试使用端口转发将我的 pod 端口转发到我的本地主机,它仅适用于托管集群的同一台机器,并且当我尝试从同一网络上的另一台机器访问时(通过机器的 IP 地址)集群部署在哪里)我仍然找不到页面。

在此先感谢您的帮助。

【问题讨论】:

    标签: kubernetes kubectl minikube


    【解决方案1】:

    您可以使用"port forward a service"。假设:

    • 你的本地机器IP:166.6.6.6(包含minikube)
    • 你的minikube IP:192.168.99.100(使用命令$minikube ip查看真实IP)
    • 你的服务'my-nodejs-app'的nodePort:31000(检查真实 带有命令的节点端口:$kubectl get service)

    为了远程访问你的服务,你可以在你的本地机器上通过以下命令将一个端口(比如31000,推荐和nodePort同一个端口)转发给你的服务:

    ssh -i ~/.minikube/machines/minikube/id_rsa docker@$(minikube ip) -L \*:31000:0.0.0.0:31000

    然后你就可以通过URL访问你的服务了:http://166.6.6.6:31000,会转发到你的服务URLhttp://192.168.99.100:31000

    谢谢:https://github.com/kubernetes/minikube/issues/877

    【讨论】:

      【解决方案2】:

      可能有点晚了,但如果还有人遇到这个问题-

      1. 检查服务列表以及要公开的服务(如果存在)
      kubectl get svc -n {namespace_name}
      
      1. 如果是集群 IP 类型,请将类型更改为 NodePort。
      kubectl patch svc {service_name} -n {namespace_name} --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'
      
      1. 现在为同一网络上的其他计算机公开上述可供本地计算机使用的节点端口:
      service_port=$(minikube service {service_name} -n {namespace_name} --url | cut -d':' -f3)
      ssh -i ~/.minikube/machines/minikube/id_rsa docker@$(minikube ip) -NL \*:${service_port}:0.0.0.0:${service_port}
      

      现在您只需点击链接-
      {your_hostname}:{node_port}

      ,即可从同一网络上的其他机器访问上述服务

      【讨论】:

        【解决方案3】:

        听起来像是从另一台机器访问它与将服务公开到网络相比。 在这种情况下,您需要查看 spec/type:LoadBalancer (http://kubernetes.io/docs/user-guide/load-balancer/) 也就是说,使用 minikube,我会坚持使用一台机器并且只进行开发测试

        【讨论】:

        • 谢谢,但我正在开发一个移动应用程序,当我尝试在真正的移动设备上测试该应用程序时,这是不可能的,因为我无法从我的移动设备访问该服务。顺便说一句 - 我找到了一种方法,方法是安装一个反向代理(NGINX),将请求转发到我的服务,但我想知道是否有更好的方法..
        • 您是否考虑过使用负载均衡器类型设置服务?因为这是更好的方式(kubernetes 方式),这就是我上面的意思
        • 在 minikube 中不能使用 LoadBalancer 服务类型必须是 NodePort
        • 好吧,我的错;我猜你正在使用 nginx 代理
        【解决方案4】:

        如果我正确理解您的问题:

        你的机器IP:192.168.1.4 您的 minikube IP:192.168.99.100 从您机器上的浏览器访问您的服务:http://192.168.99.100:30080

        现在,假设您在另一台机器上,例如192.168.1.5,并且您想要访问此服务。

        问题是您需要将您机器的端口映射到 minikube 的 30080,因为 minikube 是在您的机器上运行的虚拟机(无法从您的机器外部访问)。

        所以你可以试试:Virtualbox "port forward" from Guest to Host

        另一种方法是使用 kubectl port-forward 将端口从本地主机直接转发到 pod(不幸的是,不是 k8s svc)。

        【讨论】:

        • 嗨@iamnat,我尝试了kubectl port-forward(这似乎是最好的解决方案)但它不起作用......我可以在VirtualBox上尝试“端口转发”方法但不要您认为将 NGINX 安装为反向代理更好吗? (这是我目前的工作解决方案..)
        【解决方案5】:

        您没有在端口中指定 nodePort。 在端口添加以下配置

        节点端口:30000

        您可以通过 http://[IP 地址]:30000 访问您的服务

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-06
          • 2019-10-05
          • 2011-03-30
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          相关资源
          最近更新 更多