如何解决在 Kubernetes 中无法连接到 Redis:Redis connection to localhost:6379 failed
我已经部署了一个连接到 Redis pod 和 Mongodb pod 的后端 API。 API 已成功建立到 mongodb 的连接,但没有建立到 Redis 的连接,出现以下错误,有人知道如何修复吗?
Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1088:14)
2021-01-18 09:22:36 error: uncaughtException: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1088:14) {"error":{"errno":"ECONNREFUSED","code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":6379},"stack":"Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379\n at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1088:14)","exception":true,"date":"Mon Jan 18 2021 09:22:36 GMT+0000 (Coordinated Universal Time)","process":{"pid":1,"uid":0,"gid":0,"cwd":"/usr/src/app","execPath":"/usr/local/bin/node","version":"v11.14.0","argv":["/usr/local/bin/node","/usr/src/app/dist/server.js"],"memoryUsage":{"rss":101421056,"heapTotal":73146368,"heapUsed":37365856,"external":19092480}},"os":{"loadavg":[1.232421875,0.8720703125,0.69482421875],"uptime":281868},"trace":[{"column":14,"file":"net.js","function":"TCPConnectWrap.afterConnect [as oncomplete]","line":1088,"method":"afterConnect [as oncomplete]","native":false}]}
后端.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-api
spec:
replicas: 1
selector:
matchLabels:
app: backend-api
template:
metadata:
labels:
app: backend-api
spec:
containers:
- image: <image_name>
name: backend-test
imagePullPolicy: Never
ports:
- containerPort: 8080
env:
- name: MONGODB_URL
value: mongodb://localhost:27017/dt?authSource=admin
- name: REDIS_URL
value: redis://localhost:6379
restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
name: backend-svc
labels:
app: backend-svc
spec:
selector:
app: backend-api
ports:
- name: http
port: 8080
targetPort: 8080
redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-master
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
replicas: 1
template:
metadata:
labels:
app: redis
spec:
containers:
- name: master
image: k8s.gcr.io/redis:e2e # or just image: redis
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
spec:
ports:
- name: redis
port: 6379
targetPort: 6379
selector:
app: redis
我也尝试将端口转发到 pod 上的端口,但没有成功
kubectl port-forward redis-master-765d459796-258hz 6379:6379
解决方法
localhost 用于在一个 Pod 中的容器之间进行通信。试试 redis-master:6379
,localhost 仅用于本地连接。这意味着您只能从带有 localhost 的 pod 内部进行连接。当您需要从外部访问时,您需要使用服务。然后服务将解析您的 IP 地址。当您尝试通过 service 访问时。这是需要在您的 yaml 中更新的代码。
- name: REDIS_URL
value: redis://redis-master.default.svc.cluster.local:6379
模板类似于 my_Service_Name.my_Namespace.svc.cluster-domain.example
,但您可以跳过 cluster-domain.example
部分。只有 Service_Name.Namespace.svc
可以正常工作。所以对你来说就是:redis-master.default.svc
这是更新的代码:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-api
spec:
replicas: 1
selector:
matchLabels:
app: backend-api
template:
metadata:
labels:
app: backend-api
spec:
containers:
- image: <image_name>
name: backend-test
imagePullPolicy: Never
ports:
- containerPort: 8080
env:
- name: MONGODB_URL
value: mongodb://localhost:27017/dt?authSource=admin
- name: REDIS_URL
value: redis://redis-master.default.svc.cluster.local:6379
restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
name: backend-svc
labels:
app: backend-svc
spec:
selector:
app: backend-api
ports:
- name: http
port: 8080
targetPort: 8080
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。