Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)


梦想不会逃跑,逃跑的永远是自己。勇敢追逐你的梦想,即使路途遥远。


Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)

一、项目需求

开发需要本地调试线上服务,涉及到了使用redis实现幂等,可以避免重复操作导致的数据错误

因为安全考虑,现场用不了KT-connect、Telepresence、OpenVPN等穿透到集群内部代理的工具

二、影响范围

之前redis是使用的集群内网连接,改用node ip方式连接,所有微服务更换redis连接URL,数据使用Redis-Shake工具全量和增量同步

三、环境信息

服务 版本 部署方式
Kubernetes 1.29 一主一从
Redis 7.0.12 集群模式

四、前提说明

1、redis部署类型

1)主从复制(Master-Slave Replication):

在这种模式下,一个Redis服务器作为主节点(Master),其他服务器作为从节点(Slave)。主节点负责处理写操作,而从节点则通过异步复制机制来复制主节点的数据。这种方式主要用于提高读取性能和数据冗余。

2)哨兵模式(Sentinel):

哨兵模式是在主从复制的基础上增加了一个或多个哨兵进程来监控主节点和从节点的状态。如果主节点出现故障,哨兵会自动选择一个健康的从节点来晋升为主节点,实现高可用性。

3)集群模式(Cluster):

Redis 集群模式是为了解决单个Redis实例的容量和性能限制而设计的。在集群模式中,数据被分割成多个片段(shards),并分布在多个节点上。每个节点既可以是主节点也可以是从节点,集群内部通过Gossip协议来维护集群状态的一致性。节点之间的相互发现和通信通常依赖于IP地址端口号

本文将以redis集群模式(Cluster)介绍如何在Kubernetes集群外部连接

2、redis暴露外网

1、使用ingress暴露,redis官网提供的Kubernetes network方法:https://redis.io/docs/latest/operate/kubernetes/networking/ingress

2、使用redis-cluster-prxoy代理的方式,github:https://github.com/RedisLabs/redis-cluster-proxy

3、使用cluster-announce-ipcluster-announce-bus-port 参数暴露ip到外部

在Redis集群中,announce 端口号和 announce-bus 端口号是两个重要的配置选项,它们分别用于不同的目的。理解这两个端口号的区别对于正确配置和管理Redis集群非常重要。

  1. announce 端口号
    announce 端口号用于告诉集群中的其他节点,当前节点的客户端连接端口。这个端口是客户端用来与Redis节点通信的端口。
    配置示例:
    cluster-announce-ip <your_ip>
    cluster-announce-port <your_port>
    cluster-announce-ip:指定当前节点的IP地址。
    cluster-announce-port:指定当前节点的客户端连接端口。
    作用:
    客户端连接:当其他节点需要将客户端引导到当前节点时,会使用这个端口。
    集群通信:集群中的其他节点会使用这个端口来识别当前节点的客户端连接地址。
  2. announce-bus 端口号
    announce-bus 端口号用于告诉集群中的其他节点,当前节点的集群总线(Cluster Bus)端口。集群总线是节点之间进行内部通信的通道,用于传递集群管理信息、心跳检测等。
    配置示例:
    cluster-announce-bus-port <your_bus_port>
    cluster-announce-bus-port:指定当前节点的集群总线端口。
    作用:
    集群内部通信:节点之间通过这个端口进行集群管理信息的交换,例如心跳检测、故障检测、状态同步等。
    Gossip协议:集群总线端口是Gossip协议的主要通信端口,用于节点之间的相互发现和状态同步。

当客户端在登录vpn连接redis集群时,开放cluster-announce-port即可,cluster-announce-bus-port不用开放

本文将以第3种方式介绍如何在Kubernetes集群外部连接

五、部署方案

六、开始安装

1、配置文件

以sts-redis01为例

1)redis-configmap

其中cm-redis-conf-01的配置文件如下,其他redis节点只需要修改cluster-announce-port 30111cluster-announce-bus-port 30211,cm-redis-conf-02的配置改成cluster-announce-port 30112cluster-announce-bus-port 30212,以此类推

bash 复制代码
data:
  redis.conf: |
    maxmemory-policy        volatile-lru
    zset-max-listpack-value 64
    #no_loose_disabled-commands     ''
    maxmemory-eviction-tenacity     10
    appendonly      yes
    active-expire-effort    1
    hz      10
    lazyfree-lazy-user-flush        no
    lazyfree-lazy-server-del        no
    hash-max-listpack-entries       512
    zset-max-listpack-entries       128
    timeout 0
    tracking-table-max-keys 1000000
    lazyfree-lazy-expire    no
    stream-node-max-bytes   4096
    set-max-intset-entries  512
    lazyfree-lazy-user-del  no
    #no_loose_sentinel-enabled      no
    slowlog-log-slower-than 20000
    latency-tracking        yes
    lazyfree-lazy-eviction  no
    dynamic-hz      yes
    hash-max-listpack-value 64
    notify-keyspace-events  ''
    stream-node-max-entries 100
    list-max-listpack-size  -2
    client-output-buffer-limit pubsub       33554432 8388608 60
    list-compress-depth     0
    slowlog-max-len 1024
    masterauth woshimima
    requirepass woshimima
    cluster-enabled yes
    cluster-announce-ip 192.168.1.10
    cluster-announce-port 30111
    cluster-announce-bus-port 30211
kind: ConfigMap
metadata:
  name: cm-redis-conf-01
  namespace: middlew

2)redis-service

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  name: svc-nodeport-redis01
  namespace: middlew
spec:
  ports:
  - name: redis01
    nodePort: 30111
    port: 6379
    protocol: TCP
    targetPort: 6379
  - name: redisbus
    nodePort: 30211
    port: 16379
    protocol: TCP
    targetPort: 16379
  selector:
    app: sts-redis-01-0
  sessionAffinity: None
  type: NodePort

3)redis-satefulset

bash 复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: sts-redis-01
  name: sts-redis-01
  namespace: middlew
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: sts-redis-01
  serviceName: sts-redis-01-ops-clusterip
  template:
    metadata:
      labels:
        app: sts-redis-01
    spec:
      containers:
      - args:
        - /etc/redis/redis.conf
        command:
        - redis-server
        image: swr.cn-north-4.myhuaweicloud.com/asdl-aps/redis:7.0.15
        imagePullPolicy: IfNotPresent
        name: redis
        ports:
        - containerPort: 6379
          name: redis-6379
          protocol: TCP
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/redis
          name: redis-conf
        - mountPath: /data
          name: sts-redis-01-ops-data
        - mountPath: /etc/localtime
          name: localtime
          readOnly: true
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: default-secret
      restartPolicy: Always
      schedulerName: default-scheduler
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          items:
          - key: redis.conf
            path: redis.conf
          name: cm-redis-conf-01
        name: redis-conf
      - hostPath:
          path: /etc/localtime
          type: ""
        name: localtime
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: sts-redis-01-ops-data
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      storageClassName: xxx-nfs-csi #修改storageclass名称
      volumeMode: Filesystem

2、安装redis

正常情况下,是有6个statufulset类型的redis实例

登录到任意一个redis实例,执行:

bash 复制代码
redis-cli -a woshimima --cluster create --cluster-replicas 1 192.168.1.10:30111 192.168.1.10:30112 192.168.1.10:30113 192.168.1.10:30114 192.168.1.10:30115 192.168.1.10:30116

输入yes,完成自动组成redis集群

现在集群内外的服务都可以使用192.168.1.10:30111连接redis集群了

相关推荐
aherhuo6 分钟前
kubevirt网络
linux·云原生·容器·kubernetes
catoop1 小时前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
liuxuzxx2 小时前
1.24.1-Istio安装
kubernetes·istio·service mesh
道一云黑板报3 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes
DT辰白3 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
运维小文3 小时前
K8S中的PV、PVC介绍和使用
docker·云原生·容器·kubernetes·存储
ζั͡山 ั͡有扶苏 ั͡✾4 小时前
Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
云原生·容器·kubernetes
Hadoop_Liang4 小时前
Kubernetes ConfigMap的创建与使用
云原生·容器·kubernetes
木子七4 小时前
Redis-十大数据类型
redis
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭6 小时前
聊聊volatile的实现原理?
java·jvm·redis