K8s中如何配置Ingress将流量路由到Pod指定服务端点
Ingress实现方案
前置检查
配置前先确认两个前提:
- 集群已部署可用的Ingress控制器(生产最常用的是ingress-nginx,云厂商也有对应托管的Ingress实现,未装控制器的话Ingress规则不会生效)
- 你的Go应用已经通过Deployment部署完成,且创建了对应Service,Service的
targetPort和Go应用实际监听的端口保持一致
配置示例
你的需求是访问xx.yy.com根路径时,流量转发到后端Go应用的/v1/example端点,核心是给Ingress加路径重写注解,完整配置参考如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: go-app-ingress namespace: 替换成你应用所在的命名空间 annotations: # 路径重写规则,将匹配到的路径转发到后端的/v1/example nginx.ingress.kubernetes.io/rewrite-target: /v1/example spec: ingressClassName: nginx # 替换成你实际用的Ingress控制器类名 rules: - host: xx.yy.com http: paths: - path: / pathType: Prefix backend: service: name: 替换成你Go应用对应的Service名称 port: number: 替换成你Service暴露的端口
配置说明:
- 如果只需要精确匹配域名根路径(即访问
xx.yy.com才转发,访问xx.yy.com/other直接返回404),把pathType从Prefix改成Exact即可 - 如果你用的是其他类型的Ingress控制器(比如Traefik、ALB Ingress),路径重写的注解key要换成对应控制器要求的格式,逻辑是一致的
生效验证
- 先获取Ingress控制器的对外访问IP:执行
kubectl get svc -n ingress-nginx,找到ingress-nginx-controller服务对应的EXTERNAL-IP - 本地配置hosts解析把
xx.yy.com指向上面拿到的IP,或者在云域名服务商处配置DNS解析记录指向该IP - 浏览器访问
xx.yy.com,验证是否正常返回Go应用/v1/example接口的响应即可
替代实现方案
如果不想用Ingress,生产环境还有几个常用方案可选:
- 采用K8s Gateway API:这是K8s官方推出的下一代流量路由标准,相比Ingress抽离了网关基础设施和路由规则的绑定关系,支持更细粒度的流量策略(比如流量拆分、跨命名空间路由、mTLS等),适合集群规模大、多团队共享网关的场景,需要提前部署Gateway API CRD和对应实现(比如ingress-nginx、Cilium均已支持)
- 直接对接公有云七层负载均衡:如果集群部署在公有云,可直接创建云厂商的ALB/CLB实例,配置七层监听器绑定
xx.yy.com域名,添加转发规则将根路径的请求转发到Go应用所在的后端服务器组,同时配置路径重写为/v1/example,无需自行维护Ingress控制器,稳定性由云厂商兜底 - 部署独立网关层:在集群中单独部署Nginx/OpenResty/APISIX等网关服务,通过LoadBalancer或NodePort暴露服务,直接在网关配置中编写路由规则,将
xx.yy.com的根路径请求转发到Go应用Service地址,同时配置路径重写,适合需要高度自定义网关逻辑、不想受Ingress注解能力限制的场景 - 测试环境临时方案:执行
kubectl port-forward svc/你的Go应用Service名 本地端口:服务端口,直接通过本地端口访问应用,仅适合本地调试使用,不能用于生产。
内容的提问来源于stack exchange,提问作者GurbaniX
相关产品推荐
相关产品推荐

