我无法连接到运行nginx ingress(Docker Desktop win 10)的应用程序。
nginx-ingress控制器pod正在运行,应用程序正常,我已经创建了一个ingress。但是,当我尝试连接到localhost上的应用程序时,我得到“连接拒绝”。
我在日志中看到这个错误:
[14:13:13.028][VpnKit ][Info ] vpnkit.exe: Connected Ethernet interface f6:16:36:bc:f9:c6
[14:13:13.028][VpnKit ][Info ] vpnkit.exe: UDP interface connected on 10.96.181.150
[14:13:22.320][GoBackendProcess ][Info ] Adding vpnkit-k8s-controller tcp forward from 0.0.0.0:80 to 10.96.47.183:80
[14:13:22.323][ApiProxy ][Error ] time="2019-12-09T14:13:22-05:00" msg="Port 443 for service ingress-nginx is already opened by another service"
我认为端口443被另一个应用程序使用,可能是zscaler security或skype。摘自netstat -a -b
:
[svchost.exe]
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 16012
[com.docker.backend.exe]
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 8220
我不知道怎么打开入口。请帮帮忙!
我的入口:
$ kubectl describe ing kbvalues-deployment-dev-ingress
Name: kbvalues-deployment-dev-ingress
Namespace: default
Address: localhost
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
localhost
/ kbvalues-deployment-dev-frontend:28000 (10.1.0.174:8080)
Annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/cors-allow-headers: X-Forwarded-For, X-app123-XPTO
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 42m nginx-ingress-controller Ingress default/kbvalues-deployment-dev-ingress
Normal UPDATE 6s (x5 over 42m) nginx-ingress-controller Ingress default/kbvalues-deployment-dev-ingress
我的服务:
$ kubectl describe svc kbvalues-deployment-dev-frontend
Name: kbvalues-deployment-dev-frontend
Namespace: default
Labels: chart=tomcat-sidecar-war-1.0.4
environment=dev
name=kbvalues-frontend-dev
release=kbvalues-test
tier=frontend
Annotations: <none>
Selector: app=kbvalues-dev
Type: ClusterIP
IP: 10.98.89.94
Port: <unset> 28000/TCP
TargetPort: 8080/TCP
Endpoints: 10.1.0.174:8080
Session Affinity: None
Events: <none>
我正在尝试访问应用程序:http://localhost:28000/health
。我验证了/health
URL可以在Web服务器容器中本地访问。
我很感激你能提供的任何帮助。
编辑:
我尝试修改ingress-nginx服务来删除HTTPS,如下所示:https://stackoverflow.com/a/56303330/166850
这消除了日志中的443错误,但没有修复我的设置(仍然被拒绝连接)。
**编辑2:**下面是Ingress YAML定义(kubectl get -o yaml):
$ kubectl get ing -o yaml
apiVersion: v1
items:
- apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
creationTimestamp: "2019-12-09T18:47:33Z"
generation: 5
name: kbvalues-deployment-dev-ingress
namespace: default
resourceVersion: "20414"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/kbvalues-deployment-dev-ingress
uid: 5c34bf7f-1ab4-11ea-80e4-00155d169409
spec:
rules:
- host: localhost
http:
paths:
- backend:
serviceName: kbvalues-deployment-dev-frontend
servicePort: 28000
path: /
status:
loadBalancer:
ingress:
- hostname: localhost
kind: List
metadata:
resourceVersion: ""
selfLink: ""
编辑3:kubectl get svc -A
的输出(仅入口线路):
ingress-nginx ingress-nginx LoadBalancer 10.96.47.183 localhost 80:30470/TCP 21h
**编辑4:**我试图从Windows HyperV获取VM的IP地址,但VM似乎没有IP?
PS C:\> (Get-VMNetworkAdapter -VMName DockerDesktopVM)
Name IsManagementOs VMName SwitchName MacAddress Status IPAddresses
---- -------------- ------ ---------- ---------- ------ -----------
Network Adapter False DockerDesktopVM DockerNAT 00155D169409 {Ok} {}
编辑5:
端口80的netstat -a -n -o -b
输出:
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
Can not obtain ownership information
5条答案
按热度按时间epfja78i1#
我已经在Windows中的Docker上的Kubernetes中创建了Ingress资源。
复制步骤:
启用Hyper-V
从具有管理员访问权限的PowerShell运行以下命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
系统可能会要求您重新启动计算机。
安装Windows版Docker并开启Kubernetes
使用所有默认选项安装Docker应用程序并启用Kubernetes
连接kubectl
安装kubectl。
开启Ingress
运行以下命令:
**编辑:**确保没有其他服务使用80端口
重新启动计算机。在以admin身份运行的
cmd
提示符下,执行以下操作:net stop http
使用services.msc
停止列出的服务用途:
netstat -a -n -o -b
并检查是否有其他进程侦听端口80。创建部署
下面是使用pod进行的简单部署,它将回复请求:
通过运行以下命令来应用它:
$ kubectl apply -f file_name.yaml
创建服务
为了让pod能够与您进行通信,您需要创建一个服务。
示例如下:
通过运行以下命令应用此服务定义:
$ kubectl apply -f file_name.yaml
创建Ingress资源
下面是使用上面创建的服务的简单Ingress资源:
请看:
hello-test.internal
将用作hostname
连接到您的pod。通过调用以下命令来应用Ingress资源:
$ kubectl apply -f file_name.yaml
将host添加到本地hosts文件中
我发现这个Github link可以让你通过
hostname
连接到你的Ingress资源。要做到这一点,请在
C:\Windows\System32\drivers\etc\hosts
文件中添加一行127.0.0.1 hello-test.internal
并保存它。您需要管理员权限才能执行此操作。**编辑:**最新版本的Docker Desktop for Windows已经添加了hosts文件条目:
127.0.0.1 kubernetes.docker.internal
测试
调用命令显示Ingress资源信息:
kubectl get ingress
应显示:
现在,您可以通过打开Web浏览器并键入以下内容来访问Ingress资源
http://kubernetes.docker.internal/
浏览器应输出:
Hostname: hello-84d554cbdf-2lr76
是回复的pod的名称。如果此解决方案不起作用,请使用以下命令检查连接:
netstat -a -n -o
(具有管理员权限),如果没有使用端口80。nr9pn0ug2#
在Windows上,Kubernetes集群在VM中运行。尝试在该VM的IP地址而不是
localhost
上访问ingress。3pvhb19x3#
如果你想在localhost上访问ingress,而不需要任何特殊的主机名,只要启用ingress nginx控制器就足够了:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
您甚至不需要在Ingress中指定
-host
参数。如果您有一个特殊的主机名,例如my-test.com,您必须将域添加到/etc/hosts
文件中。我希望它能帮助某人!
hmtdttj44#
我面临着类似的问题,而部署ingress-nginx控制器使用手动步骤提到的bareMetal节点在ingress-nginx-deploy,但面临着一个问题,但提到的链接Github link提到的@RMorrisey,导致其他线程,他们提到安装ingress-nginx使用步骤提到的mac和它的工作没有作出cny更改主机文件等
twh00eeo5#
问题是你的服务有一个ClusterIP类型,这是外部无法访问的。你需要它是NodePort类型,这是在Dawid Kruk的指令中完成的。