无法从托管在不同端口上的入口控制器访问多种服务

时间:2020-02-24 09:41:53

标签: 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/
        backend:
          serviceName: app1-svc
          servicePort: 3000
       - path: /svc2/
         backend:
           serviceName: app2-svc
           servicePort: 8080

在此之上,我创建了一个 NodePort 类型的入口控制器。

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路由访问我的任何应用程序

有人可以让我知道我在做什么错吗?以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

根据您在评论中提到的内容,我很确定可以通过重写路径来解决问题。

现在,当您使用/svc1/path: /svc1/发送请求时,该请求将转发到app1-svc,路径设置为/svc1/,并且您收到404错误app1中没有这样的路径。根据您所说的,您很可能可以使用重写解决问题。您可以使用nginx.ingress.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

也可以看看ingress docs for more explanation

让我知道它是否解决了您的问题。