临时的名称解析失败 redis

8

最近我一直在学习Kubernetes。我尝试使用Redis,但是遇到了以下错误:

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

我正在使用:

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

Docker Compose(Docker组合):
     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 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

那段 Python 代码在哪里运行? - coderanger
我添加了一个编辑。它从Docker中拉取,并在每个Redis服务器的容器Pod中运行(如编辑所示)。 - Jack
你提到的Docker Compose和Kubernetes有什么关系?请解释一下你的设置,哪里在运行。有什么连接方式。你还提到了greeter_client:latest镜像,但是当我拉取它时,发现客户端代码中没有与Redis相关的代码。你的描述非常混乱,请具体说明,因为现在我们只能猜测。 - Matt
2个回答

1
你所做的是将 Redis 实例暴露到 NodePort。Kubernetes 保留了一系列特定范围的高编号网络端口用于 NodePorts,以避免与常用端口(例如22或者在本例中的6379)发生冲突。
当你运行 kubectl get svc 命令时,返回的服务表明 Redis 正在通过端口 32649端口转发 到主机上。因此,在尝试连接 Redis 时,应该使用这个端口,而不是6379端口。(还要确保防火墙和网络拓扑配置正确)。

那么,我们接下来该怎么办呢?嗯,很难说。我缺乏信息告诉您的客户端连接是从哪里发起的以及您的集群在哪里运行。如果您的客户端在您的集群内(也就是另一个 Pod 中),您应该考虑使用 ClusterIP 服务而不是 NodePort 服务。

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

这将允许您快速启动专用 IP。您可以在任何端口、主机名或子目录上提供应用程序而不会出现任何问题。但是,为此,您需要安装 LoadBalancer 和 Ingress Controller,因为 Kubernetes API Server 没有这两个功能。

如果您正在使用云提供商,那么您很可能已经拥有一个负载均衡器控制器。只需简单地请求一个并且运行kubectl get svc 命令,查看它是否从待定状态进展。如果您在裸机上操作,则可以使用物理负载均衡器,例如F5 Big IP。或者您可以使用虚拟负载均衡器控制器,例如MetalLB
两个流行的入口控制器是NGINXIstio。 NGINX控制器专门处理入口管理,而Istio除了高度可配置的网络和增强安全性外,还处理入口管理。
如果您需要进一步的信息或帮助解决这个问题,请告诉我。我很乐意提供帮助!

1

我使用了下面的yaml文件来部署redis(我从如何在kubernetes上部署带有redis的node.js?获取并进行了一些修改):

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部署在本地VM上,该VM位于192.168.2.146(在externalIPs中描述)。因此,使用这个设置,我可以从本地VM(CentOS)和父机(Windows)访问redis。另外,如果像我这样在远程服务器上部署了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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接