【问题标题】:Ports not receiving fetch request in k8s端口在 k8s 中未接收到 fetch 请求
【发布时间】:2021-11-23 06:55:37
【问题描述】:

我有一个在 arm Mac 上本地运行的 k8s 集群。我有客户端和服务器 pod。客户端是一个 React 前端。该服务器是一个连接到 mongodb Atlas 集群的 express 服务器。

到目前为止,图像构建良好,所有 pod 都在运行。

问题是内部端口路由不起作用。我看到的只是

GET http://localhost:5000/ net::ERR_CONNECTION_REFUSED

网络选项卡中的引荐来源网址策略提示 CORS 错误:

Referrer Policy: strict-origin-when-cross-origin

我不确定我需要做什么才能让我的客户在某个端口上获取?到目前为止,我有这个,它在 k8s 之外工作:

const getAllUsers = () => {
    fetch("http://localhost:5000/")
      .then((res) => res.text())
      .then((res) => {
        return setUsers(JSON.parse(res));
      });
  };

服务器有这个代码来处理请求:

  app.get("/", (req, res) => {
  usersCollection
    .find()
    .toArray()
    .then((results) => {
      res.json(results);
    })
    .catch((error) => console.error(error));
});

我的服务器集群ip服务是这样的:

apiVersion: v1
kind: Service
metadata:
  name: server-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: server
  ports:
    - port: 5000
      targetPort: 5000

而我的服务器部署是这样的:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: server-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      component: server
  template:
    metadata:
      labels:
        component: server
    spec:
      containers:
        - name: server
          image: mydocker/k8s-server
          ports:
            - containerPort: 5000
          env:
            - name: REDIS_HOST
              value: redis-cluster-ip-service
            - name: REDIS_PORT
              value: "6379"

当我注销服务器部署日志时,我得到:

> express_mongodb@1.0.0 dev /app
> nodemon server.js

[nodemon] 2.0.12
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
Connected to Database
listening on 5000

这很棒——它正在监听我指定的端口

 app.listen(PORT, function () {
  console.log("listening on 5000");
});

有些东西我没有讲到。我要做的第一件事是确保我的服务器在端口 5000 上连接到我的客户端 - 我做错了什么?

编辑:在长时间查看 CORS 错误修复后,也许它不是 CORS 错误?我使用以下命令卷曲服务 ip:

curl my.ip.##.##

那就试试吧:

curl localhost:5000

但是请求超时。

我用kubectl describe service server-cluster-ip-service

然后回来

Name:              server-cluster-ip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          component=server
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.###.##.##
IPs:               10.###.##.##
Port:              <unset>  5000/TCP
TargetPort:        5000/TCP
Endpoints:         172.##.#.##:5000,172.##.#.##,172.##.#.##
Session Affinity:  None
Events:            <none>

【问题讨论】:

    标签: node.js express kubernetes fetch port


    【解决方案1】:

    理想情况下,您应该使用服务名称与集群内的不同服务进行通信。

    如果你的 react server 想和 express server 对话,你必须以express-service-name 作为主机进入 react 服务。 Kubernetes 会自动管理分辨率。

    所以对你来说,它将是server-cluster-ip-service

    const getAllUsers = () => {
        fetch("http://server-cluster-ip-service:5000/")
          .then((res) => res.text())
          .then((res) => {
            return setUsers(JSON.parse(res));
          });
      };
    

    就像在单个机器或主机中一样,所有服务都可以在 localhost 上相互通信,就像在 Kubernetes 集群服务中使用服务名称来相互解决一样。

    服务和 POD 的参考文档 DNS:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

    您表示集群 POD 或应用程序将在 0.0.0.0/0 和端口 5000 上运行,并且您现在使用 target port 5000 创建一个 Kubernetes 服务

    您的客户端或其他应用程序内部将通过服务名称调用此服务,并将请求重定向到快速服务器的容器 (POD)。

    【讨论】:

    • 这还不工作 - 它调用 server-cluster-ip-service,但我仍然收到 CORS 错误
    猜你喜欢
    • 2022-01-07
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多