k8s nginx 入口重写目标注释未按预期工作

Posted

技术标签:

【中文标题】k8s nginx 入口重写目标注释未按预期工作【英文标题】:k8s nginx ingress rewrite-target annotation not working as expected 【发布时间】:2018-05-27 02:38:31 【问题描述】:

在 Minikube 中运行,我有以下入口,以及必要的后端:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
        - path: /config/
          backend:
            serviceName: api-gateway
            servicePort: web

目的是为网关的 Web UI 提供服务,它期望路径为 /,否则它假定它是逻辑路径并尝试将请求转发到正确的微服务。

路径的重写没有像我预期的那样工作。它不会用/ 替换/config/。我是不是误会the example?

在我看到的 nginx 控制器的日志中:

192.168.99.1 - [192.168.99.1] - - [13/Dec/2017:08:54:11 +0000] "GET /config HTTP/1.1" 301 185 "-" "curl/7.55.1" 78 0.000 [-] - - - -
192.168.99.1 - [192.168.99.1] - - [13/Dec/2017:08:54:11 +0000] "GET /config/ HTTP/1.1" 404 154 "-" "curl/7.55.1" 79 0.010 [dev-api-gateway-web] 172.17.0.10:8080 143 0.010 404

这告诉我对 /config 的请求被重写为 /config/ 并导致 404。

如何将/config 重写为/

【问题讨论】:

【参考方案1】:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
        - path: /config/(.+)
          backend:
            serviceName: api-gateway
            servicePort: web

【讨论】:

【参考方案2】:

你误解了这个例子。随着您对重写目标/ 的配置请求将被重写为/config/,而不是相反。所以需要切换路径:使用/config作为重写目标,并在规则中设置/路径。

所以rewrite target总是外部请求去的地方,service/pod的请求去的规则路径。

【讨论】:

我可能会。如果我将/config 作为重写目标,那么不包含/config 的请求会发生什么情况?例如,/api 的请求,假设我有 /api 的规则和后端? 你需要另一个 Ingress,因为一个 Ingress 只能有 1 个重写目标。但是同一个主机可以有多个 Ingress,这没问题。 重写路径(例如/config)被/替换,然后根据重写的请求路径应用入口中的任何规则不是更准确吗? 不确定重写是否以及如何与多个规则一起工作......但我不希望具有重写目标/config 的 Ingress 可以匹配到 /api 的任何外部请求。我认为/api 的规则将与/config/api 的请求相匹配。但我从未尝试过。

以上是关于k8s nginx 入口重写目标注释未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

@Transactional 注释未按预期工作

具有休眠 CRUD 操作的 Spring 3 注释:@Autowired 未按预期工作

带有 Kotlin 的 Spring Boot - @Value 注释未按预期工作

数据切换和数据目标未按预期工作

具有多个目标重写的 kubernetes 入口

Apache Rewrite 规则未按预期工作