2017-05-04 34 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找到。