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

Kel*_*vin 8 docker kubernetes asp.net-core-webapi docker-desktop .net-5

首先,这是我的文件夹:

在此输入图像描述

这是我的 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"]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

platforms-np-srv.yaml(NodePort 服务文件)

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

Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

http://localhost:31023/api/platforms
http://10.109.215.230:31023/api/platforms
Run Code Online (Sandbox Code Playgroud)

这不起作用。有时候是这样的:

在此输入图像描述

在此输入图像描述

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

moo*_*tte 8

Linux 容器会发生什么:

Windows Docker Desktop 上的 Kubernetes 默认在 WSL2(Linux 的 Windows 子系统)中运行其组件,它是具有自己的 IP 地址和localhost. localhost这就是无法从主机操作系统(在本例中为 Windows)访问服务的原因。

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

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

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

设置一个servicewithLoadBalancer类型。EXTERNAL-IP将是 localhost,它会立即解决所有问题。例如:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Nginx 可在172.19.xxx.yyy:30654.

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

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

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

kubectl port-forward service/nginx 8080:80 &
Run Code Online (Sandbox Code Playgroud)

Nginx 可在浏览器中使用localhost:8080

使用 Hyper-V 时的假设

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

using WSL2 based engine取消选择时,hyper-v用于使用容器。它创建一个单独的虚拟机,可以在 中找到Hyper-v Manager

  • nodeport在本地主机 + 节点端口上工作
  • loadbalancer不起作用,localhost即使External-IP显示 ,您也无法连接到服务端口localhost

Windows Docker 桌面上的 Windows 容器

还可以在 Windows Docker Desktop 上运行 Windows 容器。

需要更改将使用的守护进程。在托盘中选择switch to Windows containers在 Linux 和 Windows 容器之间切换

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

环境:

操作系统:Windows 10 企业版,内部版本:19041.1165

Docker 桌面:4.0.0 (67817)

引擎:20.10.8

库伯内特:1.21.4

有用的链接: