如何在本地访问 nginx ingress?
How can I access nginx ingress on my local?
我无法连接到我的应用程序 运行 nginx ingress(Docker Desktop win 10)。
nginx-ingress controller pod 是 运行,应用程序是健康的,我已经创建了一个入口。但是,当我尝试在本地主机上连接到我的应用程序时,我得到 "connection refused".
我在日志中看到这个错误:
[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:
这消除了日志中的 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 获取虚拟机的 IP 地址,但虚拟机似乎没有 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
在 Windows 上,Kubernetes 集群 运行 在虚拟机中。尝试访问该 VM-s IP 地址上的入口,而不是 localhost
。
我已经在 Windows 的 Docker 上成功地在 Kubernetes 中创建了 Ingress 资源。
重现步骤:
- 启用 Hyper-V
- 为 Windows 安装 Docker 并启用 Kubernetes
- 连接 kubectl
- 启用入口
- 创建部署
- 创建服务
- 创建入口资源
- 将主机添加到本地主机文件
- 测试
启用Hyper-V
从具有管理员权限的 Powershell 运行 下面的命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
系统可能会要求您重新启动计算机。
为 Windows 安装 Docker 并启用 Kubernetes
使用所有默认选项安装 Docker 应用程序并启用 Kubernetes
连接 kubectl
安装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
编辑:确保没有其他服务正在使用端口 80
重启你的机器。在 cmd
提示 运行 中以管理员身份执行:
net stop http
使用 services.msc
停止列出的服务
使用:netstat -a -n -o -b
并检查侦听端口 80 的其他进程。
创建部署
下面是 pods 的简单部署,它将回复请求:
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"
通过运行ning命令应用它:
$ kubectl apply -f file_name.yaml
创建服务
为了 pods 能够让您与他们通信,您需要创建一个服务。
示例如下:
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
通过 运行ning 命令应用此服务定义:
$ kubectl apply -f file_name.yaml
创建 Ingress 资源
下面是使用上面创建的服务的简单 Ingress 资源:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
spec:
rules:
- host: hello-test.internal
http:
paths:
- path: /
backend:
serviceName: hello-service
servicePort: http
看看:
spec:
rules:
- host: hello-test.internal
hello-test.internal
将用作 hostname
连接到您的 pods。
通过调用命令应用您的 Ingress 资源:
$ kubectl apply -f file_name.yaml
将主机添加到本地主机文件
我发现这个 Github link 允许您通过 hostname
连接到您的 Ingress 资源。
要实现这一点,请在 C:\Windows\System32\drivers\etc\hosts
文件中添加一行 127.0.0.1 hello-test.internal
并保存。
您将需要管理员权限才能执行此操作。
编辑: Docker Desktop for Windows 的最新版本已经添加了一个主机文件条目:
127.0.0.1 kubernetes.docker.internal
测试
调用命令显示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
是回复的 pod 的名称。
如果此解决方案不起作用,请使用以下命令检查连接:
netstat -a -n -o
(具有管理员权限)如果某些东西未使用端口 80。
我在部署 ingress-nginx 控制器时遇到了类似的问题,使用 @RMorrisey 提到的 ingress-nginx-deploy however was facing an issue , however referred to the link Github link 处针对裸机节点提到的手动步骤部署 ingress-nginx 控制器,这导致他们提到要安装的其他线程 ingress-nginx 使用为 mac 提到的步骤,它在不对主机文件等进行 cny 更改的情况下工作
问题是您的服务有一种 ClusterIP 类型,无法从外部访问。您需要它是 NodePort 类型,这是 Dawid Kruk 的说明中所做的。
我无法连接到我的应用程序 运行 nginx ingress(Docker Desktop win 10)。
nginx-ingress controller pod 是 运行,应用程序是健康的,我已经创建了一个入口。但是,当我尝试在本地主机上连接到我的应用程序时,我得到 "connection refused".
我在日志中看到这个错误:
[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:
这消除了日志中的 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 获取虚拟机的 IP 地址,但虚拟机似乎没有 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
在 Windows 上,Kubernetes 集群 运行 在虚拟机中。尝试访问该 VM-s IP 地址上的入口,而不是 localhost
。
我已经在 Windows 的 Docker 上成功地在 Kubernetes 中创建了 Ingress 资源。
重现步骤:
- 启用 Hyper-V
- 为 Windows 安装 Docker 并启用 Kubernetes
- 连接 kubectl
- 启用入口
- 创建部署
- 创建服务
- 创建入口资源
- 将主机添加到本地主机文件
- 测试
启用Hyper-V
从具有管理员权限的 Powershell 运行 下面的命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
系统可能会要求您重新启动计算机。
为 Windows 安装 Docker 并启用 Kubernetes
使用所有默认选项安装 Docker 应用程序并启用 Kubernetes
连接 kubectl
安装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
编辑:确保没有其他服务正在使用端口 80
重启你的机器。在 cmd
提示 运行 中以管理员身份执行:
net stop http
使用 services.msc
使用:netstat -a -n -o -b
并检查侦听端口 80 的其他进程。
创建部署
下面是 pods 的简单部署,它将回复请求:
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"
通过运行ning命令应用它:
$ kubectl apply -f file_name.yaml
创建服务
为了 pods 能够让您与他们通信,您需要创建一个服务。
示例如下:
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
通过 运行ning 命令应用此服务定义:
$ kubectl apply -f file_name.yaml
创建 Ingress 资源
下面是使用上面创建的服务的简单 Ingress 资源:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
spec:
rules:
- host: hello-test.internal
http:
paths:
- path: /
backend:
serviceName: hello-service
servicePort: http
看看:
spec:
rules:
- host: hello-test.internal
hello-test.internal
将用作 hostname
连接到您的 pods。
通过调用命令应用您的 Ingress 资源:
$ kubectl apply -f file_name.yaml
将主机添加到本地主机文件
我发现这个 Github link 允许您通过 hostname
连接到您的 Ingress 资源。
要实现这一点,请在 C:\Windows\System32\drivers\etc\hosts
文件中添加一行 127.0.0.1 hello-test.internal
并保存。
您将需要管理员权限才能执行此操作。
编辑: Docker Desktop for Windows 的最新版本已经添加了一个主机文件条目:
127.0.0.1 kubernetes.docker.internal
测试
调用命令显示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
是回复的 pod 的名称。
如果此解决方案不起作用,请使用以下命令检查连接:
netstat -a -n -o
(具有管理员权限)如果某些东西未使用端口 80。
我在部署 ingress-nginx 控制器时遇到了类似的问题,使用 @RMorrisey 提到的 ingress-nginx-deploy however was facing an issue , however referred to the link Github link 处针对裸机节点提到的手动步骤部署 ingress-nginx 控制器,这导致他们提到要安装的其他线程 ingress-nginx 使用为 mac 提到的步骤,它在不对主机文件等进行 cny 更改的情况下工作
问题是您的服务有一种 ClusterIP 类型,无法从外部访问。您需要它是 NodePort 类型,这是 Dawid Kruk 的说明中所做的。