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

Kubernetes集群中Angular Pod无法向Spring Boot服务发起GET请求

问题分析与解决方案

嘿,我一眼就看出你踩了K8s部署SPA应用的常见坑!咱们一步步拆解问题根源,再给你落地的解决方案:

核心误区:浏览器不在K8s集群内部

你的Angular是单页应用(SPA),代码最终是在用户的浏览器里跑的,不是在K8s的前端Pod里执行!你设置的API_URL=http://back.default.svc.cluster.local/是K8s集群内部的Service DNS地址——这个地址只有集群内的Pod能解析和访问,外部浏览器完全不认它:

  • 集群内的busybox能curl通后端:因为它在集群内部,能识别内部DNS
  • 浏览器用DNS访问时ERR_NAME_NOT_RESOLVED:外部DNS不知道这个集群私有域名
  • 浏览器用Service IP访问时ERR_CONNECTION_TIMED_OUT:外部网络无法路由到集群内部的私有IP网段

这就是问题的核心所在!

解决方案:通过Ingress统一暴露前后端

你已经用Ingress暴露了前端,现在只要把后端也挂到同一个Ingress下,让浏览器能通过外部域名访问后端API:

1. 更新Ingress配置,添加后端路径

把后端API的路径(比如/api)转发到后端Service,修改后的Ingress配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: main-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    # 可选:如果遇到CORS问题,可添加这个配置统一处理
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Origin "";
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: front
          servicePort: 80
      - path: /api  # 替换成你后端实际的API前缀
        backend:
          serviceName: back
          servicePort: 80

2. 修改前端的API_URL为相对路径

把前端环境变量改成相对路径,这样浏览器会自动用当前页面的域名发送请求,避免硬编码外部域名:

env:
- name: API_URL
  value: /api/  # 相对路径,推荐这种方式

3. 确保Angular代码正确读取环境变量

在Angular的environment.ts里配置读取这个环境变量:

export const environment = {
  production: true,
  apiUrl: `${window['env']['API_URL'] || '/api/'}`
};

然后在API服务里使用这个变量:

import { environment } from '../environments/environment';

@Injectable()
export class YourApiService {
  private baseUrl = environment.apiUrl;

  constructor(private http: HttpClient) {}

  fetchData() {
    return this.http.get(`${this.baseUrl}your-endpoint`);
  }
}

额外排查点(如果以上方案不生效)

如果还是有问题,检查这几个地方:

  • 网络策略:确认集群没有配置网络策略阻止Ingress访问后端Service
  • Ingress Controller状态:查看Nginx Ingress Controller的Pod是否正常运行,日志有没有报错
  • 后端Service的Selector:确认后端Service的selector和后端Pod的labels完全匹配(你的配置里是name: product-adviser-back-deployment,检查Pod的labels是否一致)
  • 前端镜像的环境变量注入:确保你的Angular镜像正确读取了API_URL,比如在Nginx配置或构建脚本中做了处理

另外,你提到前端Pod无法ping后端,大概率是因为前端镜像没装ping工具(比如Alpine镜像默认没有),不是网络问题——可以试试在前端Pod里装ping(apk add iputils或apt-get install iputils-ping)再测试,但这不是核心问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:17:58