如何修改GKE Service限制Spring Boot应用仅通过Apigee X代理访问?
要禁止外部直接访问你的GKE LoadBalancer Service的外部IP,只允许Apigee X代理的流量进入,你可以通过以下几种方式修改Kubernetes配置:
1. 限制LoadBalancer的来源IP范围
GKE的LoadBalancer Service会自动创建对应的GCP防火墙规则,你可以通过添加annotation来指定仅允许Apigee的出口IP段访问:
编辑你的Service配置,添加cloud.google.com/load-balancer-source-ranges注解,填入Apigee代理的出口IP范围(可在Apigee控制台或通过gcloud apigee instances describe命令获取):
apiVersion: v1 kind: Service metadata: name: your-spring-boot-service annotations: # 替换为实际的Apigee出口IP段,多个用逗号分隔 cloud.google.com/load-balancer-source-ranges: "192.168.0.0/24, 203.0.113.0/24" spec: type: LoadBalancer selector: app: your-spring-boot-app ports: - protocol: TCP port: 80 targetPort: 8080
应用这个修改后,GCP会自动更新防火墙规则,只有来自Apigee IP段的流量能访问该LoadBalancer的外部IP,其他直接访问的请求会被拦截。
2. 改用Internal LoadBalancer(推荐同VPC/Peering场景)
如果你的Apigee X实例和GKE集群处于同一个VPC,或者已经完成VPC peering,可以将Service改为Internal LoadBalancer,这样Service只会暴露内部IP,外部无法直接访问:
apiVersion: v1 kind: Service metadata: name: your-spring-boot-service annotations: cloud.google.com/load-balancer-type: "internal" spec: type: LoadBalancer selector: app: your-spring-boot-app ports: - protocol: TCP port: 80 targetPort: 8080
之后将Apigee代理的目标URL配置为这个Internal LoadBalancer的内部IP或DNS即可,完全阻断外部直接访问路径。
3. 搭配NetworkPolicy强化Pod级访问控制
为了进一步确保安全,你可以创建NetworkPolicy,限制Spring Boot Pod仅接收来自Apigee IP段的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: restrict-spring-boot-ingress spec: podSelector: matchLabels: app: your-spring-boot-app policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 192.168.0.0/24 # 替换为Apigee出口IP段 ports: - protocol: TCP port: 8080
这个策略会拒绝所有非Apigee来源的流量到达Pod,即使有其他绕过Service的路径也会被拦截。
关键注意点
- 务必确认Apigee的出口IP段准确,避免误拦截合法流量;
- 使用Internal LoadBalancer时,要保证Apigee和GKE的VPC连通性正常,Apigee代理需配置为访问内部资源。
内容的提问来源于stack exchange,提问作者Rohit

