【问题标题】:How do you have a client deployment communicate with the api deployment in kubernetes你如何让客户端部署与 Kubernetes 中的 api 部署通信
【发布时间】:2020-07-15 01:00:27
【问题描述】:

我在本地主机和云中得到的只是 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 中注入环境变量到映像中。我确实找到了一种非常老套的方法来创建一个带有窗口全局变量的文件,然后让 k8s 用新的窗口变量覆盖该文件。但同样我必须先获取 api 的外部 IP,然后再这样做。

【问题讨论】:

  • host: api-development.default 看起来不像一个真正的域名,如果没有它,我认为这不会奏效。你能详细说明一下吗?
  • @OhHiMark 是部署名称。我使用 db-service.default hostname.namespace 将数据库连接到 api。这是否意味着我必须先购买域名才能使用自动 dns 解析?
  • 是的,没错。
  • 你成功了吗?
  • @OhHiMark 不,因为这只是一个练习项目,我不会为了让它工作而购买域名。另外,我正在练习的项目不会有任何 100 个项目的域名,所以我必须学会以不同的方式获取 IP。也许 Terraform 输出

标签: node.js kubernetes nginx-ingress


【解决方案1】:

正如我们在 cmets 中所讨论的,您需要获得一个真实的域名才能使其正常工作,因为在您的情况下,自动 DNS 解析基本上需要它。

【讨论】:

    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多