【问题标题】:Redis connect ECONNREFUSED in NodeJS in Kubernetes clusterRedis在Kubernetes集群的NodeJS中连接ECONNREFUSED
【发布时间】:2021-01-13 02:33:16
【问题描述】:

我正在部署一个具有 3 个副本的 NodeJS 服务器并连接到 Redis 以使用 Sub/Pub 功能。

NodeJS:

const redis = require('redis');
const REDISPORT = 6379;
const subscriber = redis.createClient(REDISPORT, 'redis-service.default.svc.cluster.local');
const publisher = redis.createClient(REDISPORT, 'redis-service.default.svc.cluster.local');
所有三个 NodeJS pod 中的

错误

Error: Redis connection to redis-service.default.svc.cluster.local:6379 failed - connect ECONNREFUSED 10.120.14.77:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
Emitted 'error' event on RedisClient instance at:
    at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:341:14)
    at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:222:14)
    at Socket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '10.120.14.77',
  port: 6379
}

你可以看到当我在 NodeJS pod 中使用 'redis-service.default.svc.cluster.local' 时,它会得到我的 Redis 服务 ip 10.120.14.77:6379 strong> 自动。

当我检查“kubectl get svc redis”时,我的 Redis 服务 ip 与 10.120.14.77:6379 相同

- kubectl get svc redis
redis-service   ClusterIP   10.120.14.77   <none>        6379/TCP   74s

- kubectl logs redis
27 Sep 2020 08:41:20.309 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

服务器部署.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: car-server-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: car-server
    spec:
      containers:
        - name: car-server
          image: gcr.io/PROJECT_ID/IMAGE_SERVER:TAG
          ports:
            - containerPort: 8080
              name: nodejs-port
  selector:
    matchLabels:
      app: car-server

server-service.yml:

apiVersion: v1
kind: Service
metadata:
  name: car-server-service
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: car-server
  type: NodePort

redis-pod.yml:

apiVersion: v1
kind: Pod
metadata:
  name: redis
  labels:
    app: redis
spec:
  containers:
  - name: redis
    image: redis:5.0.4
    command:
      - redis-server
    env:
    - name: MASTER
      value: "true"
    ports:
    - containerPort: 6379

redis-service.yml:

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

【问题讨论】:

  • 编辑问题以添加kubectl describe svc redis-service的输出

标签: node.js kubernetes redis


【解决方案1】:

尝试了几个小时,终于解决了。这是我创建 kustomization.yml 时的一个小错误。因此,基本上与 Redis 或 NodeJS 无关。

上一个错误文件:kustomization.yml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
  app: my-app
bases:
- ./yaml

我把commonLabels放在这里,kustomize覆盖了我的Redis标签,导致网络错误。

这是因为我在我的 redis pod 中也使用了“app label”。

新文件:kustomization.yml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ./yaml

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 2020-06-10
    • 2021-01-04
    • 2021-07-03
    • 2019-07-01
    • 2016-05-23
    • 2019-06-20
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多