.Net Core API Minikube 上的容器不是 运行
.Net Core API container on Minikube not running
我在 Minikube 上部署了一个 .Net Core 5 API,当我尝试从 Postman 调用它时,它没有返回响应。当我 运行 从 Postman 到暴露端口 (32580) 和端点 http:// localhost:32580/api/platforms/
的 GET 我得到:
Error: getaddrinfo ENOTFOUND
奇怪的是,我之前得到了一个 Connection refused
(在我重新启动 Docker 桌面之前)。该容器在我使用 Docker 时运行良好,但一旦我将其部署到 Kubernetes 上下文中,它就不再运行了。
我不确定如何调试容器并获得更有意义的错误详细信息。
我尝试了以下方法:
- 正在检查部署状态 (platforms-depl)
NAME READY UP-TO-DATE AVAILABLE AGE
hello-minikube 1/1 1 1 134d
ping-google 0/1 1 0 2d2h
platforms-depl 1/1 1 1 115m
- 正在检查 Pod 的状态 (platforms-depl-84d7f5bdc6-sgxcp)
NAME READY STATUS RESTARTS AGE
hello-minikube-6ddfcc9757-6mfmf 1/1 Running 21 134d
ping-google-5f84d66fcc-kbb7j 0/1 ImagePullBackOff 151 2d2h
platforms-depl-84d7f5bdc6-sgxcp 1/1 Running 1 115m
- 运行
kubectl describe pod platforms-depl-84d7f5bdc6-sgxcp
给出以下输出 (t运行cated):
Status: Running
IP: 172.17.0.3
IPs:
IP: 172.17.0.3
Controlled By: ReplicaSet/platforms-depl-84d7f5bdc6
Containers:
platformservice:
Container ID: docker://a73ce2dc737206e502df94066247299a6dcb6a038087d0f42ffc6e3b9dd194dd
Image: golide/platformservice:latest
Image ID: docker-pullable://golide/platformservice@sha256:bbed5f1d7238d2c466a6782333f8512d2e464f94aa64d8670214646a81b616c7
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 28 Sep 2021 15:12:22 +0200
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-rl5kf (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
当我 运行 docker ps
我看不到容器,它也没有出现在 VS Code 的 运行ning 容器列表中 Docker/Containers 扩展。
kubectl get services
给我以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.99.23.44 <none> 8080:31378/TCP 134d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 134d
paymentsapi NodePort 10.111.243.3 <none> 5000:30385/TCP 108d
platformnpservice-srv NodePort 10.98.131.95 <none> 80:32580/TCP 2d2h
然后尝试 ping ClusterIP:
Pinging 10.98.131.95 with 32 bytes of data:
Request timed out.
Request timed out.
Ping statistics for 10.98.131.95:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
我错过了什么?
我阅读了一些建议,我必须执行到 pod 中才能获得有意义的输出,但我不确定 运行 的确切命令。我试过了:
kubectl exec POD -p platforms-depl-84d7f5bdc6-sgxcp
只得到错误:
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Error from server (NotFound): pods "POD" not found
我的环境 Docker Linux 带有 WSL2 的容器 Windows 10.
我错过了什么?
首先要注意的是,通常 minikube 有很多可能 drivers to choose from - 在我的例子中,我发现 docker
驱动器最容易使用。
我的设置是:
- WSL2
- Docker 桌面 Docker Desktop WLS 2 backend enabled
我使用以下命令启动 minikube:minikube start --driver=docker
。
如果您使用的是其他驱动程序,我建议您改用 docker
驱动程序。
回答您的问题:
我错过了什么?
通过设置 nodePort 服务类型,您将使用无法从 Windows 主机(使用 docker
驱动程序时)访问的节点 IP 地址公开部署/副本集。这是因为所有 Kubernetes 集群资源都设置在 Docker 容器内,容器是隔离的。
但是,minikube 提供了简单的解决方案,使您的 Windows 主机可以使用指定的 nodePort 服务。 Just run minikube service
command which will create a tunnel。让我们检查一下。
您设置了 platformnpservice-srv
服务,因此您需要在 minikube service
命令中使用此名称,而不是我使用的 testmini
:
minikube service --url testmini
Starting tunnel for service testmini.
|-----------|----------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|----------|-------------|------------------------|
| default | testmini | | http://127.0.0.1:33849 |
|-----------|----------|-------------|------------------------|
http://127.0.0.1:33849
❗ Because you are using a Docker driver on linux, the terminal needs to be open to run it.
注意最后一句话 - 我们需要保持此终端 window 处于打开状态,否则隧道将无法建立。
现在,在我的 Windows 主机上,我在浏览器中打开:http://127.0.0.1:33849/api/platforms
网站。输出如下:
[{"id":1,"name":"Dot Net","publisher":"Microsoft","cost":"Free"},{"id":2,"name":"Linux","publisher":"Ubuntu","cost":"Free"},{"id":3,"name":"Kubernetes","publisher":"CNCF","cost":"Free"},{"id":4,"name":"SQL Express","publisher":"Microsoft","cost":"Free"}]
瞧!似乎一切正常。
此外,其他注意事项:
tried pinging the ClusterIP
ClusterIP 是 internal address which is only accessible from the cluster,因此您无法从 Windows 主机和 WSL2 中 ping 通它。
kubectl exec POD -p platforms-depl-84d7f5bdc6-sgxcp
如输出所示,您需要 specify command you want to exec on the pod。如果你只想得到bashshell,使用下面的:
kubectl exec -it platforms-depl-84d7f5bdc6-sgxcp -- sh
我在 Minikube 上部署了一个 .Net Core 5 API,当我尝试从 Postman 调用它时,它没有返回响应。当我 运行 从 Postman 到暴露端口 (32580) 和端点 http:// localhost:32580/api/platforms/
的 GET 我得到:
Error: getaddrinfo ENOTFOUND
奇怪的是,我之前得到了一个 Connection refused
(在我重新启动 Docker 桌面之前)。该容器在我使用 Docker 时运行良好,但一旦我将其部署到 Kubernetes 上下文中,它就不再运行了。
我不确定如何调试容器并获得更有意义的错误详细信息。
我尝试了以下方法:
- 正在检查部署状态 (platforms-depl)
NAME READY UP-TO-DATE AVAILABLE AGE
hello-minikube 1/1 1 1 134d
ping-google 0/1 1 0 2d2h
platforms-depl 1/1 1 1 115m
- 正在检查 Pod 的状态 (platforms-depl-84d7f5bdc6-sgxcp)
NAME READY STATUS RESTARTS AGE
hello-minikube-6ddfcc9757-6mfmf 1/1 Running 21 134d
ping-google-5f84d66fcc-kbb7j 0/1 ImagePullBackOff 151 2d2h
platforms-depl-84d7f5bdc6-sgxcp 1/1 Running 1 115m
- 运行
kubectl describe pod platforms-depl-84d7f5bdc6-sgxcp
给出以下输出 (t运行cated):
Status: Running
IP: 172.17.0.3
IPs:
IP: 172.17.0.3
Controlled By: ReplicaSet/platforms-depl-84d7f5bdc6
Containers:
platformservice:
Container ID: docker://a73ce2dc737206e502df94066247299a6dcb6a038087d0f42ffc6e3b9dd194dd
Image: golide/platformservice:latest
Image ID: docker-pullable://golide/platformservice@sha256:bbed5f1d7238d2c466a6782333f8512d2e464f94aa64d8670214646a81b616c7
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 28 Sep 2021 15:12:22 +0200
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-rl5kf (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
当我 运行
docker ps
我看不到容器,它也没有出现在 VS Code 的 运行ning 容器列表中 Docker/Containers 扩展。kubectl get services
给我以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.99.23.44 <none> 8080:31378/TCP 134d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 134d
paymentsapi NodePort 10.111.243.3 <none> 5000:30385/TCP 108d
platformnpservice-srv NodePort 10.98.131.95 <none> 80:32580/TCP 2d2h
然后尝试 ping ClusterIP:
Pinging 10.98.131.95 with 32 bytes of data:
Request timed out.
Request timed out.
Ping statistics for 10.98.131.95:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
我错过了什么?
我阅读了一些建议,我必须执行到 pod 中才能获得有意义的输出,但我不确定 运行 的确切命令。我试过了:
kubectl exec POD -p platforms-depl-84d7f5bdc6-sgxcp
只得到错误:
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Error from server (NotFound): pods "POD" not found
我的环境 Docker Linux 带有 WSL2 的容器 Windows 10.
我错过了什么?
首先要注意的是,通常 minikube 有很多可能 drivers to choose from - 在我的例子中,我发现 docker
驱动器最容易使用。
我的设置是:
- WSL2
- Docker 桌面 Docker Desktop WLS 2 backend enabled
我使用以下命令启动 minikube:minikube start --driver=docker
。
如果您使用的是其他驱动程序,我建议您改用 docker
驱动程序。
回答您的问题:
我错过了什么?
通过设置 nodePort 服务类型,您将使用无法从 Windows 主机(使用 docker
驱动程序时)访问的节点 IP 地址公开部署/副本集。这是因为所有 Kubernetes 集群资源都设置在 Docker 容器内,容器是隔离的。
但是,minikube 提供了简单的解决方案,使您的 Windows 主机可以使用指定的 nodePort 服务。 Just run minikube service
command which will create a tunnel。让我们检查一下。
您设置了 platformnpservice-srv
服务,因此您需要在 minikube service
命令中使用此名称,而不是我使用的 testmini
:
minikube service --url testmini
Starting tunnel for service testmini.
|-----------|----------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|----------|-------------|------------------------|
| default | testmini | | http://127.0.0.1:33849 |
|-----------|----------|-------------|------------------------|
http://127.0.0.1:33849
❗ Because you are using a Docker driver on linux, the terminal needs to be open to run it.
注意最后一句话 - 我们需要保持此终端 window 处于打开状态,否则隧道将无法建立。
现在,在我的 Windows 主机上,我在浏览器中打开:http://127.0.0.1:33849/api/platforms
网站。输出如下:
[{"id":1,"name":"Dot Net","publisher":"Microsoft","cost":"Free"},{"id":2,"name":"Linux","publisher":"Ubuntu","cost":"Free"},{"id":3,"name":"Kubernetes","publisher":"CNCF","cost":"Free"},{"id":4,"name":"SQL Express","publisher":"Microsoft","cost":"Free"}]
瞧!似乎一切正常。
此外,其他注意事项:
tried pinging the ClusterIP
ClusterIP 是 internal address which is only accessible from the cluster,因此您无法从 Windows 主机和 WSL2 中 ping 通它。
kubectl exec POD -p platforms-depl-84d7f5bdc6-sgxcp
如输出所示,您需要 specify command you want to exec on the pod。如果你只想得到bashshell,使用下面的:
kubectl exec -it platforms-depl-84d7f5bdc6-sgxcp -- sh