'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