2017-05-04 26 views
3

外部访问的我有以下的服务配置:NodePort服务不是通过`port`数

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)会产生连接拒绝错误。

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

回答

3

获取kubernetes服务的IP,然后点击8090;它会工作。 nodePort意味着服务在端口31000

绑定到节点这些都是三样东西,将工作:

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集群(你是一个吊舱)

<service-ip><pod-ip><node-ip>将工作。

2.您是节点

<service-ip><pod-ip><node-ip>会努力。

3.您节点

只有<node-ip>将工作假设<node-ip>可达之外。

+0

这对我完全有意义。我会对此进行测试,+1进行清晰的解释。 –

+0

hmm,我在外部IP列中看到'',并在该服务的集群IP中看到'10.0.0.91'。这是什么意思? (对不起,如果这个问题太基本了) –

+0

所有这些似乎只是对我而言。我用'kubectl describe服务'来得到''。我的服务有'端口'设为'80','targetPort'设为'8080','nodePort'设为'31000'。这些选项都没有奏效。我们应该做些什么吗? – abrarisme

0

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

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

更多详细信息可在docs找到。