在今天的讨论中,我们将深入研究如何将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重新建立连接,功能使用正常。

小结

以上就是在K8S中部署单机Redis的相关步骤。通过这些步骤,我们成功地使用无状态的Deployment部署了一个可用的单机Redis。当然,我们也可以使用StatefulSet来部署单机Redis,两者之间的区别不大,这里就不再赘述。

二、部署6节点Redis集群

步骤一:创建ConfigMap

与单机版类似,我们需要创建一个ConfigMap来存储和管理Redis的相关配置。在这里,我们将创建6个配置文件,分别对应Redis集群中的6个节点,主要区别在于端口号的不同。

apiVersion: v1

kind: ConfigMap

metadata:

name: redis-cluster-config

data:

redis-cluster-0.conf: |

port 7111

cluster-announce-bus-port 17111

pidfile /data/redis-7111.pid

logfile /data/redis-7111.log

dbfilename dump-7111.rdb

appendfilename "appendonly-7111.aof"

cluster-config-file nodes-7111.conf

protected-mode no

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

loglevel notice

databases 1

always-show-logo yes

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-1.conf: |

port 7112

cluster-announce-bus-port 17112

pidfile /data/redis-7112.pid

logfile /data/redis-7112.log

dbfilename dump-7112.rdb

appendfilename "appendonly-7112.aof"

cluster-config-file nodes-7112.conf

...

redis-cluster-2.conf: |

port 7113

cluster-announce-bus-port 17113

pidfile /data/redis-7113.pid

logfile /data/redis-7113.log

dbfilename dump-7113.rdb

appendfilename "appendonly-7113.aof"

cluster-config-file nodes-7113.conf

...

redis-cluster-3.conf: |

port 7114

cluster-announce-bus-port 17114

pidfile /data/redis-7114.pid

logfile /data/redis-7114.log

dbfilename dump-7114.rdb

appendfilename "appendonly-7114.aof"

cluster-config-file nodes-7114.conf

...

redis-cluster-4.conf: |

port 7115

cluster-announce-bus-port 17115

pidfile /data/redis-7115.pid

logfile /data/redis-7115.log

dbfilename dump-7115.rdb

appendfilename "appendonly-7115.aof"

cluster-config-file nodes-7115.conf

...

redis-cluster-5.conf: |

port 7116

cluster-announce-bus-port 17116

pidfile /data/redis-7116.pid

logfile /data/redis-7116.log

dbfilename dump-7116.rdb

appendfilename "appendonly-7116.aof"

cluster-config-file nodes-7116.conf

...

步骤二:创建Deployment

接下来,我们需要创建6个Deployment,分别对应Redis集群中的6个节点。主要区别在于使用ConfigMap中的配置文件的不同和containers中暴露的端口不同。redis-cluster-0参考如下:

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-0

name: redis-cluster-0

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-0

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-0

spec:

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7111

protocol: TCP

- name: election

containerPort: 17111

protocol: TCP

env:

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-0.conf" ]

args:

- "--cluster-announce-ip"

- "$(POD_IP)"

步骤三:创建Service

然后,我们还需要创建一个Service,用来将K8S集群中运行的Redis实例暴露为可访问的服务。这里同样需要创建6个Service,分别对应步骤二中的6个Deployment。

apiVersion: v1

kind: Service

metadata:

labels:

app: redis-cluster-0

name: redis-cluster-0

spec:

selector:

app: redis-cluster-0

type: NodePort

sessionAffinity: None

ports:

- name: redis-7111

port: 7111

targetPort: 7111

nodePort: 30201

- name: redis-17111

port: 17111

targetPort: 17111

nodePort: 30211

---

apiVersion: v1

kind: Service

metadata:

labels:

app: redis-cluster-1

name: redis-cluster-1

spec:

selector:

app: redis-cluster-1

type: NodePort

sessionAffinity: None

ports:

- name: redis-7112

port: 7112

targetPort: 7112

nodePort: 30202

- name: redis-17112

port: 17112

targetPort: 17112

nodePort: 30212

---

apiVersion: v1

kind: Service

metadata:

labels:

app: redis-cluster-2

name: redis-cluster-2

spec:

selector:

app: redis-cluster-2

type: NodePort

sessionAffinity: None

ports:

- name: redis-7113

port: 7113

targetPort: 7113

nodePort: 30203

- name: redis-17113

port: 17113

targetPort: 17113

nodePort: 30213

---

apiVersion: v1

kind: Service

metadata:

labels:

app: redis-cluster-3

name: redis-cluster-3

spec:

selector:

app: redis-cluster-3

type: NodePort

sessionAffinity: None

ports:

- name: redis-7114

port: 7114

targetPort: 7114

nodePort: 30204

- name: redis-17114

port: 17114

targetPort: 17114

nodePort: 30214

---

apiVersion: v1

kind: Service

metadata:

labels:

app: redis-cluster-4

name: redis-cluster-4

spec:

selector:

app: redis-cluster-4

type: NodePort

sessionAffinity: None

ports:

- name: redis-7115

port: 7115

targetPort: 7115

nodePort: 30205

- name: redis-17115

port: 17115

targetPort: 17115

nodePort: 30215

---

apiVersion: v1

kind: Service

metadata:

labels:

app: redis-cluster-5

name: redis-cluster-5

spec:

selector:

app: redis-cluster-5

type: NodePort

sessionAffinity: None

ports:

- name: redis-7116

port: 7116

targetPort: 7116

nodePort: 30206

- name: redis-17116

port: 17116

targetPort: 17116

nodePort: 30216

步骤四:Redis集群初始化

执行以下命令,查看pod的名称和ip:

kubectl get pods -o wide

执行以下命令创建Redis集群:

kubectl exec -it redis-cluster-0-65cb5487d-kn86p -- redis-cli -a redis#cluster#test --cluster create --cluster-replicas 1 109.233.87.199:7111 109.233.87.203:7112 109.233.87.198:7113 109.233.87.197:7114 109.233.87.205:7115 109.233.87.207:7116

返回类似以下信息表示初始化成功。

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

步骤五:验证Redis集群

最后,我们可以使用redis-cli工具来验证redis集群是否正常工作。首先,进入任意一个pod内,这里以redis-cluster-0为例:

kubectl exec -it redis-cluster-0-65cb5487d-kn86p -- /bin/bash

然后,使用以下命令连接到redis集群:

redis-cli -a redis#cluster#test -c -h -p 30201

在redis-cli中,可以执行各种redis命令来测试集群的功能。

小结

在K8S中部署Redis集群的相关步骤已经介绍完毕。通过这些步骤,我们成功地使用无状态的Deployment部署了一个可用的Redis集群。当然,我们还可以使用StatefulSet来部署Redis集群,两者之间的区别不大,相关配置文件参考详见附录。

附录1:StatefulSet方式部署Redis集群(暴露1个端口)

apiVersion: v1

kind: ConfigMap

metadata:

name: redis-cluster-config

data:

redis-cluster.conf: |

daemonize no

supervised no

protected-mode no

bind 0.0.0.0

port 6379

cluster-announce-bus-port 16379

cluster-enabled yes

appendonly yes

cluster-node-timeout 5000

dir /data

cluster-config-file /data/nodes.conf

requirepass redis#cluster#test

masterauth redis#cluster#test

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-service

spec:

selector:

app: redis-cluster

clusterIP: None

ports:

- name: redis-6379

port: 6379

- name: redis-16379

port: 16379

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-service-access

spec:

selector:

app: redis-cluster

type: NodePort

sessionAffinity: None

ports:

- name: redis-6379

port: 6379

targetPort: 6379

nodePort: 30201

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

labels:

app: redis-cluster

name: redis-cluster

spec:

serviceName: redis-cluster-service

replicas: 6

selector:

matchLabels:

app: redis-cluster

template:

metadata:

labels:

app: redis-cluster

spec:

terminationGracePeriodSeconds: 30

containers:

- name: redis

image: redis:6.0.8

imagePullPolicy: IfNotPresent

terminationMessagePath: /dev/termination-log

terminationMessagePolicy: File

command: [ "redis-server", "/etc/redis/redis-cluster.conf" ]

args:

- "--cluster-announce-ip"

- "$(POD_IP)"

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

ports:

- name: redis

containerPort: 6379

protocol: TCP

- name: cluster

containerPort: 16379

protocol: TCP

volumeMounts:

- name: redis-conf

mountPath: /etc/redis

- name: pvc-data

mountPath: /data

volumes:

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

- name: redis-conf

configMap:

name: redis-cluster-config

items:

- key: redis-cluster.conf

path: redis-cluster.conf

volumeClaimTemplates:

- metadata:

name: pvc-data

spec:

accessModes: [ "ReadWriteOnce" ]

resources:

requests:

storage: 1Gi

附录2:StatefulSet方式部署Redis集群(暴露6个端口)

apiVersion: v1

kind: ConfigMap

metadata:

name: redis-cluster-config

data:

redis-cluster-0.conf: |

protected-mode no

port 7111

cluster-announce-bus-port 17111

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7111.pid

loglevel notice

logfile /data/redis-7111.log

databases 1

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-7111.rdb

dir /data

masterauth qxb#redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass qxb#redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7111.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7111.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-1.conf: |

protected-mode no

port 7112

cluster-announce-bus-port 17112

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7112.pid

loglevel notice

logfile /data/redis-7112.log

databases 1

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-7112.rdb

dir /data

masterauth qxb#redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass qxb#redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7112.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7112.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-2.conf: |

protected-mode no

port 7113

cluster-announce-bus-port 17113

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7113.pid

loglevel notice

logfile /data/redis-7113.log

databases 1

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-7113.rdb

dir /data

masterauth qxb#redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass qxb#redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7113.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7113.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-3.conf: |

protected-mode no

port 7114

cluster-announce-bus-port 17114

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7114.pid

loglevel notice

logfile /data/redis-7114.log

databases 1

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-7114.rdb

dir /data

masterauth qxb#redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass qxb#redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7114.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7114.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-4.conf: |

protected-mode no

port 7115

cluster-announce-bus-port 17115

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7115.pid

loglevel notice

logfile /data/redis-7115.log

databases 1

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-7115.rdb

dir /data

masterauth qxb#redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass qxb#redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7115.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7115.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-5.conf: |

protected-mode no

port 7116

cluster-announce-bus-port 17116

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7116.pid

loglevel notice

logfile /data/redis-7116.log

databases 1

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-7116.rdb

dir /data

masterauth qxb#redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass qxb#redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7116.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7116.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-0

spec:

selector:

statefulset.kubernetes.io/pod-name: redis-cluster-0

type: NodePort

sessionAffinity: None

ports:

- name: redis-30201

port: 7111

targetPort: 7111

nodePort: 30201

- name: redis-30211

port: 17111

targetPort: 17111

nodePort: 30211

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-1

spec:

selector:

statefulset.kubernetes.io/pod-name: redis-cluster-1

type: NodePort

sessionAffinity: None

ports:

- name: redis-30202

port: 7112

targetPort: 7112

nodePort: 30202

- name: redis-30212

port: 17112

targetPort: 17112

nodePort: 30212

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-2

spec:

selector:

statefulset.kubernetes.io/pod-name: redis-cluster-2

type: NodePort

sessionAffinity: None

ports:

- name: redis-30203

port: 7113

targetPort: 7113

nodePort: 30203

- name: redis-30213

port: 17113

targetPort: 17113

nodePort: 30213

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-3

spec:

selector:

statefulset.kubernetes.io/pod-name: redis-cluster-3

type: NodePort

sessionAffinity: None

ports:

- name: redis-30204

port: 7114

targetPort: 7114

nodePort: 30204

- name: redis-30214

port: 17114

targetPort: 17114

nodePort: 30214

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-4

spec:

selector:

statefulset.kubernetes.io/pod-name: redis-cluster-4

type: NodePort

sessionAffinity: None

ports:

- name: redis-30205

port: 7115

targetPort: 7115

nodePort: 30205

- name: redis-30215

port: 17115

targetPort: 17115

nodePort: 30215

---

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-5

spec:

selector:

statefulset.kubernetes.io/pod-name: redis-cluster-5

type: NodePort

sessionAffinity: None

ports:

- name: redis-30206

port: 7116

targetPort: 7116

nodePort: 30206

- name: redis-30216

port: 17116

targetPort: 17116

nodePort: 30216

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: redis-cluster

spec:

serviceName: redis-cluster

replicas: 6

selector:

matchLabels:

app: redis-cluster

template:

metadata:

annotations:

statefulset.kubernetes.io/pod-name: $(POD_NAME)

labels:

app: redis-cluster

spec:

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/$(POD_NAME).conf" ]

args:

- --cluster-announce-ip

- $(POD_IP)

三、Redis集群存在的问题以及解决方案

尽管我们按照步骤二已经成功部署了Redis集群,但这种方式仅适用于在K8S集群内部使用Redis。如果我们使用可视化工具连接刚部署的Redis集群,一旦发生节点切换,集群将无法正常工作。

想要解决这个问题,我们可以按照如下步骤进行修改我们的部署文件。

步骤一:设置hostNetwork

首先,在Deployment或者StatefulSet中设置hostNetwork为true,使pod与宿主机共享网络命名空间。

spec:

template:

spec:

hostNetwork: true

设置hostNetwork字段为true可能会带来以下风险:

安全风险:Pod将共享宿主机的网络命名空间,这意味着Pod中的容器可以直接访问宿主机上的其他进程和服务。这可能导致潜在的安全漏洞和攻击。 性能风险:使用宿主机的IP地址可能会导致网络延迟和性能下降,因为Pod需要在宿主机上进行网络通信。 配置复杂性:使用宿主机的IP地址可能会增加K8S集群的配置复杂性,因为需要确保Pod可以正确地访问宿主机上的网络资源。

为了规避这些风险,可以采取以下措施:

仅在必要时使用hostNetwork:只有在需要完全控制容器网络时才应使用hostNetwork。在大多数情况下,建议使用默认的Pod网络模式。限制Pod中的访问权限:通过设置适当的SELinux上下文、AppArmor策略等,可以限制Pod中容器的访问权限,从而降低安全风险。使用CNI插件:CNI(Container Network Interface)插件可以帮助你更好地管理容器网络,提供更多的网络隔离和安全性。常见的CNI插件有Calico、Flannel、Weave等。监控和日志记录:定期检查Kubernetes集群中的网络流量和日志,以便及时发现和解决潜在的安全问题。

步骤二:配置环境变量HOST_IP

接下来,我们需要在containers的env中配置环境变量HOST_IP,以便让pod获取到宿主机的IP地址。

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

同时,还需要修改containers中args的参数为HOST_IP。

args:

- --cluster-announce-ip

- $(HOST_IP)

步骤三:使用宿主机IP初始化Redis集群

使用宿主机ip和集群中任意一个pod的名称执行以下命令:

kubectl exec -it redis-cluster-0-6bb87c5c79-cnrtg -- redis-cli -a redis#cluster#test --cluster create --cluster-replicas 1 10.x.xxx.xx:7111 10.x.xxx.xx:7112 10.x.xxx.xx:7113 10.x.xxx.xx:7114 10.x.xxx.xx:7115 10.x.xxx.xx:7116

步骤四:验证Redis集群

使用可视化工具连接重新部署的Redis集群,验证Redis集群是否正常。

小结

以上就是在K8S中部署Redis集群的相关步骤。通过这些步骤,我们成功地部署了一个可以在K8S集群外可访问的Redis集群,解决了非K8S项目如何使用K8S中Redis集群的问题。由于我们使用了hostNetwork,使pod与宿主机共享网络命名空间,这会带来一定的安全风险,需要结合实际情况进行充分考虑。

附录1:Deployment方式部署Redis集群(暴露6个端口)

apiVersion: v1

kind: ConfigMap

metadata:

name: redis-cluster-config

data:

redis-cluster-0.conf: |

protected-mode no

port 7111

cluster-announce-bus-port 17111

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7111.pid

loglevel notice

logfile /data/redis-7111.log

databases 1

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-7111.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7111.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7111.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-1.conf: |

protected-mode no

port 7112

cluster-announce-bus-port 17112

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7112.pid

loglevel notice

logfile /data/redis-7112.log

databases 1

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-7112.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7112.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7112.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-2.conf: |

protected-mode no

port 7113

cluster-announce-bus-port 17113

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7113.pid

loglevel notice

logfile /data/redis-7113.log

databases 1

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-7113.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7113.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7113.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-3.conf: |

protected-mode no

port 7114

cluster-announce-bus-port 17114

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7114.pid

loglevel notice

logfile /data/redis-7114.log

databases 1

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-7114.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7114.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7114.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-4.conf: |

protected-mode no

port 7115

cluster-announce-bus-port 17115

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7115.pid

loglevel notice

logfile /data/redis-7115.log

databases 1

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-7115.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7115.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7115.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-5.conf: |

protected-mode no

port 7116

cluster-announce-bus-port 17116

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7116.pid

loglevel notice

logfile /data/redis-7116.log

databases 1

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-7116.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7116.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7116.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-0

name: redis-cluster-0

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-0

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-0

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7111

protocol: TCP

- name: election

containerPort: 17111

protocol: TCP

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-0.conf" ]

args:

- "--cluster-announce-ip"

- "$(HOST_IP)"

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-1

name: redis-cluster-1

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-1

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-1

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7112

protocol: TCP

- name: election

containerPort: 17112

protocol: TCP

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-1.conf" ]

args:

- "--cluster-announce-ip"

- "$(HOST_IP)"

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-2

name: redis-cluster-2

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-2

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-2

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7113

protocol: TCP

- name: election

containerPort: 17113

protocol: TCP

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-2.conf" ]

args:

- "--cluster-announce-ip"

- "$(HOST_IP)"

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-3

name: redis-cluster-3

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-3

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-3

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7114

protocol: TCP

- name: election

containerPort: 17114

protocol: TCP

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-3.conf" ]

args:

- "--cluster-announce-ip"

- "$(HOST_IP)"

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-4

name: redis-cluster-4

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-4

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-4

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7115

protocol: TCP

- name: election

containerPort: 17115

protocol: TCP

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-4.conf" ]

args:

- "--cluster-announce-ip"

- "$(HOST_IP)"

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: redis-cluster-5

name: redis-cluster-5

spec:

progressDeadlineSeconds: 600

replicas: 1

selector:

matchLabels:

app: redis-cluster-5

strategy:

rollingUpdate:

maxSurge: 50%

maxUnavailable: 50%

type: RollingUpdate

template:

metadata:

labels:

app: redis-cluster-5

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

ports:

- name: redis

containerPort: 7116

protocol: TCP

- name: election

containerPort: 17116

protocol: TCP

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/redis-cluster-5.conf" ]

args:

- "--cluster-announce-ip"

- "$(HOST_IP)"

附录2:StatefulSet方式部署Redis集群(暴露6个端口)

apiVersion: v1

kind: ConfigMap

metadata:

name: redis-cluster-config

data:

redis-cluster-0.conf: |

protected-mode no

port 7111

cluster-announce-bus-port 17111

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7111.pid

loglevel notice

logfile /data/redis-7111.log

databases 1

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-7111.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7111.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7111.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-1.conf: |

protected-mode no

port 7112

cluster-announce-bus-port 17112

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7112.pid

loglevel notice

logfile /data/redis-7112.log

databases 1

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-7112.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7112.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7112.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-2.conf: |

protected-mode no

port 7113

cluster-announce-bus-port 17113

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7113.pid

loglevel notice

logfile /data/redis-7113.log

databases 1

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-7113.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7113.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7113.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-3.conf: |

protected-mode no

port 7114

cluster-announce-bus-port 17114

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7114.pid

loglevel notice

logfile /data/redis-7114.log

databases 1

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-7114.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7114.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7114.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-4.conf: |

protected-mode no

port 7115

cluster-announce-bus-port 17115

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7115.pid

loglevel notice

logfile /data/redis-7115.log

databases 1

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-7115.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7115.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7115.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

redis-cluster-5.conf: |

protected-mode no

port 7116

cluster-announce-bus-port 17116

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /data/redis-7116.pid

loglevel notice

logfile /data/redis-7116.log

databases 1

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-7116.rdb

dir /data

masterauth redis#cluster#test

slave-serve-stale-data yes

slave-read-only yes

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

replica-priority 100

requirepass redis#cluster#test

lazyfree-lazy-eviction no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

replica-lazy-flush no

appendonly yes

appendfilename "appendonly-7116.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes-7116.conf

cluster-node-timeout 15000

cluster-migration-barrier 1

cluster-require-full-coverage yes

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

stream-node-max-bytes 4096

stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit replica 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: redis-cluster

spec:

serviceName: redis-cluster

replicas: 6

selector:

matchLabels:

app: redis-cluster

template:

metadata:

annotations:

statefulset.kubernetes.io/pod-name: $(POD_NAME)

labels:

app: redis-cluster

spec:

hostNetwork: true

volumes:

- name: redis-data

hostPath:

path: /var/lib/docker/redis/cluster

type: DirectoryOrCreate

- name: redis-config

configMap:

name: redis-cluster-config

- name: timezone

hostPath:

path: /usr/share/zoneinfo/Asia/Shanghai

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

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/

env:

- name: HOST_IP

valueFrom:

fieldRef:

fieldPath: status.hostIP

- name: POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

- name: POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

- name: TZ

value: "Asia/Shanghai"

command: [ "redis-server" ,"/usr/local/etc/redis/$(POD_NAME).conf" ]

args:

- --cluster-announce-ip

- $(HOST_IP)

结论

这篇文章详细介绍了在K8S环境中部署Redis单机和Redis集群的具体步骤。通过阅读全文,我们可以发现,我们并没有使用PVC来存储Redis的相关数据,而是直接将其挂载到了宿主机上。这样做的目的是为了方便Redis的迁移。相较于传统的手动部署方式,使用K8S可以更便捷、快速地完成Redis集群的部署和管理。

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: