kubernetes中redis和nodejs出错

问题描述 投票:0回答:2

我需要部署web(angularjs)、api(node.js)、redis。但是,我在使用 kubernetes 将 redis 访问 api (node.js) 时遇到错误。

[ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND redis redis:6379
at errnoException (dns.js:50:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)

我尝试了多种配置,但没有任何效果。

const redis = new Redis('redis://redis:6379');
const redis = new Redis({ port: 6379, host: 'redis', connectTimeout: 10000 });
const client = redis.createClient(6379,"redis");

另外,由于标准redis镜像没有redis.conf,所以我添加了redis.conf并在其中绑定0.0.0.0,保护模式是的。我仍然收到错误。

我将所有容器放入一个部署中,即 Web、API、Redis,并使用类型:负载均衡器创建服务。我能够访问该应用程序,但收到 [ioredis] 错误。

Kubernetes version: 1.15.7
Cloud being used: (aws) 
Installation method: kops
Host OS: ubuntu

解决redis错误的任何想法和建议。 最佳部署策略是什么?即web、api、redis如何在k8s中分布?

部署yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  labels:
    app: app1
    env: prod
spec:
  selector:
    matchLabels:
      app: app1
      env: prod
  replicas: 3
  template:
    metadata:
      labels:
        app: app1
        env: prod
    spec:
      containers:
      - name: web-angular-nginx
        image: xxxx.dkr.ecr.us-east-1.amazonaws.com/web
        ports:
        - containerPort: 8080
      - name: api-nodejs
        image: xxxx.dkr.ecr.us-east-1.amazonaws.com/api
        ports:
        - containerPort: 7000
      - name: xxxx.dkr.ecr.us-east-1.amazonaws.com/redis
        image: redis
        ports:
        - containerPort: 6379

服务yaml

apiVersion: v1
kind: Service
metadata:
  name: app-svc
  labels:
    app: app1
spec:
  ports:
  - port: 80
    nodePort: 30001
    protocol: TCP
  selector:
    app: app1
    env: prod
  type: LoadBalancer

谢谢

node.js docker kubernetes redis
2个回答
0
投票

ENOTFOUND 是连接问题 - 您的节点脚本无法连接到指定地址的 Redis 服务器 - 检查您的 Redis 服务器。

将以下行添加到您的配置中:

const redis = require('ioredis');

还可以尝试删除网络并将 redis 部分替换为:

redis:
    image: redis:latest
    command: ["redis-server", "--bind", "redis", "--port", "6379"]

编辑 NetworkManager.conf 文件:

$ vim /etc/NetworkManager/NetworkManager.conf

评论这一行:

#dns=dnsmasq

终于

$ sudo service network-manager restart
$ sudo service docker restart

您可以在这里找到更多信息:redis-kubernetesENOTFOUNDredis-enotfound


0
投票

问题已解决。

错误是我在一个 Pod 中创建了所有容器。在单独的 Pod 和单独的服务中创建每个容器解决了这个问题。

在 Node.js 中,app.js 文件设置为 const Redis = new Redis({ 主机: 'redis' });

© www.soinside.com 2019 - 2024. All rights reserved.