node.js – 无法正确连接到Kubernetes中的Redis

在我的macOS(不使用Minikube)上,我在this示例之后模拟了我的Kubernetes集群,这意味着我已按此顺序逐字执行:

# Adding my own service to redix-proxy
kubectl create -f ./redis/redis-service.yaml

# Create a bootstrap master
kubectl create -f examples/storage/redis/redis-master.yaml

# Create a service to track the sentinels
kubectl create -f examples/storage/redis/redis-sentinel-service.yaml

# Create a replication controller for redis servers
kubectl create -f examples/storage/redis/redis-controller.yaml

# Create a replication controller for redis sentinels
kubectl create -f examples/storage/redis/redis-sentinel-controller.yaml

# Scale both replication controllers
kubectl scale rc redis --replicas=3
kubectl scale rc redis-sentinel --replicas=3

# Adding my own NodeJS web client server
kubectl create -f web-deployment.yaml

唯一的区别在于redis-proxy.yaml我使用了图像映像:kubernetes / redis-proxy而不是image:kubernetes / redis-proxy:v2因为我无法拉动后者.

这些是我传递给ioredis以创建我的Redis实例的对象(一个用于会话,一个用作主要实例):

config.js

main: {
  host: 'redis',port: 6379,db: 5
},session: {
  host: 'redis',db: 6
}

错误日志:

在我的Web客户端web-3448218364-sf1q0 pod中,我在日志中重复了这个:

INFO: ctn/53 on web-3448218364-sf1q0: Connected to Redis event
WARN: ctn/53 on web-3448218364-sf1q0: Redis Connection Error:  { [Error: read ECONNRESET] code: 'ECONNRESET',errno: 'ECONNRESET',syscall: 'read' }
INFO: ctn/53 on web-3448218364-sf1q0: Connected to Redis event
WARN: ctn/53 on web-3448218364-sf1q0: Redis Connection Error:  { [Error: read ECONNRESET] code: 'ECONNRESET',syscall: 'read' }
WARN: ctn/53 on web-3448218364-sf1q0: Redis Connection Error:  { [Error: connect ETIMEDOUT] errorno: 'ETIMEDOUT',code: 'ETIMEDOUT',syscall: 'connect' }
WARN: ctn/53 on web-3448218364-sf1q0: Redis Connection Error:  { [Error: connect ETIMEDOUT] errorno: 'ETIMEDOUT',syscall: 'connect' }
INFO: ctn/53 on web-3448218364-sf1q0: Connected to Redis event
WARN: ctn/53 on web-3448218364-sf1q0: Redis Connection Error:  { [Error: read ECONNRESET] code: 'ECONNRESET',syscall: 'read' }
INFO: ctn/53 on web-3448218364-sf1q0: Connected to Redis event

在我的Redis redis-proxy pod中,我在日志中重复了这个:

Error connecting to read: dial tcp :0: connection refused

群集信息:

$kubectl get svc
NAME                      CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
kubernetes                10.91.240.1     

问题1)现在,我需要将我的应用程序实际连接到Redis pod.我应该连接到redis-proxy pod吗?所以,我创建了这个redis-service.yaml服务:

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  ports:
    - port: 6379
      targetPort: 6379
  selector:
    name: redis-proxy
    role: proxy

我相信我已经在端口6379连接到redis,因为如果是这样的话我通常会收到另一条错误消息.进入我的Web容器web-3448218364-sf1q0的bash shell,我看到REDIS_SERVICE_PORT = 6379和REDIS_SERVICE_HOST = 10.91.251.170的printenv变量.

问题2)从我的错误日志中,拨打tcp是什么意思:0:?从我在“服务”和“内部端点”列下的交互式Kubernetes控制台中,我看到了redis服务:

redis:6379 TCP
redis:0 TCP

这与0 TCP有关吗?我的所有服务都在控制台中列出了0个TCP,但正如您所看到的,不是来自kubectl中的CLI获取svc.

最佳答案
始终首先检查kubernetes服务何时不按预期运行是检查相应服务的端点.在你的情况下kubeclt得到ep redis.

如果我的假设是正确的,它应该显示这样的东西

NAME      ENDPOINTS   AGE
redis     

这意味着您的服务不会选择/匹配任何广告连播.

在您的服务规范中,有一个密钥选择器:此选择器必须与您拥有的实际部署的标签相匹配.您正在为所有标签名称的pod选择:redis-proxy和role:proxy,它们可能与任何pod不匹配.

您可以运行kubectl get pod –show-labels = true来显示pod上的标签并相应地更改您的服务.

我不知道端口0在这种情况下意味着什么.有时,它仅用于对服务进行DNS解析.

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...