【发布时间】: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
我是否在这里遗漏了一部分/做错了什么?非常感谢。
更新:如果我进入我的前端容器
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