如何解决无法访问 Kubernetes 集群外的 NodePort 服务
我使用的是 Windows 并使用 Docker Desktop 使用 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 Desktop K8S 节点的内部IP(通过查看命令INTERNAL-IP
上的kubectl get nodes -o wide
列获得) -
EXPOSED_PORT
是服务暴露的节点端口(通过查看命令NodePort
上的字段kubectl describe service echoserver
获得)
在浏览器上打开 URL 应该会遇到 this 页面。但是,您会收到一个通用错误响应,指出浏览器无法访问该 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
或
就我而言,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/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。