2

我目前在我的 K8s 集群中使用 traefik 1.6.x 作为入口控制器。我想更新到 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: ...

我不知道这是否曾经打算以这种方式完成,但显然它奏效了。我在其他一些 StackOverflow 帖子 iirc 中发现了这一点。

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

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

提前致谢!

4

1 回答 1

0

实际上,@Crou 关于 CORS 标头的评论有效!我刚刚再次偶然发现了这个问题,并将方法部分移至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!

于 2020-01-10T10:13:09.303 回答