无法从 kubernetes 集群上的 angular pod 向服务发出 GET 请求 [英] Cannot make GET request to service from angular pod on kubernetes cluster

查看:31
本文介绍了无法从 kubernetes 集群上的 angular pod 向服务发出 GET 请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an Angular app running on Nginx deployed along with Spring Boot rest service. When I launch docker containers locally everything works fine so my only guess is that something wrong with Kubernetes configuration.

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

I receive this error in Chrome console with IP address provided Failed to load resource: net::ERR_CONNECTION_TIMED_OUT However, with DNS name I get: Failed to load resource: net::ERR_NAME_NOT_RESOLVED

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

Strangely, I am able to curl my service from radial/busyboxplus:curl pod but I cannot ping my service from my front pod (don't have a curl in build).

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

I am accessing front through ingress:

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

推荐答案

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

You have set value: http://back.default.svc.cluster.local/ as env, are you calling this endpoint for backend service from your front-end app? If so, this will not work as frontend application runs on browser and it is the browser that will make the API call. In this case you will have to add another rule in the ingress and route the requests to backend pod.

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

I also noticed the frontend service is set to nodePort and from ingress you are calling the service directly. You may want to set the service to cluster-IP(default) like the backend service.

这篇关于无法从 kubernetes 集群上的 angular pod 向服务发出 GET 请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆