【问题标题】:kubernetes nginx ingress server-snippet annotation not taking effectkubernetes nginx入口服务器片段注释未生效
【发布时间】:2020-11-26 05:22:07
【问题描述】:

我有以下 ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: nginx-configuration-snippet
    annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/server-snippet: |
          location /base/path/v1/api/update {
              deny all;
              return 404;
            }
spec:
  rules:
    - http:
        paths:
          - path: /base/path(/|$)(.*)
            backend:
              serviceName: myApi
              servicePort: 8080

但是当我将 PUT 请求发送到 /base/path/v1/api/update 而不是得到 404 时,我得到的是 500,这意味着可以从入口控制器访问路径。谁能帮我找出原因?

我改成configuration-sn-p,我得到的错误是:

Error: exit status 1
2020/08/06 18:35:07 [emerg] 1734#1734: location "/base/path/v1/api/update" is outside location "^/base/path(/|$)(.*)" in /tmp/nginx-cfg008325631:2445
nginx: [emerg] location "/base/path/v1/api/update" is outside location "^/base/path(/|$)(.*)" in /tmp/nginx-cfg008325631:2445
nginx: configuration file /tmp/nginx-cfg008325631 test failed

【问题讨论】:

  • 您是否拉下生成的nginx.conf 并确保它写在您期望的位置?另外,这有点迂腐,the fine manual 说“每个主机一次”,但你没有主机——所以,他们可能只是直接不做(希望在控制器日志中记录一些内容)
  • 是的,它没有操作。关于如何实现这一目标的任何想法?
  • 一种方法是实际声明一个host: 值,看看这是否使它不那么生气,另一种方法是使用server-snippet: ConfigMap 设置
  • 实际上我添加了更多描述,我尝试了 configuration-sn-p,它似乎不再是 no op 了。但现在出现错误。虽然无法理解错误
  • 那么,您是否将生成的配置从控制器 pod 中复制出来并查看它? nginx 的配置是一片狂野而神秘的土地,但是不看配置文件,谁也无法哪里出了问题

标签: kubernetes kubernetes-helm kubernetes-ingress nginx-ingress


【解决方案1】:

添加我自己的答案: 对我有用的最终配置是:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: nginx-configuration-snippet
    annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/server-snippet: |
          location ~* "^/base/path/v1/api/update" {
              deny all;
              return 403;
            }
spec:
  rules:
    - http:
        paths:
          - path: /base/path(/|$)(.*)
            backend:
              serviceName: myApi
              servicePort: 8080

【讨论】:

  • 另一种解决方案是在 sn-p 中使用^~ 位置修饰符,例如location ^~ /base/path/v1/api/update,它告诉 Nginx 更喜欢匹配而不是正则表达式位置(效率略高)。
猜你喜欢
  • 2021-01-23
  • 2020-10-13
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2020-11-27
  • 1970-01-01
相关资源
最近更新 更多