Kubernetes - 前端 pod 无法到达后端 pod

Kubernetes - Frontend pod can't reach backend pod

我有一个 minikube Kubernetes 设置有两个 pods,每个都有一个容器。一个用于我的 Vue 前端,一个用于我的后端 API。 pods.

我还有两个附加服务

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

所以在我的例子中,我的前端会通过服务(也可以用作主机名)调用我的后端,例如服务名为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

我是不是漏了一块here/doing有什么不对?非常感谢。

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

curl myapi-service/swagger/index.html

它能够调出 API 的 swagger 页面

更新 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;
        }
    }
}

不需要 Ingress 控制器。正如 Mikolaj 的回答中所解释的那样,前端能够与后端对话。

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

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

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

在您的前端代码中,您需要更改 api 调用。 Insead 直接调用 api 你需要先调用你的网络服务器。

例如:将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服务名

*默认 - k8s 的名称 api-服务命名空间

*端口-api-服务端口

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

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