将 redis-sentinel 连接到 Kubernetes 上的 redis-master
Posted
技术标签:
【中文标题】将 redis-sentinel 连接到 Kubernetes 上的 redis-master【英文标题】:Connecting the redis-sentinel to the redis-master on Kubernetes 【发布时间】:2020-03-08 04:04:38 【问题描述】:我已经使用 .yaml 清单文件成功地将 redis-slaves 与 Kubernetes 上的 redis-master 连接起来,该文件部署为 kubernetes 上的 pod。
但是当我尝试将 redis-sentinel 连接到 master 时,它会拒绝连接 “无法在 127.0.0.1:26379 连接到 Redis:连接被拒绝未连接>”
下面是redis master、slave和sentinel manifest文件:
Redis-Master.yaml
kind: Deployment
metadata:
labels:
name: redis
redis-sentinel: "true"
role: master
name: redis-master
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: k8s.gcr.io/redis:e2e # or just image: redis
env:
- name: MASTER
value: "true"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
Redis-Slave.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-slave
labels:
app: redis
role: slave
tier: backend
spec:
strategy:
type: RollingUpdate
replicas: 3
selector:
matchLabels:
app: redis
role: slave
tier: backend
template:
metadata:
labels:
app: redis
role: slave
tier: backend
spec:
containers:
- name: slave
image: gcr.io/google_samples/gb-redisslave:v3
ports:
- name: redis-server
containerPort: 6379
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: REDIS_REPLICATION_MODE
value: slave
- name: REDIS_MASTER_HOST
value: redis-master
- name: REDIS_MASTER_PORT_NUMBER
value: "6379"
Redis-sentinel
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-sentinel
labels:
app: redis
role: sentinel
tier: backend
spec:
strategy:
type: RollingUpdate
replicas: 3
selector:
matchLabels:
app: redis
role: sentinel
tier: backend
template:
metadata:
labels:
name: redis-sentinel
redis-sentinel: "true"
app: redis
role: sentinel
tier: backend
spec:
containers:
- name: sentinel
image: gcr.io/google_samples/gb-redisslave:v3
ports:
- name: redis-sentinel
containerPort: 26379
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: REDIS_REPLICATION_MODE
value: sentinel
- name: REDIS_MASTER_HOST
value: redis-master
- name: REDIS_MASTER_PORT_NUMBER
value: "6379"
你能告诉我 redis-sentinel 清单文件哪里出错了吗?
【问题讨论】:
请问您的服务器26379端口是否开放? 【参考方案1】:在您的特定用例中部署 Redis-sentinel 时需要考虑的事项很少:
检查防火墙规则。确保您的服务器的端口 26379 已打开。默认情况下,Sentinel 会监听 TCP 端口 26379 的连接。否则,Sentinel 无法交谈,也无法就该做什么达成一致。
检查您的 Sentinel 配置文件 - sentinel.conf
和 Redis 配置文件 - redis.conf
。运行 Sentinel 时必须使用配置文件,因为系统将使用该文件来保存当前状态,以便在重启时重新加载。如果没有给出配置文件或配置文件路径不可写,Sentinel 将直接拒绝启动。
您需要至少 三个 Sentinel 实例才能进行可靠的部署。
您可以在here 找到有关上述某些信息的更多信息。
如果有帮助,请告诉我。
【讨论】:
【参考方案2】:我只是假设您正在尝试从外部连接到 pod。您正在连接到 Kubernetes 环境中不存在的 127.0.0.1。您需要连接到通过简单运行获得的 Pod 的 IP
kubectl describe pod
或者您可以创建一个服务并将该服务的名称用作哨兵中的环境变量。
【讨论】:
我遇到了同样的问题。我正在获取主 pod 的 ip。但我不知道如何连接到这个 pod。在我们的评论中您说:或者您可以创建一个服务并在启动哨兵时使用该服务的名称作为环境变量。你能描述一下我是怎么做到的吗? 每当我们创建服务时,Kubernetes 都会自动填充某些环境变量,例如服务名称和端口。如果您创建一个名为 redis-master 的服务,Kubernetes 会填充 REDIS_MASTER_SERVICE_HOST 和 REDIS_MASTER_SERVICE_PORT。使用这些环境变量来获取主服务的 IP 和端口。【参考方案3】:你不能这样连接它。您必须检查 Kubernetes 上的服务。可以看到 Redis 服务 IP 地址。您必须使用 IP 地址连接
【讨论】:
以上是关于将 redis-sentinel 连接到 Kubernetes 上的 redis-master的主要内容,如果未能解决你的问题,请参考以下文章
使用kubeadm部署k8s集群04-配置kubelet访问kube-apiserver
使用kubeadm部署k8s集群05-配置kubectl访问kube-apiserver
无法连接到我本地 Spring Boot 中在 docker 上运行的 redis sentinel