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
我有一个 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