在使用kubernetes部署项目时,有些功能可能会存在如下报错:

1
Access to XMLHttpRequest at ... has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

很显然这是一个跨域问题,在传统项目中更改Nginx配置即可,那么在kubernetes中,应该如何处理这种问题呢?

解决方法


启用CORS

kubernetes中的跨域设置在Ingress中进行配置,要在Ingress规则中启用跨域资源共享(CORS),请添加注释 nginx.ingress.kubernetes.io/enable-cors: “true”。这将在服务器位置中添加一个部分以启用此功能。

详见Ingress CORS官方文档

可以使用以下注释来控制CORS:

注解 描述
nginx.ingress.kubernetes.io/cors-allow-methods 控制接受哪些方法。这是一个多值字段,以“,”分隔,仅接受字母(大写和小写),默认GET, PUT, POST, DELETE, PATCH, OPTIONS。
nginx.ingress.kubernetes.io/cors-allow-headers 控制接受哪些标题。这是一个多值字段,以“,”分隔,并接受字母,数字,_和-。默认: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
nginx.ingress.kubernetes.io/cors-expose-headers 控制哪些标头暴露给响应。这是一个多值字段,以“,”分隔,并接受字母,数字,_,-和。默认值:空。例: nginx.ingress.kubernetes.io/cors-expose-headers: “, X-CustomResponseHeader”
nginx.ingress.kubernetes.io/cors-allow-origin 控制CORS接受的原产地。这是一个单字段值,格式如下:http(s)://origin-site.com或http(s)://origin-site.com:port,默认: *,例: nginx.ingress.kubernetes.io/cors-allow-origin: “https://origin-site.com:4443"
nginx.ingress.kubernetes.io/cors-allow-credentials 控制在CORS操作期间是否可以传递凭据。默认: true,例: nginx.ingress.kubernetes.io/cors-allow-credentials: “false”
nginx.ingress.kubernetes.io/cors-max-age 控制可以将预检请求缓存多长时间。默认值:1728000 示例:nginx.ingress.kubernetes.io/cors-max-age: 600
实例

在此仅列举Ingress中annotation配置部分:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: {{ .Values.ingress.allowOrigin }}
...