Kubernetes Ingress支持跨域 (CORS)配置

Kubernetes Ingress 里要支持跨域 (CORS),通常取决于你用的 Ingress Controller(nginx、traefik、haproxy 等)。
最常见的就是 NGINX Ingress Controller,它可以通过 Annotations 配置 CORS。


1.NGINX Ingress Controller 开启跨域

1.1限制跨域域名

在 Ingress 的 metadata.annotations 里加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
namespace: default
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "https://example.com"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80

关键说明:

  • enable-cors: "true" 开启跨域支持
  • cors-allow-origin:允许的来源,可以是具体域名(推荐),也可以是 *(允许所有
  • cors-allow-methods:允许的方法
  • cors-allow-headers:允许的请求头
  • cors-allow-credentials:是否允许携带 Cookie/Authorization 头

1.2不限制域跨域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
namespace: default
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS, DELETE, PATCH"
nginx.ingress.kubernetes.io/cors-allow-headers: "*"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80

关键说明

  1. cors-allow-origin: "*":允许所有来源跨域(测试方便,但生产环境安全性较低)。

  2. 如果你需要跨域时带 Cookie / Authorization,那就不能用 "*",必须写具体域名,比如:

    1
    nginx.ingress.kubernetes.io/cors-allow-origin: "https://foo.example.com"
  3. cors-allow-headers: "*":所有自定义头都放行,适合调试;生产建议限制。

2.模拟简单跨域请求

2.1带 Origin

1
2
curl -i http://myapp.example.com/api \
-H "Origin: http://evil.com"

期望返回头:

Access-Control-Allow-Origin: http://evil.com   # 或 *

如果 Ingress 配置了 CORS,这里会有响应头。


2.2模拟跨域预检请求(OPTIONS)

跨域时,浏览器会先发一个 OPTIONS 请求(preflight)确认是否允许。

1
2
3
4
curl -i -X OPTIONS http://myapp.example.com/api \
-H "Origin: http://evil.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Custom-Header, Authorization"

期望返回头:

Access-Control-Allow-Origin: http://evil.com
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT
Access-Control-Allow-Headers: X-Custom-Header, Authorization

1
2
3
curl -i http://myapp.example.com/api \
-H "Origin: http://evil.com" \
-H "Cookie: sessionid=12345"

注意:如果返回里有 Access-Control-Allow-Credentials: true,浏览器才会允许跨域携带 Cookie。


🔥 总结:

  • -H "Origin: ..." 是最关键的
  • 预检请求用 -X OPTIONS + Access-Control-Request-*
  • 可以加 CookieAuthorization 模拟敏感请求。