【问题标题】:Ingress with nginx ingress controller not works when I put 2 paths当我放置 2 条路径时,使用 nginx 入口控制器的入口不起作用
【发布时间】:2021-05-21 10:42:49
【问题描述】:

我是 K8s 的初学者,正在测试多个场景,所以我遇到了下一个问题:

当我应用具有 2 个路径的 Ingress 时,服务器对每个 URI 响应 404

这是我的入口 YAML 文件

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: pruebas
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: parking.io
    http:
      paths:
      - backend:
          serviceName: front
          servicePort: 80
        path: /front
      - backend:
          serviceName: back
          servicePort: 80
        path: /api

我做了几次测试,结果如下:

  • 只有 1 条路径带有“/”表示“前”:有效 ✅
  • 只有 1 条路径用“/”表示“后退”:有效 ✅
  • “/front”只有 1 条“front”路径:不起作用 ❌
  • “/backend”的“front”只有 1 个路径:不起作用 ❌
  • “前”和“后”的 2 个路径(上面的 YAML 文件):无效 ❌

API 服务 YAML:

apiVersion: v1
kind: Service
metadata:
  name: back
  namespace: pruebas
spec:
  type: ClusterIP
  selector:
    type: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

附加信息:我做了一个测试,为 Nginx 的 hello-world 创建了 2 个服务,我做了和我之前说的一样的,它工作正常,所以,我猜我有问题使用我的服务或我的 pod,但我不知道它可能是什么。

更多附加信息它在 GCP 和 GKE 上运行。

更新我把这个 (nginx.org/rewrites: "serviceName=back rewrite=/") 和 API 的路由工作,但不适用于子路由(api/随便)

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: pruebas
  annotations:
    # nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.org/rewrites: "serviceName=back rewrite=/"
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: parking.io
    http:
      paths:
      # - backend:
      #     serviceName: front
      #     servicePort: 80
      #   path: /app
      - backend:
          serviceName: nginx-2
          servicePort: 80
        path: /hello
      - backend:
          serviceName: back
          servicePort: 80
        path: /api

我的命名空间“pruebas”中的所有信息:

【问题讨论】:

  • 可能有很多原因。你用的是什么环境? Minikube、kubeadm、云?你能分享你的服务吗?你如何测试这是否有效,curl?
  • 您当前的入口配置将仅匹配路径 1:1。如果您想将它与 /api/something 匹配,您应该使用以下语法:/something(/|$)(.*)。更多详情您可以找到here
  • 您是部署了 Nginx Ingress 还是刚刚创建了 Ingress 部署?
  • @PjoterS,是的,我用 Helm 安装了 Nginx 控制器,然后我创建了入口文件。并回应您的第一条评论,我做到了,我使用了该语法但不起作用。我的疑问是为什么当我把 nginx.org/rewrites: "serviceName=back rewrite=/" 工作时,当我使用 "nginx.ingress.kubernetes.io/rewrite-target" 时不起作用
  • 可以共享您的部署和服务吗?配置可能有错别字。您也可以尝试使用图像 helloworld v1 和 helloworld v2 吗?

标签: kubernetes nginx-ingress


【解决方案1】:

我通过以下更改解决了我的问题:

  • 卸载我的入口控制器,然后删除服务、Pod 以及与之相关的所有内容。
  • 我的入口控制器位于不同的命名空间 (infra),因此,我再次将 NGINX 入口控制器安装在我的服务和 Pod (pruebas) 的同一命名空间中
  • 我将 ingress 配置在与其他 pod、服务等相同的命名空间中。

我的集群是在GKE上配置的,所以不知道这个方案是否适用于不同的服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 2022-08-02
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多