您如何让客户端部署与 kubernetes 中的 api 部署通信
How do you have a client deployment communicate with the api deployment in kubernetes
我在本地主机和云中得到的只是 CORS 错误。如果我手动输入 localhost 或者我手动获取服务外部 IP 并在部署之前将其输入到 k8s 部署文件中,它会起作用,但是如果我必须启动服务、获取外部 IP 和然后在每次启动之前将其放入配置中。
API 服务
apiVersion: v1
kind: Service
metadata:
labels:
app: api
name: api-service
spec:
ports:
- port: 8080 # expose the service on internal port 80
protocol: TCP
targetPort: 8080 # our nodejs app listens on port 8080
selector:
app: api # select this application to service
type: LoadBalancer
status:
loadBalancer: {}
客户服务
apiVersion: v1
kind: Service
metadata:
name: client-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: client
type: LoadBalancer
status:
loadBalancer: {}
API部署
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: api
name: api-deployment
spec:
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- image: mjwrazor/docker-js-stack-api:latest
name: api-container
imagePullPolicy: IfNotPresent
resources: {}
stdin: true
tty: true
workingDir: /app
ports:
- containerPort: 8080
args:
- npm
- run
- start
envFrom:
- configMapRef:
name: server-side-configs
restartPolicy: Always
volumes: null
serviceAccountName: ""
status: {}
客户端部署
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: client
name: client-deployment
spec:
selector:
matchLabels:
app: client
template:
metadata:
labels:
app: client
spec:
restartPolicy: Always
serviceAccountName: ""
containers:
- image: mjwrazor/docker-js-stack-client:latest
name: client-container
imagePullPolicy: IfNotPresent
resources: {}
ports:
- containerPort: 80
status: {}
我尝试添加入口
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, DELETE, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: http://client-service.default
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
rules:
- host: api-development.default
http:
paths:
- backend:
serviceName: api-service
servicePort: 8080
但也无济于事。这是 server.js
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
app.get("/", (req, res) => {
res.json({ message: "Welcome" });
});
require("./app/routes/customer.routes.js")(app);
// set port, listen for requests
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}.`);
});
但是就像我说的那样,我正在尝试通过服务的主机名来解决这个问题,而不必使用外部 IP,这是否可能,或者我是否误解了一些东西。
客户端发送axios请求。无法使用环境变量,因为在通过 webpack 和 docker 构建项目后,您无法从 k8s 注入环境变量到图像中。我确实找到了一种使用 window 全局变量创建文件然后让 k8s 用新的 window 变量覆盖该文件的非常 hacky 的方法。但我必须先获取 api 的外部 IP,然后再执行此操作。
正如我们在评论中所讨论的那样,您需要获得一个真实的域名才能使其正常工作,因为在您的情况下,自动 DNS 解析基本上需要它。
我在本地主机和云中得到的只是 CORS 错误。如果我手动输入 localhost 或者我手动获取服务外部 IP 并在部署之前将其输入到 k8s 部署文件中,它会起作用,但是如果我必须启动服务、获取外部 IP 和然后在每次启动之前将其放入配置中。
API 服务
apiVersion: v1
kind: Service
metadata:
labels:
app: api
name: api-service
spec:
ports:
- port: 8080 # expose the service on internal port 80
protocol: TCP
targetPort: 8080 # our nodejs app listens on port 8080
selector:
app: api # select this application to service
type: LoadBalancer
status:
loadBalancer: {}
客户服务
apiVersion: v1
kind: Service
metadata:
name: client-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: client
type: LoadBalancer
status:
loadBalancer: {}
API部署
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: api
name: api-deployment
spec:
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- image: mjwrazor/docker-js-stack-api:latest
name: api-container
imagePullPolicy: IfNotPresent
resources: {}
stdin: true
tty: true
workingDir: /app
ports:
- containerPort: 8080
args:
- npm
- run
- start
envFrom:
- configMapRef:
name: server-side-configs
restartPolicy: Always
volumes: null
serviceAccountName: ""
status: {}
客户端部署
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: client
name: client-deployment
spec:
selector:
matchLabels:
app: client
template:
metadata:
labels:
app: client
spec:
restartPolicy: Always
serviceAccountName: ""
containers:
- image: mjwrazor/docker-js-stack-client:latest
name: client-container
imagePullPolicy: IfNotPresent
resources: {}
ports:
- containerPort: 80
status: {}
我尝试添加入口
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, DELETE, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: http://client-service.default
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
rules:
- host: api-development.default
http:
paths:
- backend:
serviceName: api-service
servicePort: 8080
但也无济于事。这是 server.js
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
app.get("/", (req, res) => {
res.json({ message: "Welcome" });
});
require("./app/routes/customer.routes.js")(app);
// set port, listen for requests
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}.`);
});
但是就像我说的那样,我正在尝试通过服务的主机名来解决这个问题,而不必使用外部 IP,这是否可能,或者我是否误解了一些东西。
客户端发送axios请求。无法使用环境变量,因为在通过 webpack 和 docker 构建项目后,您无法从 k8s 注入环境变量到图像中。我确实找到了一种使用 window 全局变量创建文件然后让 k8s 用新的 window 变量覆盖该文件的非常 hacky 的方法。但我必须先获取 api 的外部 IP,然后再执行此操作。
正如我们在评论中所讨论的那样,您需要获得一个真实的域名才能使其正常工作,因为在您的情况下,自动 DNS 解析基本上需要它。