【问题标题】:Kubernetes Ingress path rewrite dosen't work as expectedKubernetes Ingress 路径重写无法按预期工作
【发布时间】:2021-12-17 17:49:56
【问题描述】:

我有一个入口,定义如下:

Name:             online-ingress
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host          Path  Backends
  ----          ----  --------
  jj.cloud.com  
                /online/(.*)   online:80 (172.16.1.66:5001)
                /userOnline    online:80 (172.16.1.66:5001)
Annotations:    nginx.ingress.kubernetes.io/rewrite-target: /$1
Events:
  Type    Reason          Age                From                      Message
  ----    ------          ----               ----                      -------
  Normal  AddedOrUpdated  29m (x4 over 74m)  nginx-ingress-controller  Configuration for default/online-ingress was added or updated

如果我不重写就测试它,没关系。

curl -X POST jj.cloud.com:31235/userOnline -H 'Content-Type: application/json' -d '{"url":"baidu.com","users":["ua"]}'
OK

但是,如果我尝试使用 rewrite,它会失败。

curl -X POST jj.cloud.com:31235/online/userOnline -H 'Content-Type: application/json' -d '{"url":"baidu.com","users":["ua"]}'
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.3</center>
</body>
</html>

它会产生以下错误日志:

2021/11/03 10:21:25 [error] 134#134: *63 open() "/etc/nginx/html/online/userOnline" failed (2: No such file or directory), client: 172.16.0.0, server: jj.cloud.com, request: "POST /online/userOnline HTTP/1.1", host: "jj.cloud.com:31235"
172.16.0.0 - - [03/Nov/2021:10:21:25 +0000] "POST /online/userOnline HTTP/1.1" 404 153 "-" "curl/7.29.0" "-"

为什么路径/online/userOnline 不匹配/online/(.*) 并重写为/userOnline?还是有其他错误? 这是yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: online-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - host: jj.cloud.com
      http:
        paths:
          - path: /online(/|$)/(.*)
            pathType: Prefix
            backend:
              service: 
                name: online
                port: 
                  number: 80
          - path: /userOnline
            pathType: Prefix
            backend:
              service:
                name: online
                port:
                  number: 80
  ingressClassName: nginx

当我检查生成的 nginx 配置时,我发现(default-online-ingress.conf):

location /online(/|$)/(.*) {

似乎丢失了正则表达式匹配的修饰符,如下所示:

location ~* "^/online(/|$)/(.*)" {

如果是真的,如何让rewrite生效并生成正确的nginx配置?

【问题讨论】:

    标签: nginx kubernetes url-rewriting nginx-ingress


    【解决方案1】:

    如果我正确理解了您的问题,则说明您对捕获的组有疑问。

    在我看来,Nginx Rewrite targets

    • 你的补丁应该是path: /online(/|$)(.*)
    • 你的rewrite-target: 应该是rewrite-target: /$2
    • 另外,如果你使用nginx ingress,我相信你应该在注释部分指定为kubernetes.io/ingress.class: nginx

    yaml:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: online-ingress
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
      rules:
        - host: jj.cloud.com
          http:
            paths:
              - path: /online(/|$)(.*)
                pathType: Prefix
                backend:
                  service: 
                    name: online
                    port: 
                      number: 80
              - path: /userOnline
                pathType: Prefix
                backend:
                  service:
                    name: online
                    port:
                      number: 80
      ingressClassName: inner-nginx
    

    【讨论】:

    • 其实我按照你说的试过了,得到了404。我的nginx控制器是在裸机上运行的,我是参考install安装的,inner-nginx是另一个控制器。我卸载了所有控制器并再次安装了默认控制器以避免其他问题。但结果是一样的。似乎正则表达式匹配没有生效。
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 2019-04-19
    • 2019-06-22
    • 2020-06-26
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多