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。您很可能需要使用“重写”,查看并