K8s集群中NodeJS中的服务如何连接Redis?

How to connect Redis with service in NodeJS in K8s cluster?

我正在开发一个使用 socket.io 的应用程序 (car-app)。现在我要把它部署到 kubernetes 集群。然后我使用Redispub/sub函数进行通信

My app structure:
  Backend: NodeJS
  Frontend: ReactJS
  Mongodb

然后我尝试在 NodeJS 中连接 Redis。它可以在我的本地主机上 运行,但在我的 GKE 集群上不能 运行。

(NodeJS)
const redis = require('redis');
const REDISPORT = 6379;
const subscriber = redis.createClient(REDISPORT, redis);

在 GKE 集群上 运行ning 时出错:

Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379

我认为这可能是服务连接导致的,我的redis部署和服务配置如下。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: car-redis-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: car-redis
    spec:
      containers:
        - name: car-redis
          image: redis:latest
          ports:
            - containerPort: 6379
              name: http-port
  selector:
    matchLabels:
      app: car-redis

apiVersion: v1
kind: Service
metadata:
  name: car-redis-service
spec:
  ports:
    - port: 6379
      protocol: TCP
      targetPort: 6379
  selector:
    app: car-redis
  type: NodePort

它在本地主机上工作,因为主机可能已经配置了 redis 运行,所以你的 node 正在寻找 127.0.0.1:6379 并且它能够连接到一个没有任何错误。

来到 k8s,您部署的 application 正在同一容器中寻找 redis。因此,您在执行相同操作时遇到错误。

在使用 GKE 或云时,您需要使用特定的 host ipurl 配置您的 node 应用程序,您的 redis 应用程序 [=38] =].因为,我可以看到你已经 运行 a redis 在你的 k8 集群中,如果它与你的 node 应用程序部署是同一个集群,你可以使用类似的东西直接将它与服务连接这个

<service-name>.<namespace-name>.svc.cluster.local How to communicate between ns?

根据您的示例,确保您的 node 应用支持 redis url 而不仅仅是端口。并在您的 node 应用程序中添加您的配置 car-redis-service.default.svc.cluster.local:6379 它应该可以正常工作。