You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不暴露K8s集群中后端微服务?API网关可行吗?

解决方案:隐藏K8s后端微服务并通过统一入口路由

一、API网关完全能满足需求

当然可以不暴露后端微服务,API网关就是最标准的解决方案——它作为集群的统一对外入口,前端只需要访问网关,后端微服务仅以ClusterIP类型在集群内部暴露,完全不需要对外暴露。你之前用Kong效果不佳大概率是配置问题,比如路由规则错误、服务发现未正确配置或插件冲突,下面给你K8s环境下的标准配置思路,也会提供替代方案。

二、Kong网关的正确配置步骤(K8s环境)

假设你的后端微服务是backend-service(ClusterIP类型,端口8080),前端是frontend-service,按以下步骤调整:

  1. 确保Kong正确部署
    用官方Helm chart部署Kong,启用Ingress Controller模式:
helm repo add kong https://charts.konghq.com
helm install kong kong/kong --set ingressController.enabled=true
  1. 配置后端服务映射与路由
  • 创建Kong的Service资源,指向内部后端服务:
    apiVersion: v1
    kind: Service
    metadata:
      name: backend-kong-proxy
      annotations:
        konghq.com/protocol: http
    spec:
      type: ExternalName
      externalName: backend-service.default.svc.cluster.local
      ports:
      - port: 8080
        targetPort: 8080
    
  • 创建Kong的Route资源,定义前端请求到后端的路由规则:
    apiVersion: configuration.konghq.com/v1
    kind: Route
    metadata:
      name: backend-api-route
    spec:
      protocols:
      - http
      - https
      paths:
      - /api
      service:
        name: backend-kong-proxy
        port: 8080
    

此时前端只需请求http://kong-ingress-address/api/xxx,Kong会自动转发到集群内部的backend-service,后端完全不需要对外暴露。

  1. 调整前端请求地址
    修改前端的API请求根路径为Kong网关的/api前缀,无需直接访问后端的IP或域名。

三、替代方案(若Kong仍不符合需求)

1. Nginx Ingress Controller(轻量首选)

K8s官方生态的Ingress Controller,通过Ingress规则统一路由,后端保持ClusterIP:
部署Nginx Ingress后,创建Ingress资源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-unified-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /frontend(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 8080

前端通过your-domain.com/frontend访问,API请求your-domain.com/api/xxx,后端仅集群内部可见。

2. Istio Service Mesh(复杂流量场景)

如果需要熔断、灰度发布、细粒度认证等高级功能,Istio的Ingress Gateway可作为统一入口,内部微服务通过VirtualService配置路由:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: app-virtual-service
spec:
  hosts:
  - your-domain.com
  gateways:
  - istio-ingressgateway
  http:
  - match:
    - uri:
        prefix: /frontend
    route:
    - destination:
        host: frontend-service.default.svc.cluster.local
        port:
          number: 80
  - match:
    - uri:
        prefix: /api
    route:
    - destination:
        host: backend-service.default.svc.cluster.local
        port:
          number: 8080

3. 自定义Nginx反向代理(极简场景)

需求简单的话,直接部署一个Nginx Pod作为反向代理,Nginx用NodePort/LoadBalancer暴露,后端保持ClusterIP:
Nginx配置示例:

server {
    listen 80;
    server_name localhost;

    location /frontend/ {
        proxy_pass http://frontend-service.default.svc.cluster.local/;
    }

    location /api/ {
        proxy_pass http://backend-service.default.svc.cluster.local:8080/;
    }
}

四、关键注意事项

  • 后端微服务的Service类型必须是ClusterIP(默认类型),绝对不能用NodePort或LoadBalancer,否则会对外暴露。
  • 若需要加密通信,给网关配置HTTPS证书(Kong、Nginx Ingress都支持自动签发或手动配置)。
  • 之前Kong效果不佳的话,先禁用所有插件,测试基础路由是否正常,排查是否是路由匹配错误、服务发现未找到后端等基础问题。

内容的提问来源于stack exchange,提问作者Daham Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:05:29