无法在 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 访问服务的可用选项:
- 最快最简单(负载均衡器)
设置 service
类型 LoadBalancer
。 EXTERNAL-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
的浏览器中可用。
- 使用虚拟机的 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
的浏览器中可用。
- 端口转发 - 用于测试目的
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
有用的链接:
首先,这是我的文件夹:
这是我的 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 访问服务的可用选项:
- 最快最简单(负载均衡器)
设置 service
类型 LoadBalancer
。 EXTERNAL-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
的浏览器中可用。
- 使用虚拟机的 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
的浏览器中可用。
- 端口转发 - 用于测试目的
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 + nodeportloadbalancer
不起作用,即使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