在swagger管理的时候,希望通过一个域名可以访问所有集群的swagger文档,设计思路是域名解析到负载均衡,负载均衡通过请求路径关键字分发到不同K8S的 Ingress,然后Ingress再根据路径策略分发到具体的服务。
请求链路
整个链路如下:
- 发起请求,域名解析到负载均衡IP地址
- 负载均衡中配置路由到后端Ingress的规则
/cloud
路径路由到云上K8S集群的Ingress/local
路径路由到本地K8S集群的Ingress
- K8S集群中Ingress配置服务的路由规则
/cloud/app-a/
路由到service1
/local/app-d/
路由到service4
- Service 接收到请求,路由到相关Pod,返回相关结果
问题&优化
因为增加了 /local
和 /cloud
关键字来进行K8S集群的划分,但是这个请求路径在基础服务中是没有的,所以需要通过路径重写来解决。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- host: swagger.adolphor.github.io
http:
paths:
- backend:
service:
name: omni-application-back-end-svc
port:
number: 8086
path: /(cloud)/(swagger/api/.*)
pathType: ImplementationSpecific
- backend:
service:
name: docking-qimen-service-svc
port:
number: 8088
path: /(cloud)/(swagger/api/.*)
pathType: ImplementationSpecific
优化后的流程:
- 发起请求,域名解析到负载均衡IP地址
- 负载均衡中配置路由到后端Ingress的规则
/cloud
路径路由到云上K8S集群的Ingress/local
路径路由到本地K8S集群的Ingress
- K8S集群中Ingress配置服务的路由规则
/cloud/app-a/
路径重写为/app-a/
后路由到service1
/local/app-d/
路径重写为/app-d/
后路由到service4
- Service 接收到请求,路由到相关Pod,返回相关结果
参考资料
文档信息
- 本文作者:Bob.Zhu
- 本文链接:https://adolphor.github.io/2022/04/14/01-k8s-ingress-rewrite-path/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)