Kubernetes 无法从托管在不同端口上的入口控制器访问多个服务
我有两个托管在不同端口上的服务,我创建了一个入口资源,如下所示Kubernetes 无法从托管在不同端口上的入口控制器访问多个服务,kubernetes,kubernetes-ingress,nginx-ingress,Kubernetes,Kubernetes Ingress,Nginx Ingress,我有两个托管在不同端口上的服务,我创建了一个入口资源,如下所示 apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress namespace: mynamespace annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - http: paths: - path: /svc1/
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: mynamespace
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /svc1/
backend:
serviceName: app1-svc
servicePort: 3000
- path: /svc2/
backend:
serviceName: app2-svc
servicePort: 8080
在此基础上,我创建了一个节点端口类型的入口控制器
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-ingress
name: controller-nginx-ingress-controller
spec:
clusterIP: 10.88.18.191
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 30080
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 31442
port: 443
protocol: TCP
targetPort: https
selector:
app: nginx-ingress
component: controller
release: controller
最后,设置一个云负载平衡器来访问在我的K8S集群上运行的应用程序
问题:
我无法使用URL路由访问我的任何应用程序
有人能告诉我我在做什么吗?那么如何解决这个问题呢?根据您在评论中提到的内容,我非常确定通过路径重写可以解决这个问题 现在,当您使用
路径:/svc1/
向/svc1/
发送请求时,请求被转发到app1 svc
,路径设置为/svc1/
,并且您收到404个错误,因为app1中没有这样的路径。根据您提到的,您很可能可以使用“重写”来解决这个问题。您可以使用nginx.ingres.kubernetes.io/rewrite target
注释来实现它,因此您的入口如下所示:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: mynamespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /svc1(/|$)(.*)
backend:
serviceName: app1-svc
servicePort: 3000
- path: /svc2(/|$)(.*)
backend:
serviceName: app2-svc
servicePort: 8080
在这种情况下,当发送路径设置为/svc1/something
的请求时,请求将被转发到app1,路径将被重写为/something
还可以看一看
让我知道它是否解决了您的问题。根据您在评论中提到的内容,我非常确定通过路径重写可以解决问题 现在,当您使用
路径:/svc1/
向/svc1/
发送请求时,请求被转发到app1 svc
,路径设置为/svc1/
,并且您收到404个错误,因为app1中没有这样的路径。根据您提到的,您很可能可以使用“重写”来解决这个问题。您可以使用nginx.ingres.kubernetes.io/rewrite target
注释来实现它,因此您的入口如下所示:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: mynamespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /svc1(/|$)(.*)
backend:
serviceName: app1-svc
servicePort: 3000
- path: /svc2(/|$)(.*)
backend:
serviceName: app2-svc
servicePort: 8080
在这种情况下,当发送路径设置为/svc1/something
的请求时,请求将被转发到app1,路径将被重写为/something
还可以看一看
如果它解决了您的问题,请告诉我。您能否共享在端口3000和8080上运行的相关服务的服务清单?或者双重检查服务和入口清单。确保服务名称和端口匹配。如果我将svc1或svc2映射到根目录,则我可以单独访问我的应用程序。e、 g.-path:/backend:serviceName:app1 svc servicePort:3000-path:/svc2/backend:serviceName:app2 svc servicePort:8080在这种情况下,我可以通过http://能够访问app2(http:///app2-svc)反之亦然。你收到404了吗?请在应用程序代码中尝试/svc1和/svc2而不是/svc1/和/svc2/仔细检查路由路径。是的,我收到404错误。已尝试,但仍然是相同的错误,即404。您很可能需要使用“重写”,请查看并共享在端口3000和8080上运行的相关服务的服务清单?或者双重检查服务和入口清单。确保服务名称和端口匹配。如果我将svc1或svc2映射到根目录,则我可以单独访问我的应用程序。e、 g.-path:/backend:serviceName:app1 svc servicePort:3000-path:/svc2/backend:serviceName:app2 svc servicePort:8080在这种情况下,我可以通过http://能够访问app2(http:///app2-svc)反之亦然。你收到404了吗?请在应用程序代码中尝试/svc1和/svc2而不是/svc1/和/svc2/仔细检查路由路径。是的,我收到404错误。尝试过,仍然是相同的错误,即404。您很可能需要使用“重写”,查看并