【问题标题】:Kubernetes - Frontend pod can't reach backend podKubernetes - 前端 pod 无法访问后端 pod
【发布时间】:2022-01-15 07:38:57
【问题描述】:

我有一个 minikube Kubernetes,有两个 pod,每个 pod 都有一个容器。一个用于我的 Vue 前端,一个用于我的后端 API。我还有两个附加到 pod 的服务。

我的理解是,当 Pod 重启或移动到不同的节点时,前端和后端的 IP 地址会发生变化,我们不应该使用 IP 地址来链接它们,而是使用服务。

所以在我的情况下,我的前端会通过服务(也可以用作主机名)调用我的后端,例如服务被称为myapi-service,使用http://myapi-service

我的问题是在我启动前端后,它使用上述主机名发送的任何请求都不起作用,它无法连接到我的后端。

app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapi-deployment
  labels:
    app: myrapi
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapi
  template:
    metadata:
      labels:
        app: myapi
    spec:
      containers:
      - name: myapi
        image: myapi
        imagePullPolicy: Never
        ports:
        - containerPort: 80
        env:
        - name: TZ
          value: America/Toronto
        - name: ASPNETCORE_ENVIRONMENT
          value: Development_Docker
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myui-deployment
  labels:
    app: myui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myui
  template:
    metadata:
      labels:
        app: myui
    spec:
      containers:
      - name: myui
        image: myui
        imagePullPolicy: Never
        ports:
        - containerPort: 8080
        env:
        - name: NODE_ENV
          value: Development

app-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapi-service
  labels:
    run: myapi-service
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: myapi
  type: NodePort
  
---

apiVersion: v1
kind: Service
metadata:
  name: myui-service
  labels:
    run: myui-service
spec:
  ports:
  - port: 8080
    protocol: TCP
  selector:
    app: myui
  type: NodePort

Kubernetes Service

我是否在这里遗漏了一部分/做错了什么?非常感谢。

更新:如果我进入我的前端容器

curl myapi-service/swagger/index.html

它能够拉起 API 的招摇页面

更新 2,解决方案:

我重构了我的 Dockerfile 以使用 NGINX 为我的前端 Vue 应用程序提供服务

Dockerfile

FROM node:14 as builder

# make the 'app' folder the current working directory
WORKDIR /app

# copy both 'package.json' and 'package-lock.json' (if available)
COPY package*.json ./

# install project dependencies
RUN npm install

# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . .

# build app
RUN npm run build

FROM nginx:alpine
COPY ./.nginx/nginx.conf /etc/nginx/nginx.conf

## Remove default nginx index pagec
RUN rm -rf /usr/share/nginx/html/*

# Copy from the stage 1
COPY --from=builder /app/dist /usr/share/nginx/html

EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]

并在我前端的根文件夹中创建了一个名为.nginx 的文件夹,其中包含nginx.conf 文件。 nginx.conf

worker_processes 4;

events { worker_connections 1024; }

http {
    server {
        listen 80;
        root  /usr/share/nginx/html;
        include /etc/nginx/mime.types;

        location /appui {
            try_files $uri /index.html;
        }
        
        location /api/ {
            proxy_pass http://myapi-service;
        }
    }
}

不需要入口控制器。正如 Mikolaj 的回答中所解释的那样,前端能够与后端通信。

希望有人能发现这个有用!~ ^

【问题讨论】:

  • 前端是基于浏览器的应用程序吗?您是否在浏览器日志中看到错误消息?您的浏览器在 Kubernetes 集群之外,无法直接连接到这样的服务。
  • 您要部署到命名空间吗?
  • 是的,我的前端是一个基于浏览器的应用程序。如果我运行minikube ssh 并执行curl myapi-service,它只是说无法解析主机
  • @SiHa 一切都被部署到默认命名空间中
  • 更新:如果我从我的 UI 容器 curl 到我的 API 的 Swagger,它可以工作!即curl myapi-service/swagger/index.html

标签: docker kubernetes kubectl minikube


【解决方案1】:

您无法使用 kubernetes DNS(如 http://myapi-service)从前端 pod 访问后端 pod,因为您的前端在浏览器中运行 - 在集群外部。浏览器不会解开 kubernetes DNS,因此无法解析您的 http://myapi-service url。

如果您想使用K8S DNS 与您的后端通信,您需要使用任何网络服务器,例如nginx。托管您的前端应用程序的 Web 服务器实际上是在 Kubernetes 集群上运行的,因此它可以理解 K8S DNS

在您的前端代码中,您需要更改 api 调用。也可以直接调用你需要的api,首先调用你的web server。

例如:将 http://api-service/api/getsomething 替换为 /api/getsomething

/api/getsomething - 这将告诉浏览器它将请求发送到为您的前端应用程序提供服务的同一服务器(在这种情况下为nginx

然后通过nginx 服务器调用可以使用K8S DNS 转发到您的api。 (称为反向代理

要将您的请求转发到 api,请在 nginx 配置文件中添加一些代码。

location /api/ {
    proxy_pass http://api-service.default:port;
}

*api-service - 你的 k8s 服务名称

*default - k8s api-service 命名空间的名称

*port - api服务端口

从现在开始,您所有的前端请求都包含 /api/.. 短语将被转发到您的 api-service/api/..

/api/getsomething -> http://api-service/api/getsomething

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2019-05-02
    • 2020-07-06
    • 2021-06-16
    • 2019-01-28
    • 2021-05-06
    • 2023-04-07
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多