最近在学习Kubernetes。我正在尝试使用 redis,但出现以下错误:
Error:Error -3 connecting to redis:6379. Temporary failure in name resolution.
我正在使用:
conn = redis.StrictRedis(host='redis', port=6379)
码头 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
服务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
请您参考如下方法:
发生的事情是您正在使用 NodePort 公开您的 Redis 实例。 . Kubernetes 保留了一个非常具体的范围 high-numbered NodePorts 的网络端口,以避免与常用端口(如 22 或在本例中为 6379(如 Redis)发生冲突)。
当你跑 kubectl get svc返回的服务表明 Redis 正在 port-forwarded到端口 32649 上的主机.因此,当您对 Redis 执行连接尝试时,您应该使用此端口而不是 6379。(还要确保您的防火墙和网络拓扑也正确配置)。
那么,我们该何去何从?嗯,我很难说。我缺乏信息来说明您的客户端连接来自何处以及您的集群在哪里运行。如果您的客户端在您的集群中(又名另一个 Pod),您应该考虑配置 ClusterIP服务而不是 NodePort 服务。
如果您的客户端在集群外部,我给您的建议是研究如何配置 LoadBalancer服务类型和Ingress Kubernetes 中的资源。
这将允许您启动专用 IP。从中您可以在任何端口、主机名或子目录上为您的应用程序提供服务,而不会出现任何问题。但是,要做到这一点,您需要同时拥有 LoadBalancer 和 Ingress Controller安装为 Kubernetes API Server 时两者都没有。
如果您使用的是 Cloud Provider,则很可能您已经拥有 LoadBalancer Controller。只需简单地请求一个然后 kubectl get svc并查看它是否从 Pending 状态前进。如果您在裸机上运行,则可以使用物理负载均衡器,例如 F5 Big IP。或者您可以使用虚拟负载均衡器 Controller ,例如 MetalLB .
两个流行的入口 Controller 是 NGINX和 Istio . NGINX Controller 专门处理入口管理,而 Istio 处理入口管理以及高度可配置的网络和增强的安全性。
如果您需要更多信息或帮助解决此问题,请告诉我。总是乐于助人!




