【问题标题】:Temporary failure in name resolution redisredis名称解析暂时失败
【发布时间】:2020-07-08 15:03:05
【问题描述】:

我最近一直在学习 Kubernetes。我正在尝试使用 redis,但出现以下错误:

Error:Error -3 connecting to redis:6379. Temporary failure in name resolution.

我正在使用:

  conn = redis.StrictRedis(host='redis', port=6379)

码头工人作曲家

     redis: 
        image: redis:alpine 
        ports:
          - "6379:6379" 

redis-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deploy
spec:
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:alpine
        ports:
        - containerPort: 6379

服务 redis:

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

kubectl 获取 svc

redis            NodePort    10.152.183.209   <none>        6379:32649/TCP   7m31s

编辑:图像是从 docker 拉取的,这里是部署文件之一。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: greeter-client-deploy
spec:
  replicas: 10
  selector:
    matchLabels:
      app: greeter-client
  minReadySeconds: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: greeter-client
    spec:
      containers:
      - name: greeter-client
        image: seancork92/greeter_client:latest

【问题讨论】:

  • 那个python代码在哪里运行?
  • 我添加了一个编辑。它从 docker 中拉出,并在每个 redis、服务器的容器 pod 中(如编辑中所示)
  • 你提到的这个 docker composer 和 kubernetes 有什么关系?请解释你的设置,什么在哪里运行。什么与什么有关。您还提到了greeter_client:latest 图像,但是当我拉出它时,我发现客户端代码中没有与 redis 相关的代码。你的描述很混乱,请具体点,因为现在我们只能猜测。

标签: kubernetes redis


【解决方案1】:

发生的情况是您正在使用NodePort 公开您的 Redis 实例。 Kubernetes 为 NodePorts 保留了一个非常具体的high-numbered 网络端口范围,以避免与常用的端口(如 22)或在本例中为 6379(如 Redis)发生冲突。

当您运行kubectl get svc 时,返回的服务表明Redis 正在port-forwarded 到端口32649 上的主机。因此,当您尝试连接 Redis 时,您应该使用此端口而不是 6379。(同时确保您的防火墙和网络拓扑也已正确配置)。

那么,我们从这里去哪里?好吧,我很难说。我缺乏信息来告诉您的客户端连接来自哪里以及您的集群在哪里运行。如果您的客户端在您的集群中(也称为另一个 Pod),您应该考虑配置 ClusterIP 服务而不是 NodePort 服务。

如果您的客户端在集群外部,我的建议是研究如何在 Kubernetes 中配置 LoadBalancer 服务类型和 Ingress 资源。

这将允许您启动专用 IP。您可以通过它在任何端口、主机名或子目录上为您的应用程序提供服务,而不会出现任何问题。但是,要做到这一点,您需要同时安装 LoadBalancer 和 Ingress Controller,因为 Kubernetes API Server 两者都没有。

如果您使用的是云提供商,您可能已经拥有一个 LoadBalancer 控制器。只需简单地请求一个然后kubectl get svc 并查看它是否会从 Pending 状态前进。如果您在裸机上运行,​​则可以使用 F5 Big IP 之类的物理负载均衡器。或者,您可以使用虚拟负载平衡器控制器,例如 MetalLB

两个流行的 Ingress Controller 是 NGINXIstio。 NGINX 控制器专门处理入口管理,而 Istio 处理该管理以及高度可配置的网络和增强的安全性。

如果您在这个问题上需要任何进一步的信息或帮助,请告诉我。总是乐于提供帮助!

【讨论】:

    【解决方案2】:

    我将下面的 yaml 文件用于 redis(我从 How to deploy a node.js with redis on kubernetes? 获取并修改了一点):

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: redis
      name: redis
    spec:
      externalIPs:
      - 192.168.2.146
      selector:
        app: redis
      type: NodePort
      ports:
      - port: 6379
        nodePort: 32000
        protocol: TCP
        targetPort: 6379
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis-deploy
    spec:
      selector:
        matchLabels:
          app: redis
      template:
        metadata:
          labels:
            app: redis
        spec:
          containers:
          - name: redis
            image: redis:latest
            ports:
            - containerPort: 6379
            volumeMounts:
            - name: data
              mountPath: /data
              readOnly: false
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: redis-data          
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: redis-data
      labels:
        app: redis
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Mi
    

    使用 yaml 文件部署后,当您运行 microk8s.kubectl get services 时,您应该会得到如下响应:

    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    kubernetes   ClusterIP   10.152.183.1     <none>         443/TCP          14d
    redis        NodePort    10.152.183.114   192.168.2.146   6379:32000/TCP   14m
    

    在我的情况下,microk8s 部署在 192.168.2.146 上的本地 VM 上(在 externalIPs 中进行了描述。因此,通过此设置,我可以从本地 VM(CentOS)和父计算机访问 redis (Windows)。另外,如果 microk8s 部署在像我这样的远程服务器上,您还需要打开端口 6379,以便您的代码可以远程访问它。为了测试来自 VM 的连接性,我使用了以下命令:

    echo PING | nc 192.168.2.146 6379
    echo PING | nc localhost 32000
    

    对于这两个命令,您都应该得到响应:

    +PONG
    

    在 Windows 中,您可以使用 PowerShell 并使用命令 tnc 192.168.2.146 -port 6379 来测试连接性。您应该得到如下响应:

    ComputerName     : 192.168.2.146
    RemoteAddress    : 192.168.2.146
    RemotePort       : 6379
    InterfaceAlias   : <alias>
    SourceAddress    : <source_ip>
    TcpTestSucceeded : True
    

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2012-04-17
      • 2019-05-10
      • 2019-06-21
      • 2019-10-04
      相关资源
      最近更新 更多