K8S部署Redis(单机、集群)的超详细步骤


    目录
  • 前言
  • 一、部署单机Redis
    • 步骤一:创建ConfigMap
    • 步骤二:创建Deployment
    • 步骤三:创建Service
    • 步骤四:验证单机Redis
    • 小结
  • 二、部署6节点Redis集群
    • 步骤一:创建ConfigMap
    • 步骤二:创建Deployment
    • 步骤三:创建Service
    • 步骤四:Redis集群初始化
    • 步骤五:验证Redis集群
    • 小结
    • 附录1:StatefulSet方式部署Redis集群(暴露1个端口)
    • 附录2:StatefulSet方式部署Redis集群(暴露6个端口)
  • 三、Redis集群存在的问题以及解决方案
    • 步骤一:设置hostNetwork
    • 步骤二:配置环境变量HOST_IP
    • 步骤三:使用宿主机IP初始化Redis集群
    • 步骤四:验证Redis集群
    • 小结
    • 附录1:Deployment方式部署Redis集群(暴露6个端口)
    • 附录2:StatefulSet方式部署Redis集群(暴露6个端口)
  • 结论

    前言
    在今天的讨论中,我们将深入研究如何将Redis数据库迁移到云端,以便更好地利用云计算的优势提高数据管理的灵活性。
    Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis支持多种数据结构,如字符串、列表、集合、散列等,具有高性能、低延迟、持久化等特点。
    在Kubernetes(K8S)中部署Redis是一项常见的任务,因为Redis是一个高性能的键值存储数据库,非常适合用于缓存、消息队列等场景。本文将分别介绍如何在K8S集群中部署单机Redis和Redis集群。
    一、部署单机Redis
    步骤一:创建ConfigMap
    首先,我们需要创建一个ConfigMap,用来存储和管理Redis的相关配置。
    
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-single-config
data:
  redis.conf: |
    daemonize no
    bind 0.0.0.0
    port 6379
    tcp-backlog 511
    timeout 0
    tcp-keepalive 300
    pidfile /data/redis-server.pid
    logfile /data/redis.log
    loglevel notice
    databases 16
    always-show-logo yes
    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir /data
    slave-serve-stale-data yes
    slave-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    slave-priority 100
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    aof-rewrite-incremental-fsync yes
    requirepass redis#single#test

    步骤二:创建Deployment
    接下来,我们需要创建一个Deployment,用来定义Redis的副本数量、镜像版本等相关信息。
    
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-single
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis-single
  template:
    metadata:
      labels:
        app: redis-single
    spec:
      initContainers:
        - name: init-0
          image: busybox
          imagePullPolicy: IfNotPresent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          command: [ "sysctl", "-w", "net.core.somaxconn=511" ]
          securityContext:
            privileged: true
        - name: init-1
          image: busybox
          imagePullPolicy: IfNotPresent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          command: [ "sh", "-c", "echo never > /sys/kernel/mm/transparent_hugepage/enabled" ]
          securityContext:
            privileged: true
      containers:
        - name: redis-single
          image: redis:6.0.8
          imagePullPolicy: IfNotPresent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - name: redis-data
              mountPath: /data
            - name: redis-config
              mountPath: /usr/local/etc/redis/redis.conf
              subPath: redis.conf
          command: [ "redis-server" ,"/usr/local/etc/redis/redis.conf" ]
          env:
            - name: TZ
              value: "Asia/Shanghai"
      volumes:
        - name: timezone
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
        - name: redis-data
          hostPath:
            path: /var/lib/docker/redis/single
            type: DirectoryOrCreate
        - name: redis-config
          configMap:
            name: redis-single-config
            items:
              - key: redis.conf
                path: redis.conf

    在这个文件中,我们定义了一个名为redis-single的Deployment,它使用了之前创建的ConfigMap中的配置文件,并将其挂载到容器的/usr/local/etc/redis/redis.conf路径下。此外,我们还将容器的/data目录挂载到宿主机的/var/lib/docker/redis/single目录。配置initContainers的目的是为了解决启动时出现的两个警告。
    
    
    WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 
    
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

    步骤三:创建Service
    然后,我们还需要创建一个Service,用来将K8S集群中运行的Redis实例暴露为可访问的服务。
    
apiVersion: v1
kind: Service
metadata:
  name: service-redis-single
  labels:
    app: redis-single
spec:
  selector:
    app: redis-single
  ports:
    - name: redis-single
      port: 6379
      targetPort: 6379
      nodePort: 30000
  type: NodePort

    步骤四:验证单机Redis
  • 首先,使用Redis可视化工具连接到刚部署的单机Redis上,验证Redis是否正常。

    
    
  • 接下来,将副本数量调整为0,模拟Redis宕机情况。此时与Redis已断开连接。

    
    
    
  • 然后,将副本数量恢复,模拟Redis宕机后重启。此时与Redis重新建立连接,功能使用正常。

    
    小结