背景
由于项目要和第三方对接,调用第三方接口,且接口前端直接调用即可,没有必要后端再包装一层,但前端无法直接调用第三方接口,因为不同域名,有跨域问题,需要后端代理。
解决方案
项目部署在k8s环境,不能像以前nginx代理下即可,需要分成两步完成代理: 1. 创建k8s外部service; 2. 创建ingress路由到该service;
1. 创建外部service
yml
apiVersion: v1
kind: Service
metadata:
name: ir-service #service名称
namespace: compass #命名空间
spec:
type: ExternalName # service类型
externalName: ir.xxx.com.cn #代理的第三方域名
ports:
- name: https-443
port: 443 #service端口
targetPort: 443 # 端口
protocol: TCP
2. 创建ingress路由
yml
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: compass-ir-ingress #ingress名称
namespace: compass #命名空间
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /ir_api/$1 #重定向规则,没有可以不配置,$1为捕获组
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" # 使用https协议,根据自身情况设置,代理的https就用,不是就不用
spec:
rules:
- host: compass.xxx.cn # 自己的域名
http:
paths:
- path: /compass/ir/(.*)
pathType: Prefix
backend:
service:
name: ir-service #上面创建的service name
port:
number: 443
- 重定向规则根据自身情况配置,没有的可以不配置,其中的
$1
,和正则表达式中的意思完全一样,代表第一个捕获组,即第一个括号中匹配到的内容。- 代理的外部接口是https协议的需要加上
backend-protocol:"HTTPS"
, 不是的不能加$0
为零号捕获组,代表整个表达式匹配到的内容