kubernetes - 无法从托管在不同端口上的入口 Controller 访问多个服务

标签 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 类型入口 Controller 。

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

任何人都可以告诉我我做错了什么吗?以及如何解决这个问题?

最佳答案

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

现在,当您使用 path:/svc1//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 .

请告诉我是否解决了您的问题。

关于kubernetes - 无法从托管在不同端口上的入口 Controller 访问多个服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60373100/

相关文章:

kubernetes - Minikube 入口没有响应

jenkins - 如何 Helm 设置对象数组( map 数组)?

apache-kafka - 如何在 kubernetes 上为 Kafka 多代理设置指定广告监听器并对外公开集群?

docker - 如何使用docker在角度应用程序中传递环境变量

kubernetes - Kafka Operator 与 Kafka Helm Chart 之间的区别

kubernetes - 使用 nginx 反向代理公开 Kubernetes 中的服务

Kubernetes Ingress 未重定向到正确的路径

kubernetes - 为什么入口服务有地址?该地址有什么用?

kubernetes - 如何在 GKE ingress nginx 中设置域

bash - 来自 kubernetes 的脚本备份命名空间、部署等