Traefik 1.7.x中K8s Ingress HTTP方法限制方案咨询
解决Traefik 1.7.x中HTTP方法限制的问题
你遇到的情况其实是Traefik 1.7.x对traefik.frontend.rule.type注解的处理逻辑做了规范调整——在1.6.x里那种把Method和PathPrefix混合写的用法属于非官方的“巧合生效”,1.7.x开始严格遵循官方定义,这个注解仅用于指定路径匹配类型(比如PathPrefix、Path等),不再支持嵌入方法限制规则。
下面给你两种在Traefik 1.7.x中实现HTTP方法限制的方案,覆盖单个Ingress和全局生效的场景:
一、单个Ingress配置方法限制
Traefik 1.7.x引入了更清晰的**中间件(Middleware)**机制来处理这类请求过滤需求,你可以直接在Ingress的注解里定义并引用方法限制中间件:
修改你的Ingress配置如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: app-name namespace: namespace1 annotations: kubernetes.io/ingress.class: traefik # 定义并引用方法限制中间件 traefik.frontend.middlewares: "app-method-restriction" traefik.middleware.app-method-restriction.methods: "CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT" # 保留你的其他安全注解 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: ...
这个配置会只允许注解里列出的HTTP方法访问该Ingress,其他方法(比如TRACE)会被返回405 Method Not Allowed。
二、全局生效的方法限制
如果想让所有Ingress都统一应用HTTP方法限制,可以通过Traefik的全局中间件配置来实现:
- 首先创建一个存储中间件配置的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: traefik-global-middlewares namespace: kube-system # 替换为你的Traefik所在命名空间 data: traefik.toml: | [middlewares] [middlewares.global-method-restriction.method] # 定义允许的HTTP方法列表 methods = ["CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
- 修改Traefik的Deployment配置,让它加载这个ConfigMap并将该中间件设为默认:
在Traefik容器的启动命令中添加以下参数:
args: # 其他原有参数... - --configmap=kube-system/traefik-global-middlewares - --default-middlewares=global-method-restriction
保存并更新Deployment后,所有使用Traefik作为Ingress类的路由都会自动应用这个方法限制规则。
验证效果
你可以用curl命令测试是否生效,比如发送一个TRACE请求:
curl -X TRACE https://your-app-host.com
如果配置正确,应该会返回405 Method Not Allowed状态码。
内容的提问来源于stack exchange,提问作者Max N.
相关产品推荐
相关产品推荐

