我最近一直在学习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
答案 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是NGINX和Istio。 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