Kubernetes如何通过Ingress配置同一外部地址运行多个服务
Kubernetes HAProxy Ingress 多服务路径路由配置方案
核心需求说明
你需要将多个后端服务通过同一外部域名/IP的不同路径对外暴露,对应映射规则如下:
- 外部访问
http://<exturi>/service1/api-> 转发到内部服务http://service1/api - 外部访问
http://<exturi>/service2/api-> 转发到内部服务http://service2/api
配置方案
前置说明
你当前使用的networking.k8s.io/v1beta1版本Ingress在Kubernetes 1.19+版本中已废弃,推荐替换为稳定的networking.k8s.io/v1版本。以下配置基于HAProxy Ingress实现,分两种场景提供:
场景1:后端服务已自带路径前缀
如果你的内部service1、service2本身已经支持/service1/api、/service2/api路径,无需路径重写,直接配置多路径路由即可:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: haproxy name: ingress-api spec: rules: # 如不需要域名限制,可删除host字段,直接通过Ingress IP访问 - host: api.sample.com http: paths: # service1路由规则 - backend: service: name: service1 # 替换为你实际的service1名称 port: number: 13001 # 替换为service1实际端口 path: /service1/api pathType: Prefix # service2路由规则 - backend: service: name: service2 # 替换为你实际的service2名称 port: number: 13002 # 替换为service2实际端口 path: /service2/api pathType: Prefix tls: - hosts: - api.sample.com secretName: tls-api-secret
场景2:后端服务仅根路径下有/api接口
这是绝大多数使用场景,内部service1的接口路径为/api,需要把外部路径中的/service1前缀删除后再转发到后端,需要添加HAProxy Ingress的路径重写注解:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: haproxy # 路径重写规则:将匹配到的第二段路径作为转发到后端的实际路径 haproxy.ingress.kubernetes.io/rewrite-target: /$2 name: ingress-api spec: rules: - host: api.sample.com http: paths: - backend: service: name: service1 port: number: 13001 # 正则匹配:/service1开头的所有路径,分组$2为/service1/之后的内容 path: /service1(/|$)(.*) pathType: Prefix - backend: service: name: service2 port: number: 13002 path: /service2(/|$)(.*) pathType: Prefix tls: - hosts: - api.sample.com secretName: tls-api-secret
配置效果验证
配置生效后,访问http://api.sample.com/service1/api会自动转发到service1的/api接口,http://api.sample.com/service2/api会自动转发到service2的/api接口,符合需求。
内容的提问来源于stack exchange,提问作者Nikolay Sulimov
相关产品推荐
相关产品推荐

