名称解析redis暂时失败

时间:2020-03-27 20:03:33

标签: kubernetes redis

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

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

我正在使用:

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

docker composer

     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

服务重做:

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

kubectl get 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

2 个答案:

答案 0 :(得分:0)

正在发生的事情是您正在使用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均未安装。

如果您使用的是Cloud Provider,则可能已经有了LoadBalancer控制器。只需先请求一个,然后再kubectl get svc,看看它是否从待处理状态开始。如果您使用裸机操作,则可以使用物理负载平衡器,例如F5 Big IP。或者,您可以使用MetalLB之类的Virtual Load Balancer控制器。

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

让我知道您是否需要任何其他信息或有关此问题的帮助。总是很乐意提供帮助!

答案 1 :(得分:0)

我将下面的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)和此外,如果将microk8s部署在远程服务器上(例如本例),则还需要打开端口6379,以便您的代码可以远程访问它。要测试来自VM的连接性,我使用以下命令: / p>

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