redis名称解析暂时失败

Jac*_*ack 9 redis kubernetes

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

Error:Error -3 connecting to redis:6379. Temporary failure in name resolution.
Run Code Online (Sandbox Code Playgroud)

我在用着:

  conn = redis.StrictRedis(host='redis', port=6379)
Run Code Online (Sandbox Code Playgroud)

码头工人作曲家

     redis: 
        image: redis:alpine 
        ports:
          - "6379:6379" 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

服务redis:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: redis
  name: redis
spec:
  selector:
    app: redis
  type: NodePort
  ports:
  - port: 6379
    protocol: TCP
Run Code Online (Sandbox Code Playgroud)

kubectl 获取 svc

redis            NodePort    10.152.183.209   <none>        6379:32649/TCP   7m31s
Run Code Online (Sandbox Code Playgroud)

编辑:图像是从 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
Run Code Online (Sandbox Code Playgroud)

TJ *_*man 1

发生的情况是您使用NodePort公开您的 Redis 实例。Kubernetes 为 NodePorts 保留了非常特定范围的高编号网络端口,以避免与常用端口(如 22 或本例中的 6379(如 Redis))发生冲突。

当您运行kubectl get svc返回的服务时,表明 Redis 正在端口转发到端口 上的主机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 控制器是NGINXIstio。NGINX 控制器专门处理入口管理,而 Istio 则处理入口管理以及高度可配置的网络和增强的安全性。

如果您需要任何进一步的信息或帮助解决此问题,请告诉我。总是很乐意提供帮助!