我正在开发一个使用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
答案 0 :(得分:1)
它可以在localhost上运行,因为主机可能已经配置了redis
并正在运行,因此您的node
正在寻找127.0.0.1:6379
并能够连接到一个主机而没有任何错误。
来到k8s,您部署的application
在同一容器中寻找redis
。因此,执行相同操作时会出错。
在进入GKE或云时,您需要使用运行node
的特定host ip
或url
来配置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
,它应该可以正常工作。