NodePort服务不能通过`port`号从外部访问

时间:2017-05-04 17:20:34

标签: kubernetes

我有以下服务配置:

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)会引发连接被拒绝错误。

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

2 个答案:

答案 0 :(得分:17)

获取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)

<service-ip><pod-ip>以及<node-ip>将有效。

<强> 2。您在节点上

<service-ip><pod-ip>以及<node-ip>将有效。

第3。您在节点之外

假设<node-ip>可以访问,只有<node-ip>才有效。

答案 1 :(得分:0)

由于我假设您尝试从群集外部访问服务,因此行为符合预期。这意味着只有port将服务公开给集群外的世界。 load-balancer:80指的是容器上的端口,由容器内的容器暴露。这通常是期望的行为,以支持通常由负载均衡器表示的服务集群。因此,负载均衡器将公开您所需的服务端口(例如service-name:service-port)并转发到所有节点上的nodePort以分配负载。

如果您从群集内部访问该服务,则应该可以通过{{1}}访问该服务,这要归功于内置的DNS。

可以在docs找到更详细的信息。