vlambda博客
学习文章列表

k8s中traefik配置跨域策略

「我们都知道在控制跨域策略的时候一般通过修改http response header来实现。在traefik中我们可以通过middleware来实现对http response header的控制,并将middleware关联到我们的路由中,当外部的请求和我们的路由进行匹配时,就会执行我们提前定义好的中间件。」

1.创建控制跨域策略的middleware

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-cors
  namespace: default
spec:
  headers:
    customResponseHeaders: 
      Access-Control-Allow-Origin: "http://soulchild.cn:8080"
      Access-Control-Allow-Methods: "*"
      Access-Control-Allow-Headers: "*"
    # 下面设置会允许所有域名,不能限制住,不知道为什么,所以用了上面的方式.
    #accessControlAllowMethods:
    #  - "*"
    #accessControlAllowOriginList:
    #  - "http://soulchild.cn:8080"
    #accessControlAllowHeaders:
    #  - "*"
    #accessControlMaxAge: 100
    #addVaryHeader: true

通过customResponseHeaders来自定义响应头,下面是几个响应头的含义。

  • Access-Control-Allow-Origin 用来设置可以跨域的地址,格式scheme://hostname:port,当然port如果是80则可以忽略不写。
  • Access-Control-Allow-Methods 用来设置请求允许的方法,如GET、POST、PUT、OPTION,*代表所有
  • Access-Control-Allow-Headers 当浏览器请求包含自定义header字段时,用来设置允许的自定义header,

2.和路由关联

「这里说两种关联方式,一种是和ingress资源关联,另一种是ingressroute」

ingress

在ingress中添加annotations就可以关联了

traefik.ingress.kubernetes.io/router.middlewares: default-test-cors@kubernetescrd

ingressroute

在ingressroute.routes.下添加middlewares的信息即可,当然也可以定义多个中间件,最终会按照声明的顺序来执行

spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: PathPrefix(`/api/xxx`)
    middlewares:
    - name: test-cors
      namespace: default