我无法连接到以nginx入口运行的应用程序(Docker桌面赢10)。
nginx- ingress控制器容器正在运行,应用程序运行良好,并且我已经创建了一个入口。但是,当我尝试连接到本地主机上的应用程序时,出现“连接被拒绝”的提示。
我在日志中看到此错误:
[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安全性或skype。摘录自netstat -a -b:
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可以在Web服务器容器中本地访问URL。
http://localhost:28000/health
/health
感谢您提供的任何帮助。
编辑:
我尝试更改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(仅入口线):
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:
netstat -a -n -o -b端口80的输出:
netstat -a -n -o -b
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 Can not obtain ownership information
我已经设法在Windows的Docker上的Kubernetes中创建Ingress资源。
重现步骤 :
windows/quick-start/enable-hyper-v)
在具有管理员访问权限的Powershell中,运行以下命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
系统可能会要求您重新启动计算机。
使用所有默认选项安装Docker应用程序并启用Kubernetes
安装kubectl。
运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml
重新启动机器。在cmd以管理员身份运行的提示下,执行以下操作:使用 net stop http 停止列出的服务services.msc
cmd
net stop http
services.msc
使用:netstat -a -n -o -b检查端口80上侦听的其他进程。
以下是具有可响应请求的Pod的简单部署:
apiVersion: apps/v1 kind: Deployment metadata: name: hello spec: selector: matchLabels: app: hello version: 2.0.0 replicas: 3 template: metadata: labels: app: hello version: 2.0.0 spec: containers: - name: hello image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50001"
通过运行命令应用它:
$ kubectl apply -f file_name.yaml
为了使Pod能够与您进行通信,您需要创建服务。
下面的例子:
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: app: hello version: 2.0.0 ports: - name: http protocol: TCP port: 80 targetPort: 50001
通过运行以下命令来应用此服务定义:
以下是使用上面创建的服务的简单Ingress资源:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: hello-ingress spec: rules: - host: kubernetes.docker.internal http: paths: - path: / backend: serviceName: hello-service servicePort: http
看一眼:
spec: rules: - host: hello-test.internal
hello-test.internal将用作hostname连接到您的广告连播。
hello-test.internal
hostname
通过调用命令来应用您的Ingress资源:
我找到了这个Github链接,该链接可让您通过连接到Ingress资源hostname。
为此,127.0.0.1 hello- test.internal请在C:\Windows\System32\drivers\etc\hosts文件中添加一行并保存。您将需要管理员权限才能执行此操作。
127.0.0.1 hello- test.internal
C:\Windows\System32\drivers\etc\hosts
编辑: Windows的最新版本的Docker桌面已经添加了一个主机文件条目: 127.0.0.1 kubernetes.docker.internal
127.0.0.1 kubernetes.docker.internal
通过调用命令显示有关Ingress资源的信息: kubectl get ingress
kubectl get ingress
它应该显示:
NAME HOSTS ADDRESS PORTS AGE hello-ingress hello-test.internal localhost 80 6m2s
现在,您可以打开网络浏览器并输入以下内容来访问Ingress资源
http://kubernetes.docker.internal/
浏览器应输出:
Hello, world! Version: 2.0.0 Hostname: hello-84d554cbdf-2lr76
Hostname: hello-84d554cbdf-2lr76 是所回复的广告连播的名称。
Hostname: hello-84d554cbdf-2lr76
:如果此解决方案不工作与命令请检查连接 netstat -a -n -o ( 使用管理员权限 ,如果事情没有使用端口80)。
netstat -a -n -o