无法使用 Minikube 在 Windows 主页上的浏览器中访问 Kubernetes Ingress?
Could not access Kubernetes Ingress in Browser on Windows Home with Minikube?
我面临的问题是我无法使用它的 IP 在浏览器上访问 Kubernetes Ingress。我已经在 Windows 10 Home.
上安装了 K8s 和 Minikube
我正在关注这个官方文档 - https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
首先,我通过 运行 下面的命令在 Minikube 上创建了部署。
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
部署已创建,如下图所示:
接下来,我公开了我在上面创建的部署。为此,我 运行 下面的命令。
kubectl expose deployment web --type=NodePort --port=8080
这创建了一个服务,可以通过 运行 下面的命令看到:
kubectl get service web
服务截图如下:
我现在可以通过运行以下命令在浏览器上访问该服务:
minikube 服务网络
在下面的屏幕截图中,您可以看到我可以在浏览器上查看它。
接下来,我通过 运行 下面的命令创建了一个入口:
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
顺便说一句,入口 yaml 代码是:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8080
入口已创建,我可以通过 运行 以下命令验证它:
kubectl get ingress
截图如下:
入口 IP 列为 192.168.49.2
。所以这意味着如果我应该在浏览器中打开它,那么它应该打开,但不幸的是没有。它显示无法访问站点。请参阅下面的屏幕截图。
这是什么问题。请给我一个解决方案?
我还在 etc\hosts 文件中添加了映射。
192.168.49.2 hello-world.info
然后我也尝试在浏览器上打开 hello-world.info 但没有成功。
在下图中,我对 hello-world.info
进行了 ping,IP 地址为 192.168.49.2。这表明 etc\hosts 映射是正确的:
我也 curl 到 minikube ip 和 hello-world.info
并且都超时了。见下图:
kubectl describe services web
提供了以下详细信息:
Name: web
Namespace: default
Labels: app=web
Annotations: <none>
Selector: app=web
Type: NodePort
IP: 10.100.184.92
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31880/TCP
Endpoints: 172.17.0.4:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
kubectl describe ingress example-ingress
给出以下输出:
Name: example-ingress
Namespace: default
Address: 192.168.49.2
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
hello-world.info
/ web:8080 172.17.0.4:8080)
Annotations: nginx.ingress.kubernetes.io/rewrite-target: /
Events: <none>
请帮忙。谢谢。
尝试删除此注释。
nginx.ingress.kubernetes.io/rewrite-target: /
并添加此注释:
annotations:
nginx.ingress.kubernetes.io/default-backend: ingress-nginx-controller
kubernetes.io/ingress.class: nginx
## tells ingress to check for regex in the config file
nginx.ingress.kubernetes.io/use-regex: "true"
此外,将您的路线更新为:
- path: /?(.*) ## instead of just '/'
backend:
serviceName: web
servicePort: 8080
我相信如果您查看 ingress 详细信息,您会找到正确的 IP
kubectl describe ingress example-ingress
查看 Docs 了解有关 ingress
的更多详细信息
如果以上方法没有帮助,请尝试此 清单。检查这个 Source
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
# If the class annotation is not specified it defaults to "gce".
kubernetes.io/ingress.class: "gce"
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: test
servicePort: 1111
遇到与 OP 相同的问题,并且仅在 minikube ssh
中有效,分享下面的 ingress.yaml。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
defaultBackend:
service:
name: default-http-backend
port:
number: 80
rules:
- host: myapp-com # domain (i.e. need to change host table)
http:
paths: # specified path below, only be working when there is more than 1 path; If only having 1 path, it's always using / as path
- path: /
pathType: Prefix
backend:
service:
name: frontend-service # internal service
port:
number: 8080 # port number that internal service exposes
- path: /e($|/)(.*)
pathType: Prefix
backend:
service:
name: express-service # internal service
port:
number: 3000 # port number that internal service exposes
在我的例子中(win10 + minikube + ingress minikube 插件)以下帮助:
- 在
%WINDIR%\System32\drivers\etc\hosts
文件中将自定义域 IP 设置为 127.0.01,即添加行 127.0.0.1 my-k8s.com
- 获取入口 pod 名称:
kubectl get pods -n ingress-nginx
- 开始端口转发:
kubectl -n ingress-nginx port-forward pod/ingress-nginx-controller-5d88495688-dxxgw --address 0.0.0.0 80:80 443:443
,您应该将 ingress-nginx-controller-5d88495688-dxxgw
替换为您的入口 pod 名称。
- 享受在任何浏览器中使用自定义域上的入口(但仅当端口转发处于活动状态时)
我面临的问题是我无法使用它的 IP 在浏览器上访问 Kubernetes Ingress。我已经在 Windows 10 Home.
上安装了 K8s 和 Minikube我正在关注这个官方文档 - https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
首先,我通过 运行 下面的命令在 Minikube 上创建了部署。
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
部署已创建,如下图所示:
接下来,我公开了我在上面创建的部署。为此,我 运行 下面的命令。
kubectl expose deployment web --type=NodePort --port=8080
这创建了一个服务,可以通过 运行 下面的命令看到:
kubectl get service web
服务截图如下:
我现在可以通过运行以下命令在浏览器上访问该服务:
minikube 服务网络
在下面的屏幕截图中,您可以看到我可以在浏览器上查看它。
接下来,我通过 运行 下面的命令创建了一个入口:
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
顺便说一句,入口 yaml 代码是:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8080
入口已创建,我可以通过 运行 以下命令验证它:
kubectl get ingress
截图如下:
入口 IP 列为 192.168.49.2
。所以这意味着如果我应该在浏览器中打开它,那么它应该打开,但不幸的是没有。它显示无法访问站点。请参阅下面的屏幕截图。
这是什么问题。请给我一个解决方案?
我还在 etc\hosts 文件中添加了映射。
192.168.49.2 hello-world.info
然后我也尝试在浏览器上打开 hello-world.info 但没有成功。
在下图中,我对 hello-world.info
进行了 ping,IP 地址为 192.168.49.2。这表明 etc\hosts 映射是正确的:
我也 curl 到 minikube ip 和 hello-world.info
并且都超时了。见下图:
kubectl describe services web
提供了以下详细信息:
Name: web
Namespace: default
Labels: app=web
Annotations: <none>
Selector: app=web
Type: NodePort
IP: 10.100.184.92
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31880/TCP
Endpoints: 172.17.0.4:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
kubectl describe ingress example-ingress
给出以下输出:
Name: example-ingress
Namespace: default
Address: 192.168.49.2
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
hello-world.info
/ web:8080 172.17.0.4:8080)
Annotations: nginx.ingress.kubernetes.io/rewrite-target: /
Events: <none>
请帮忙。谢谢。
尝试删除此注释。
nginx.ingress.kubernetes.io/rewrite-target: /
并添加此注释:
annotations:
nginx.ingress.kubernetes.io/default-backend: ingress-nginx-controller
kubernetes.io/ingress.class: nginx
## tells ingress to check for regex in the config file
nginx.ingress.kubernetes.io/use-regex: "true"
此外,将您的路线更新为:
- path: /?(.*) ## instead of just '/'
backend:
serviceName: web
servicePort: 8080
我相信如果您查看 ingress 详细信息,您会找到正确的 IP
kubectl describe ingress example-ingress
查看 Docs 了解有关 ingress
的更多详细信息如果以上方法没有帮助,请尝试此 清单。检查这个 Source
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
# If the class annotation is not specified it defaults to "gce".
kubernetes.io/ingress.class: "gce"
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: test
servicePort: 1111
遇到与 OP 相同的问题,并且仅在 minikube ssh
中有效,分享下面的 ingress.yaml。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
defaultBackend:
service:
name: default-http-backend
port:
number: 80
rules:
- host: myapp-com # domain (i.e. need to change host table)
http:
paths: # specified path below, only be working when there is more than 1 path; If only having 1 path, it's always using / as path
- path: /
pathType: Prefix
backend:
service:
name: frontend-service # internal service
port:
number: 8080 # port number that internal service exposes
- path: /e($|/)(.*)
pathType: Prefix
backend:
service:
name: express-service # internal service
port:
number: 3000 # port number that internal service exposes
在我的例子中(win10 + minikube + ingress minikube 插件)以下帮助:
- 在
%WINDIR%\System32\drivers\etc\hosts
文件中将自定义域 IP 设置为 127.0.01,即添加行127.0.0.1 my-k8s.com
- 获取入口 pod 名称:
kubectl get pods -n ingress-nginx
- 开始端口转发:
kubectl -n ingress-nginx port-forward pod/ingress-nginx-controller-5d88495688-dxxgw --address 0.0.0.0 80:80 443:443
,您应该将ingress-nginx-controller-5d88495688-dxxgw
替换为您的入口 pod 名称。 - 享受在任何浏览器中使用自定义域上的入口(但仅当端口转发处于活动状态时)