无法在 Windows Docker 桌面上使用 Kubernetes 连接到 NodePort 上的服务

Cannot connect to service on NodePort using Kubernetes on Windows Docker Desktop

首先,这是我的文件夹:

这是我的 Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "PlatformService.dll"]

platforms-depl.yaml(部署文件)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: platforms-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: platformservice
  template:
    metadata:
      labels:
        app: platformservice
    spec:
      containers:
        - name: platformservice
          image: hao14102000/platformservice:latest

platforms-np-srv.yaml(节点端口服务文件)

apiVersion: v1
kind: Service
metadata:
  name: platformnpservice-srv
spec:
  type: NodePort
  selector:
    app: platformservice
  ports:
    - name: platformservice
      protocol: TCP
      port: 80
      targetPort: 80

当我应用 2 个文件时,这是我看到的:

当我尝试使用以下两个选项连接端口 31023 时:

http://localhost:31023/api/platforms
http://10.109.215.230:31023/api/platforms

没用。发生这种情况:

我不知道这有什么问题...

Linux 个容器发生了什么:

Kubernetes on Windows Docker Desktop 默认情况下 运行WSL2 中的组件(Windows Linux 的子系统),它是独立的虚拟机它自己的 IP 地址和 localhost。这就是无法从主机 OS(在本例中为 Windows)访问 localhost 上的服务的原因。

另一个选项是在设置中禁用 using WSL2 based engine,而不是使用 hyper-v 并创建虚拟机,但是在 Docker Desktop 中据说最好使用 WSL2性能优势。

如何使用 WSL2 访问服务的可用选项:

  1. 最快最简单(负载均衡器)

设置 service 类型 LoadBalancerEXTERNAL-IP 将是立即解决所有问题的本地主机。例如:

kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP          11m
nginx        LoadBalancer   10.110.15.53   localhost     8080:30654/TCP   4m10s

Nginx 在 localhost:8080 的浏览器中可用。

  1. 使用虚拟机的 IP 和节点端口

另一种选择是找到 WSL 虚拟机,然后在此 IP 和 nodeport.

上访问服务

要找到WSL VM地址,你需要运行 wsl命令连接到这个VM然后找到它的IP地址:

wsl

# ip a | grep eth0

6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 172.19.xxx.yyy/20 brd 172.19.xxx.yyy scope global eth0

Nginx 在 172.19.xxx.yyy:30654 的浏览器中可用。

  1. 端口转发 - 用于测试目的

Port-forward 可用于测试目的,但不应在生产系统上使用。

要启动服务代理,运行以下命令:

kubectl port-forward service/nginx 8080:80 &

Nginx 在 localhost:8080

的浏览器中可用

使用 Hyper-V 时的假设

首先 hyper-v 应该安装在主机上。请注意,并非所有版本的 Windows 都受支持。请参阅文档了解哪些版本以及如何启用 hyper-v here.

using WSL2 based engine被删除select时,hyper-v用于容器。它创建了一个单独的虚拟机,可以在 Hyper-v Manager.

中找到
  • nodeport 适用于 localhost + nodeport
  • loadbalancer 不起作用,即使 External-IP 显示 localhost.
  • ,您也无法使用服务端口连接到 localhost

Windows Windows Docker 桌面上的容器

也可以在 Windows Docker 桌面上 运行 Windows 容器。

需要更改将要使用的守护进程。在 switch to Windows containers 上的托盘 select 中。 Switch between linux and windows containers.

但是 kubernetes 选项将变得不可用,因为 control plane 组件被设计为 运行 在 linux 主机上。

环境:

OS:Windows 10 企业版,内部版本:19041.1165

Docker 桌面:4.0.0 (67817)

引擎:20.10.8

Kubernetes:1.21.4

有用的链接: