限制 Traefik 路由上允许的方法

Restrict allowed methods on Traefik routes

我目前正在使用 traefik 1.6.x 作为我的 K8s 集群中的入口控制器。我想更新到 1.7.x(稍后更新到 2.x),但是更新后我的入口不再工作了。

问题似乎是,我通过将方法添加到 traefik.frontend.rule.type 注释来对我的入口进行 http 方法限制,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-name
  namespace: namespace1
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: "Method: CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT; PathPrefix"
    ingress.kubernetes.io/hsts-max-age: "315360000"
    ingress.kubernetes.io/hsts-include-subdomains: "true"
    ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
    ingress.kubernetes.io/content-type-nosniff: "true"
    ingress.kubernetes.io/browser-xss-filter: "true"
    ingress.kubernetes.io/custom-response-headers: "Server:||X-Application-Context:||X-Powered-By:||exception:"
spec:
  rules:
    - host: ...

我不知道这是否曾经打算以这种方式完成,但显然它奏效了。我发现在其他一些 Whosebug post、iirc.

删除方法部分(或整个注释,因为 PathPrefix 是默认设置)使路由恢复生机。但是当然这又允许 TRACE 方法,例如

是否有另一种方法来限制那些(甚至可能是所有入口)从 1.7.x 开始的 traefik 版本?

提前致谢!

实际上@Crou 关于 CORS headers 的评论有效!我刚刚再次偶然发现了这个问题,并将 method 部分移动到 custom-reponse-headers 并且它似乎有效:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-name
  namespace: namespace1
  annotations:
    kubernetes.io/ingress.class: traefik
    ingress.kubernetes.io/hsts-max-age: "315360000"
    ingress.kubernetes.io/hsts-include-subdomains: "true"
    ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
    ingress.kubernetes.io/content-type-nosniff: "true"
    ingress.kubernetes.io/browser-xss-filter: "true"
    ingress.kubernetes.io/custom-response-headers: "Server:||X-Application-Context:||X-Powered-By:||exception:||Access-Control-Allow-Headers:CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT"
spec:
  rules:
    - host: ...

我完全删除了 traefik.frontend.rule.type 部分,因为 PathPrefix 是默认值。

(!) 我只升级到 traefik 1.7.20。我还没有设法迁移到 traefik 2。所以我不确定这是否适用于 traefik 2!