【问题标题】:Kubernetes NGINX ingress rewrite-target annotation breakingKubernetes NGINX 入口重写目标注释中断
【发布时间】:2020-10-13 13:05:41
【问题描述】:

我在 docker desktop for windows 下运行 kubernetes v1.16。我已经使用 helm 安装了 nginx-ingress 控制器 v1.7.9。我已更新我的主机文件以具有以下条目

127.0.0.1 application.local

我有一个名为 hedgehog-service 的后端服务。

以下入口定义正确地将请求转发到后端。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ml-zoo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: application.local
    http:
      paths:
      - path: /hedgehog/
        backend:
          serviceName: hedgehog-service
          servicePort: 80

curl application.local/hedgehog 按预期工作并访问后端服务。

但是,为了正确使用后端服务,我需要重写目标,删除 url 前缀 /hedgehog。因此我有以下入口定义

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ml-zoo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: application.local
    http:
      paths:
      - path: /hedgehog(/|$)(.*)
        backend:
          serviceName: hedgehog-service
          servicePort: 80

如此处所示:https://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-target

现在当我curl application.local/hedgehog/test 入口控制器不与后端通信但根据日志尝试打开文件时

2020/06/23 12:46:48 [error] 708#708: *792 open() "/etc/nginx/html/hedgehog/test" failed (2: No such file or directory), client: 192.168.65.3, server: application.local, request: "GET /hedgehog/test HTTP/1.1", host: "application.local"
192.168.65.3 - - [23/Jun/2020:12:46:48 +0000] "GET /hedgehog/test HTTP/1.1" 404 153 "-" "curl/7.65.3" "-"

这里是etc/nginx/conf.d/default-ml-zoo-ingress的内容

# configuration for default/ml-zoo-ingress

upstream default-ml-zoo-ingress-application.local-hedgehog-service-80 {
        zone default-ml-zoo-ingress-application.local-hedgehog-service-80 256k;
        random two least_conn;

        server 10.1.0.48:80 max_fails=1 fail_timeout=10s max_conns=0;
}

server {
        listen 80;
        server_tokens on;
        server_name application.local;

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

                proxy_http_version 1.1;
                proxy_connect_timeout 60s;
                proxy_read_timeout 60s;
                proxy_send_timeout 60s;
                client_max_body_size 1m;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_buffering on;

                proxy_pass http://default-ml-zoo-ingress-application.local-hedgehog-service-80;

        }
}

有谁知道为什么我的 URL 没有被重写并且请求没有被传递到后端服务?

提前致谢!

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress nginx-ingress docker-for-windows


    【解决方案1】:

    好吧,玩了几个小时,一旦我写了这个问题,我的下一个谷歌就会找到答案。

    我使用 helm 安装了 nginx,并使用了以下 repo stable/nginx-ingress。然而,根据这个问题https://github.com/kubernetes/ingress-nginx/issues/5756,这实际上是一个遗留存储库。我卸载了我的控制器并将存储库更改为ingress-nginx

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    

    一切似乎都按预期工作。仍然不确定为什么以前的控制器安装失败,但我可以重新开始工作:)

    编辑:为了帮助可能最终出现在这里的其他人 - 事后看来,我想知道重新安装是否只是意味着我删除并重新创建了我的入口,这可能已经解决了原始问题。换句话说,请确保在使用 helm 重新安装入口控制器之前尝试重新创建入口。

    【讨论】:

    • 这很令人困惑。我发现在 2 个不同的存储库中有 2 个 Nginx 入口,ingress-nginx/ingress-nginx 和 stable/nginx-ingress。一个是来自https://kubernetes.github.io/ingress-nginx/deploy/#using-helm 的https://kubernetes.github.io/ingress-nginx,另一个是来自Helm 官方稳定图表的https://kubernetes-charts.storage.googleapis.com/。但是第一个解决问题真是太好了。
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2022-01-17
    • 2020-08-17
    相关资源
    最近更新 更多