尝试将端点从 kubernetes pod 公开到互联网/浏览器/API

Trying to expose an endpoint from a kubernetes pod to the internet/ browser/ API

我想做什么

尝试在启用了 WSL 2 的 Windows 11 平台上并使用 Powershell,Docker 在 Windows、kubectl 和 minikube。这对于解决我的开发环境至关重要。

会发生什么

根据我在文档和网上找到的任何内容,我将 Loadbalancer 视为用于 <> 的选项。隧道似乎从未发生过。我使用浏览器和 curl 进行了测试。

环境信息

命令 - 已执行

这是我创建服务时执行的命令。

1。创建部署

~ kubectl create deployment hello-world3 --image=nginx:mainline-alpine
deployment.apps/hello-world3 created

~ kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
hello-world3   1/1     1            1           19s

2。公开出站

~ kubectl expose deployment hello-world3 --type=LoadBalancer --port=8080
service/hello-world3 exposed

~ kubectl get svc
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-world3   LoadBalancer   10.103.203.156   127.0.0.1     8080:30300/TCP   14s
kubernetes     ClusterIP      10.96.0.1        <none>        443/TCP          6d8h

3。创建隧道服务

~ minikube service hello-world3
|-----------|--------------|-------------|---------------------------|
| NAMESPACE |     NAME     | TARGET PORT |            URL            |
|-----------|--------------|-------------|---------------------------|
| default   | hello-world3 |        8080 | http://192.168.49.2:30300 |
|-----------|--------------|-------------|---------------------------|
* Starting tunnel for service hello-world3.
|-----------|--------------|-------------|------------------------|
| NAMESPACE |     NAME     | TARGET PORT |          URL           |
|-----------|--------------|-------------|------------------------|
| default   | hello-world3 |             | http://127.0.0.1:62864 |
|-----------|--------------|-------------|------------------------|
* Opening service default/hello-world3 in default browser...
! Because you are using a Docker driver on windows, the terminal needs to be open to run it.

我希望在连接到 http://127.0.0.1:8080

时看到“Nginx 欢迎”页面

但它是

This site can’t be reached. The connection was reset.
Try:
Checking the connection
Checking the proxy and the firewall
Running Windows Network Diagnostics
ERR_CONNECTION_RESET

同样发生在: http://127.0.0.1:62864/

我使用 curl 时的输出

~ curl http://127.0.0.1:8080/* -v
VERBOSE: GET with 0-byte payload
curl : The underlying connection was closed: An unexpected error occurred on a receive.
At line:1 char:1
+ curl http://127.0.0.1:8080/ -v
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
~ curl http://127.0.0.1:62864/ -v
VERBOSE: GET with 0-byte payload
curl : The underlying connection was closed: An unexpected error occurred on a receive.
At line:1 char:1
+ curl http://127.0.0.1:62864/ -v
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
kubectl expose deployment hello-world3 --type=LoadBalancer --port=8080

您可以使用 kubectl get svc hello-world3 -o yaml 检查使用上述命令时发生的情况,并查看端口部分:

ports:
- nodePort: 30514
  port:8080
  protocol: TCP
  targetPort:8080

如您所见,targetPort 已设置为与 port 相同的端口。你可以阅读更多here

Note: A Service can map any incoming port to a targetPort. By default and for convenience, the targetPort is set to the same value as the port field.

您看不到 nginx 页面,因为 targetPort 应该设置为 80,它默认由 pods 监听,而不是 8080

要解决您的问题,您可以将 targetPort 设置为端口 80 ,方法是将 --target-port=80 添加到您的命令中,如下所示:

kubectl expose deployment hello-world3 --type=LoadBalancer --port=8080 --target-port=80

在 Windows 机器上使用 Kubernetes 的更方便的选项是在 Settings>Kubernetes 的 Docker 桌面中设置 Enable Kubernetes 选项。集群将自动创建,您将能够在几分钟内在终端或 powershell 中使用 kubectl 命令。如果出现问题,您可以通过单击 Reset Kubernetes Cluster 按钮轻松重置集群,该按钮与您在 Docker 桌面中启用 Kubernetes 时位于同一位置。