'How to connect a NodeJS replica set to a Redis pod running on the same cluster?
I have a NodeJS application running 2 replicas that connects to a Redis pod. I am unable to connect from my NodeJS application to the Redis pod within the same cluster.
I receive an ERRCONFUSED error when my NodeJS pod starts.
The NodeJS application tries to connect to redis on localhost even though I have set the redis host to redis-svc.lesscontacts.cluster.local in the secret yml file.
srv-depl.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: srv
spec:
selector:
matchLabels:
app: srv
replicas: 2
template:
metadata:
labels:
app: srv
spec:
containers:
- name: srv
image: josephakayesi/lesscontactssrv:v0.0.5
ports:
- containerPort: 5000
env:
- name: PORT
valueFrom:
secretKeyRef:
name: srv-secret
key: port
- name: NODE_ENV
valueFrom:
secretKeyRef:
name: srv-secret
key: node-env
- name: MONGO_URI
valueFrom:
secretKeyRef:
name: srv-secret
key: mongo-uri
- name: MONGO_SECRET
valueFrom:
secretKeyRef:
name: srv-secret
key: mongo-secret
- name: REDIS_HOST
valueFrom:
secretKeyRef:
name: srv-secret
key: redis-host
- name: REDIS_PORT
valueFrom:
secretKeyRef:
name: srv-secret
key: redis-port
---
apiVersion: v1
kind: Service
metadata:
name: srv-svc
spec:
selector:
app: srv
ports:
- name: srv
port: 5000
protocol: TCP
targetPort: 5000
redis-depl.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-depl
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-svc
labels:
app: redis
spec:
selector:
app: redis
ports:
- name: redis
port: 6379
protocol: TCP
targetPort: 6379
Cache.ts
import redis, { RedisClient, ClientOpts } from 'redis'
import { promisify, inspect } from 'util'
import { environment, redisHost, redisPort, redisCloudURL } from './keys'
import Logger from '../infrastructure/Logger'
import e from 'express'
const opts: ClientOpts = {
url: redisCloudURL ?? undefined
}
class RedisCache implements CacheMethod {
protected redisClient: RedisClient
protected setAsync: any
protected getAsync: any
constructor() {
this.redisClient = redis.createClient({ url: opts.url })
this.setAsync = promisify(this.redisClient.set).bind(this.redisClient)
this.getAsync = promisify(this.redisClient.get).bind(this.redisClient)
}
connect() {
this.redisClient.on('ready', () => {
Logger.info(`Redis cache connected on host ${redisHost} and on port ${redisPort}`)
})
}
async set(key: string, value: string | number | boolean) {
await this.setAsync(key, value)
}
async get(key: string) {
return (await this.getAsync(key)) as string
}
}
export default new Cache(new RedisCache())
keys.ts
export const redisCloudURL = process.env.REDIS_CLOUD_URL || `redis://${redisHost}:${redisPort}`
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
