![VMWare Workstation 和 Windows 10:无法连接到 VM 上托管的服务器](https://linux22.com/image/772981/VMWare%20Workstation%20%E5%92%8C%20Windows%2010%EF%BC%9A%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%20VM%20%E4%B8%8A%E6%89%98%E7%AE%A1%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我在 VMWare Workstation 15 上配置了一个私有的 2 节点 Kubernetes 集群。我正在使用 MetalLB 和 Calico。入口服务和入口如下所示:
xxx@c1-cp1:~/Desktop$ kubectl get svc -n ingress-controller-2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wsnginx-ingress-nginx-controller LoadBalancer 10.109.117.222 192.168.44.136 80:30167/TCP,443:30680/TCP 24h
wsnginx-ingress-nginx-controller-admission ClusterIP 10.105.103.165 <none> 443/TCP 24h
xxx@c1-cp1:~/Desktop$ kubectl get ing apollo-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
apollo-ingress wsnginx test.xxx.com 192.168.44.136 80 3h17m
我正在使用 Nat 网络适配器和静态 IPS。我的端口转发配置如下
curl -D- http://192.168.44.136 -H 'Host: test.xxx.com'
来自 VM,返回 200 状态,但是我无法从主机 Win10 访问它,127.0.0.1:8080
因为我得到了一个404 NGINX NotFound
。
你能帮帮我吗?我做错了什么?我还能怎样在我的私人网络中暴露它?谢谢!
更新 我不确定这是否是正确的方法,但我设法通过稍微更改 Ingress 资源从主机进行连接。我在注释中输入了主机参数,如下所示
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: apollo-ingress
spec:
ingressClassName: wsnginx
rules:
#- host: test.xxx.com
- http:
paths:
- backend:
service:
name: apollo-service
port:
number: 80
path: /
pathType: Prefix
现在我的入口看起来像这样
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
default ingress.networking.k8s.io/apollo-ingress wsnginx * 192.168.44.136 80 3h31m
看来我现在也可以从主机访问它了。我有一个 Rest API,所以我刚刚从浏览器中打开了它http://127.0.0.1:8080
答案1
这看起来像是一个缺少 HTTP 标头的简单问题。
首先,简单解释一下:每当在 Ingress 清单中指定
一个字段时,将只接受来自该主机的连接。此信息是从HTTP 标头中提取的。如果您未在 Ingress 清单中指定字段,则将接受来自所有来源的请求。Host
Host
Host
您第一次确实正确发送了请求
curl -D- http://192.168.44.136 -H 'Host: test.xxx.com'
但第二次忘记了。
上面的 Powershell 等效于
Invoke-WebRequest -Uri http://127.0.0.1 -Headers @{"Host"="test.xxx.com"}
从命令行完成这一切很容易,但从 Web 浏览器发送请求则稍微困难一些。默认情况下,Web 浏览器不允许您修改请求以包含正确的Host
标头。但是,可以使用扩展来实现此类功能: