如何在KiND集群中对外暴露Redis+Sentinel并实现本地访问
问题1:Kind集群本地访问Redis集群的暴露方案及操作步骤
必须创建Service暴露服务,Kind集群默认的网络隔离规则会阻止集群外的本地环境直接访问Pod IP,具体操作可以根据使用场景选择两种方案:
- 临时测试场景:使用kubectl端口转发
直接执行命令转发主节点Service的端口到本地:kubectl port-forward svc/redis-master 6379:6379 -n <你的Redis部署命名空间>
转发Sentinel服务端口的命令如下:kubectl port-forward svc/redis-sentinel 26379:26379 -n <你的Redis部署命名空间>
执行后本地就能直接通过127.0.0.1:对应端口访问服务。 - 长期访问场景:创建NodePort类型Service
首先修改你现有Redis和Sentinel的Service配置,将spec.type字段改为NodePort,也可以单独新建暴露用的Service,参考配置片段如下:
部署后先获取Kind节点的IP,执行apiVersion: v1 kind: Service metadata: name: redis-master-nodeport spec: type: NodePort selector: app: redis role: master ports: - port: 6379 targetPort: 6379 nodePort: 30379 # 可选,指定端口需在30000-32767区间内docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <你的Kind集群节点名>,之后就可以通过<节点IP>:30379访问主节点服务。
问题2:集群外部访问入口选择
优先选择访问Sentinel节点:
- 如果直接访问Redis主节点,当主节点发生故障切换后,主节点IP会发生变动,你的客户端配置就要同步修改,非常容易出现连接失败的问题。
- 访问Sentinel节点的话,Sentinel会自动感知当前集群的主节点地址,只需要在客户端配置Sentinel地址列表和master名称,客户端会自动从Sentinel获取当前可用的主节点地址,不需要手动修改配置就能适配故障切换场景。
- 如果你只有读请求需求,也可以通过Sentinel获取从节点地址,直接访问从节点分担读压力。
问题3:Pod崩溃重启对现有连接的影响
分两种场景:
- Redis主节点Pod崩溃重启:已建立的和该主节点的连接会直接断开,未完成的读写请求会失败。如果配置了Sentinel自动故障切换,通常30秒内会选出新的主节点,支持Sentinel自动发现的客户端会自动获取新主节点地址并重连,重连完成后即可恢复服务;如果是直连旧主节点的客户端,需要手动修改配置指向新主节点才能恢复。
- Sentinel节点Pod崩溃重启:如果客户端配置了多个Sentinel节点地址,单个Sentinel节点崩溃不会影响正常使用,客户端会自动切换到其他可用的Sentinel节点查询主节点地址;只有当所有Sentinel节点都不可用时,客户端才会无法获取主节点地址,新连接无法建立,已经和Redis节点建立的连接不受影响。
内容的提问来源于stack exchange,提问作者Mayukh Sarkar
相关产品推荐
相关产品推荐

