【问题标题】:NodePort service is not externally accessible via `port` numberNodePort 服务不能通过“端口”号从外部访问
【发布时间】:2017-08-24 22:38:41
【问题描述】:

我有以下服务配置:

kind: Service
apiVersion: v1
metadata:
  name: web-srv
spec:
  type: NodePort
  selector:
    app: userapp
    tier: web
  ports:
    - protocol: TCP
      port: 8090
      targetPort: 80
      nodePort: 31000

并且 nginx 容器位于该服务的后面。虽然我可以通过nodePort 访问服务,但无法通过port 字段访问服务。我可以看到带有 kubectl 和 Kubernetes 仪表板的配置,但 curl 连接到该端口(例如 curl http://192.168.0.100:8090)会引发 Connection Refused 错误。

我不确定这里有什么问题。我是否需要确保任何代理服务都在节点或容器内运行?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    获取kubernetes服务的IP,然后打8090;它会起作用的。 nodePort 表示服务绑定到节点的 31000 端口。

    以下是 3 件可行的方法:

    curl <node-ip>:<node-port>        # curl <node-ip>:31000
    curl <service-ip>:<service-port>  # curl <svc-ip>:8090
    curl <pod-ip>:<target-port>       # curl <pod-ip>:80
    

    那么现在,让我们看看 3 种情况:

    1.你在 Kubernetes 集群中(你是一个 pod)

    &lt;service-ip&gt;&lt;pod-ip&gt;&lt;node-ip&gt; 可以工作。

    2。你在节点上

    &lt;service-ip&gt;&lt;pod-ip&gt;&lt;node-ip&gt; 可以工作。

    3.你在节点外

    假设&lt;node-ip&gt; 是可访问的,只有&lt;node-ip&gt; 可以工作。

    【讨论】:

    • 这对我来说完全有意义。我将对此进行测试,+1 以获得清晰的解释。
    • 嗯,我在外部 IP 列中看到了 &lt;nodes&gt;,在该服务的集群 IP 中看到了类似 10.0.0.91 的内容。这是什么意思? (对不起,如果问题太基本了)
    • 所有这些似乎都只适合我。我使用kubectl describe service &lt;my-service&gt; 来获取&lt;service-ip&gt;。我的服务将port 设置为80targetPort 设置为8080,并将nodePort 设置为31000。这些选项都不起作用。我们还有其他事情要做吗?
    • 如果有人正在寻找 #3 并且遇到与我相同的问题,在相关节点上添加 iptables -A FORWARD -j ACCEPT 也会有所帮助。查看接受的答案here
    【解决方案2】:

    行为与预期一致,因为我假设您正尝试从集群外部访问该服务。这意味着只有nodePort 将服务公开给集群外部的世界。 port 指的是 pod 上的端口,由 pod 内的容器公开。这通常是支持通常由负载均衡器表示的服务集群的理想行为。所以负载均衡器会暴露你想要的服务端口(例如load-balancer:80)并转发到所有节点上的nodePort来分配负载。

    如果您从集群内部访问该服务,您应该能够通过service-name:service-port 访问它,这要归功于内置的 DNS。

    更多详细信息,请访问docs

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2021-11-20
      • 2020-09-18
      • 2019-07-26
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多