如何暴露AWS EKS中仅可通过API Gateway访问的VPC内服务
VPC内仅通过API Gateway访问EKS私有服务配置方案
整个配置全程不会给EKS服务分配公网暴露面,所有访问流量唯一入口为API Gateway,流量全程走AWS私有网络,不会经过公网链路,按以下步骤操作即可:
1. EKS侧服务私有暴露配置
- 给EKS中需要暴露的目标工作负载创建
LoadBalancer类型的Service,添加注解service.beta.kubernetes.io/aws-load-balancer-internal: "true",这个配置会让AWS自动分配一个内网NLB,仅在当前VPC内可路由,不会分配公网IP - 给这个内网NLB绑定独立的安全组,入站规则仅放通后续VPC Link关联安全组的对应服务端口流量,拒绝所有其他来源的访问请求,从网络层阻断非API Gateway来源的直连流量
- 可选:给目标Pod配置K8s NetworkPolicy,限制Pod仅接收来自NLB所在子网段的流量,做双层访问控制
- 配置完成后先做连通性校验:找一台同VPC内无公网IP的EC2实例,curl内网NLB的地址,确认服务响应正常;再从公网环境尝试连通NLB地址,确认无法连通,避免服务意外暴露。
2. 创建私有VPC Link打通API Gateway与VPC链路
- 进入API Gateway控制台,选择对应区域,创建HTTP API类型的VPC Link(REST类型的VPC Link配置逻辑一致,但HTTP类型成本更低、性能更好,优先选择)
- VPC选择EKS集群所在的VPC,子网选择至少2个不同可用区的私有子网(不要选绑定了互联网网关的公有子网),安全组选择提前创建的、允许访问EKS内网NLB端口的安全组
- 等待VPC Link状态变为
Available即可,这个过程一般3-5分钟,创建完成后API Gateway会通过自动创建的弹性网卡接入VPC,所有访问流量走AWS内网,不会经过公网。
3. API Gateway路由与访问控制配置
- 创建HTTP API实例,端点类型选Regional即可,不要选边缘优化类型
- 进入API的资源策略配置页,添加策略拒绝所有公网IP段的访问,仅放通VPC内网段、或者你指定的VPC端点来源的访问,确保API本身也不会对公网暴露
- 按业务需求新增路由,配置需要暴露的请求方法、路径匹配规则
- 路由的后端集成类型选择
VPC Link,选中之前创建的VPC Link资源,后端目标选择EKS侧内网NLB对应的监听器,配置路径转发规则(一般选原样转发即可,按需配置路径重写规则) - 按需配置API鉴权规则:如果服务本身没有鉴权逻辑,可以搭配IAM鉴权、自定义Lambda授权器做访问控制,不要开启无限制的公开访问。
4. 连通性验证
- 将API配置部署到对应阶段,拿到API的调用地址
- 回到VPC内的私有EC2实例,调用API地址,确认能正常返回EKS服务的响应
- 切换到公网环境(比如本地办公网络、非该VPC的公网机器)分别调用API地址、直连EKS内网NLB地址,确认两类请求都被拒绝,符合安全要求。
常见踩坑提醒
- 不要漏加内网NLB的注解,缺了这个注解AWS会默认创建公网NLB,直接把服务暴露到公网
- VPC Link关联子网的时候一定不要选公有子网,否则会带来不必要的公网暴露风险
- 安全组遵循最小权限原则:NLB安全组入站仅放通VPC Link安全组的访问,VPC Link安全组出站仅允许到NLB服务端口的流量,不要全开0.0.0.0/0的规则
- 如果需要VPC内通过自定义内网域名访问API,可以在Route53私网托管区给API调用域名配置别名记录,不需要修改本地hosts。
内容的提问来源于stack exchange,提问作者Alkaid
相关产品推荐
相关产品推荐

