无法从 Kubernetes 集群上的 Angular pod 向服务发出 GET 请求

Posted

技术标签:

【中文标题】无法从 Kubernetes 集群上的 Angular pod 向服务发出 GET 请求【英文标题】:Cannot make GET request to service from angular pod on kubernetes cluster 【发布时间】:2020-07-21 21:37:02 【问题描述】:

我有一个运行在 nginx 上的 Angular 应用程序以及 Spring Boot 休息服务。 当我在本地启动 docker 容器时,一切正常,所以我唯一的猜测是 Kubernetes 配置有问题。

我在 Chrome 控制台中收到此错误,提供的 IP 地址为Failed to load resource: net::ERR_CONNECTION_TIMED_OUT 但是,使用 DNS 名称,我得到:Failed to load resource: net::ERR_NAME_NOT_RESOLVED

奇怪的是,我可以从 radial/busyboxplus:curl pod 卷曲我的服务,但我无法从我的前端 pod ping 我的服务(构建中没有 curl)。

我正在通过入口访问前端:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: main-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: front
              servicePort: 80

我的前端:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-adviser-front-deployment
  labels:
    app: angular-front
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      name: product-adviser-front-deployment
  template:
    metadata:
      labels:
        name: product-adviser-front-deployment
    spec:
      containers:
        - name: product-adviser-front-app
          image: aurrix/seb:product-adviser-front
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          env:
            - name: API_URL
              value: http://back.default.svc.cluster.local/
          readinessProbe:
            initialDelaySeconds: 30
            httpGet:
              path: /healthz
              port: 80
          livenessProbe:
            initialDelaySeconds: 30
            httpGet:
              path: /healthz
              port: 80
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: front
spec:
  selector:
    name: product-adviser-front-deployment
  ports:
    - port: 80
  type: NodePort

我的后台:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-adviser-back-deployment
  labels:
    app: backend-service
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      name: product-adviser-back-deployment
  template:
    metadata:
      labels:
        name: product-adviser-back-deployment
    spec:
      containers:
        - name: product-adviser-back-deployment
          image: aurrix/seb:product-adviser
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          readinessProbe:
            initialDelaySeconds: 30
            httpGet:
              path: /actuator/health
              port: 8080
          livenessProbe:
            initialDelaySeconds: 30
            httpGet:
              path: /actuator/health
              port: 8080
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: back
spec:
  selector:
    name: product-adviser-back-deployment
  ports:
    - port: 80
      targetPort: 8080

【问题讨论】:

浏览器应用程序试图连接到哪个地址?请记住,Angular 应用程序实际上是在浏览器中运行的,而浏览器对 Kubernetes 一无所知。 在这种情况下似乎也很好,我在下面看到:http://back.default.svc.cluster.local/products和相应的错误Failed to load resource: net::ERR_NAME_NOT_RESOLVED 您的浏览器无法访问该 URL。它必须是通过你的 Ingress 暴露的东西。 执行kubectl get svc 以获取应用程序的外部IP。 @DavidMaze 好的,这实际上是有道理的。你能发布那个答案吗? 【参考方案1】:

您已设置值:http://back.default.svc.cluster.local/ 作为 env,您是否从前端应用程序调用此端点以获取后端服务?如果是这样,这将不起作用,因为前端应用程序在浏览器上运行,并且将进行 API 调用的是浏览器。在这种情况下,您必须在入口中添加另一个规则并将请求路由到后端 pod。

我还注意到前端服务设置为 nodePort 并且从入口直接调用该服务。您可能希望将服务设置为集群 IP(默认),就像后端服务一样。

【讨论】:

以上是关于无法从 Kubernetes 集群上的 Angular pod 向服务发出 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部访问托管在 kubernetes 集群上的 mongodb 副本集?

来自 jupyterhub 的 Kubernetes 上的 Spark 无法与 IRSA 一起使用

从 Kubernetes 集群中的另一个服务连接到 MongoDB Ops Manager 上的 ReplicaSet,给出 MongooseServerSelectionError

Kubernetes (k3s):集群上的过期证书

在同一个 kubernetes 集群中从一个 pod 调用一个 rest api 到另一个 pod

我在两个EC-2实例和仪表板上设置了Kubernetes集群但是我无法在浏览器上访问kubernetes仪表板的ui