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

时间:2020-09-22 13:34:06

标签: node.js kubernetes redis kubernetes-pod kubernetes-service

我正在开发一个使用socket.io的应用程序(car-app)。现在我将其部署到kubernetes集群。然后,我使用Redis的pub / 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群集上运行时出错:

错误:Redis与127.0.0.1:6379的连接失败-连接 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

1 个答案:

答案 0 :(得分:1)

它可以在localhost上运行,因为主机可能已经配置了redis并正在运行,因此您的node正在寻找127.0.0.1:6379并能够连接到一个主机而没有任何错误。

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

在进入GKE或云时,您需要使用运行node的特定host ipurl来配置redis应用程序。如此,我可以看到您已经在您的k8集群中运行了redis,如果它与node应用程序部署所在的集群相同,则可以使用类似的方法直接将其与服务连接

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

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

相关问题