在我的 macOS 上(而不是使用 Minikube),我按照 这个 示例建模了我的 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
中我使用了镜像 image: kubernetes/redis-proxy
,而不是 image: kubernetes/redis-proxy:v2
,因为我无法拉取后者。以下是我传递给 ioredis 来创建 Redis 实例(一个用于会话,一个作为主要实例)的对象: config.js
main: {
host: 'redis',
port: 6379,
db: 5
},
session: {
host: 'redis',
port: 6379,
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', 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', errno: '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', code: 'ETIMEDOUT', syscall: 'connect' }
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', code: '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', errno: '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 <none> 443/TCP 2d
redis 10.91.251.170 <none> 6379/TCP 31m
redis-sentinel 10.91.250.118 <none> 26379/TCP 31m
web 10.91.240.16 <none> 80/TCP 31m
$ kubectl get po
NAME READY STATUS RESTARTS AGE
redis-2frd0 1/1 Running 0 34m
redis-master 2/2 Running 0 34m
redis-n4x6f 1/1 Running 0 34m
redis-proxy 1/1 Running 0 34m
redis-sentinel-k8tbl 1/1 Running 0 34m
redis-sentinel-kzd66 1/1 Running 0 34m
redis-sentinel-wlzsb 1/1 Running 0 34m
web-3448218364-sf1q0 1/1 Running 0 34m
$ kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
web 1 1 1 1 39m
问题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后,我看到printenv
变量是 REDIS_SERVICE_PORT=6379
和 REDIS_SERVICE_HOST=10.91.251.170
。
问题2:从我的错误日志中,dial tcp :0:
是什么意思?从我的交互式 Kubernetes 控制台中的服务和内部端点列中,我看到redis
服务如下:redis:6379 TCP
redis:0 TCP
这个 0 TCP
和那个相关吗?我所有的服务在控制台中都列出了 0 TCP,但是如您所见,kubectl get svc
命令行中却没有。
printenv
中是否看到了这个? - Farhad Farahi