簡體   English   中英

無法訪問 Kubernetes 集群外的 NodePort 服務

[英]Cannot access NodePort service outside Kubernetes cluster

我在 Windows 上,並使用 Docker 桌面使用 WSL 2 部署本地 Kubernetes 集群。我嘗試部署一個 pod 並通過 NodePort 服務公開它,但它無法在集群外部訪問它,所以我無法工作。

以下是重現場景的命令:

kubectl create deployment echoserver --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment echoserver --type=NodePort --port=8080

嘗試在瀏覽器中打開NODE_IP:EXPOSED_PORT或運行 netcat 命令nc NODE_IP EXPOSED_PORT並嘗試發送消息(來自 WSL 或 Windows)不起作用。

  • NODE_IP是 Docker 桌面 K8S 節點的內部 IP (通過查看命令kubectl get nodes -o wide上的INTERNAL-IP列獲得)
  • EXPOSED_PORT是服務暴露的節點端口(通過查看命令kubectl describe service echoserver上的字段NodePort獲得)

在瀏覽器上打開URL應該會遇到這個頁面。 但是,您將收到一般錯誤響應,指出瀏覽器無法訪問 URL。

使用 netcat 命令發送消息應該會遇到 400 Bad Request 響應,因為它不是格式正確的 HTTP 請求。 但是,您根本不會得到任何響應,或者 TCP 連接甚至可能不會在第一個位置進行。

嘗試從集群內部與服務和/或 pod 通信,例如,通過另一個 pod,可以完美地工作。 使用命令kubectl port-forward deployment/echoserver 2311:8080在本地端口轉發部署,然后在瀏覽器中或通過 netcat 訪問localhost:2311也可以正常工作(在 WSL 和 Windows 中)。

如果您想不使用 localhost 訪問它,則應使用<windows_hosts's_IP:NodePort>

因此,部署您的部署和服務:

$kubectl get svc,deploy
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/echoserver   NodePort    10.105.169.2   <none>        8080:31570/TCP   4m12s
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          5m3s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/echoserver   1/1     1            1           4m19s

您可以使用localhost:31570或 <windows_hosts's_IP:NodePort> 訪問它。

就我而言, 192.168.0.29是我的 Windows 主機的 IP:

curl.exe 192.168.0.29:31570
CLIENT VALUES:
client_address=192.168.65.3
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.0.29:8080/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM