K8S部署Redis Cluster集群
kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html
Redis 介绍
• Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序集合。
• 由于Redis接受多种格式的密钥,因此可以在服务器上执行操作,从而减少了客户端的工作量。
• 它仅将磁盘用于持久性,而将数据完全保存在内存中。
• Redis是一种流行的数据存储解决方案,并被GitHub,Pinterest,Snapchat,Twitter,StackOverflow,Flickr等技术巨头所使用。
为什么要用Redis
• 它的速度非常快。它是用ANSI C编写的,并且可以在POSIX系统上运行,例如Linux,Mac OS X和Solaris。
• Redis通常被排名为最流行的键/值数据库和最流行的与容器一起使用的NoSQL数据库。
• 其缓存解决方案减少了对云数据库后端的调用次数。
• 应用程序可以通过其客户端API库对其进行访问。
• 所有流行的编程语言都支持Redis。
• 它是开源且稳定的。
什么是Redis Cluster集群
• Redis Cluster是一组Redis实例,旨在通过对数据库进行分区来扩展数据库,从而使其更具弹性。
• 群集中的每个成员(无论是主副本还是辅助副本)都管理哈希槽的子集。如果主机无法访问,则其从机将升级为主机。在由三个主节点组成的最小Redis群集中,每个主节点都有一个从节点(以实现最小的故障转移),每个主节点都分配有一个介于0到16,383之间的哈希槽范围。节点A包含从0到5000的哈希槽,节点B从5001到10000,节点C从10001到16383。
• 群集内部的通信是通过内部总线进行的,使用协议传播有关群集的信息或发现新节点。
在Kubernetes中部署Redis Cluster集群过程记录
在Kubernetes中部署Redis集群面临挑战,因为每个Redis实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色。为此,我们需要结合使用StatefulSets控制器和PersistentVolumes持久化存储。
StatefulSet的设计原理模型:
• 拓扑状态:
应用的多个实例之间不是完全对等的关系,这个应用实例的启动必须按照某些顺序启动,比如应用的主节点 A 要先于从节点 B 启动。而如果你把 A 和 B 两个Pod删除掉,他们再次被创建出来是也必须严格按照这个顺序才行,并且,新创建出来的Pod,必须和原来的Pod的网络标识一样,这样原先的访问者才能使用同样的方法,访问到这个新的Pod
• 存储状态:
应用的多个实例分别绑定了不同的存储数据.对于这些应用实例来说,Pod A第一次读取到的数据,和隔了十分钟之后再次读取到的数据,应该是同一份,哪怕在此期间Pod A被重新创建过.一个数据库应用的多个存储实例。
存储卷
了解statefulset状态后,应该知道要为数据准备一个存储卷了,创建方式有静态方式和动态方式,静态方式就是手动创建PV、PVC,然后POD进行进行调用即可。这里使用动态NFS作为挂载卷,需要部署NFS动态StorageClass
1、使用NFS配置StatefulSet的动态持久化存储
1)在NFS服务器端(172.16.60.238)通过nfs创建Redis Cluster集群的共享目录
[root@k8s-harbor01 ~]# mkdir -p /data/storage/k8s/redis

2)创建nfs的rbac
[root@k8s-master01 ~]# mkdir -p /opt/k8s/k8s_project/redis
[root@k8s-master01 ~]# cd /opt/k8s/k8s_project/redis
[root@k8s-master01 redis]# vim nfs-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: public-service

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner
namespace: public-service
rules:

  • apiGroups: [""]
    resources: [“persistentvolumes”]
    verbs: [“get”, “list”, “watch”, “create”, “delete”]
  • apiGroups: [""]
    resources: [“persistentvolumeclaims”]
    verbs: [“get”, “list”, “watch”, “update”]
  • apiGroups: [“storage.k8s.io”]
    resources: [“storageclasses”]
    verbs: [“get”, “list”, “watch”]
  • apiGroups: [""]
    resources: [“events”]
    verbs: [“watch”, “create”, “update”, “patch”]
  • apiGroups: [""]
    resources: [“services”, “endpoints”]
    verbs: [“get”,“create”,“list”, “watch”,“update”]
  • apiGroups: [“extensions”]
    resources: [“podsecuritypolicies”]
    resourceNames: [“nfs-provisioner”]
    verbs: [“use”]

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:

  • kind: ServiceAccount
    name: nfs-provisioner
    namespace: public-service
    roleRef:
    kind: ClusterRole
    name: nfs-provisioner-runner
    apiGroup: rbac.authorization.k8s.io
    创建并查看
    [root@k8s-master01 redis]# kubectl apply -f nfs-rbac.yaml
    serviceaccount/nfs-provisioner created
    clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
    clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created

[root@k8s-master01 redis]# kubectl get sa -n public-service |grep nfs
nfs-provisioner 1 24s
[root@k8s-master01 redis]# kubectl get clusterrole -n public-service |grep nfs
nfs-provisioner-runner 2021-02-04T02:21:11Z
[root@k8s-master01 redis]# kubectl get clusterrolebinding -n public-service |grep nfs
run-nfs-provisioner ClusterRole/nfs-provisioner-runner 34s

3)创建redis cluster集群的storageclass
[root@k8s-master01 redis]# ll
total 4
-rw-r–r-- 1 root root 1216 Feb 4 10:20 nfs-rbac.yaml

[root@k8s-master01 redis]# vim redis-nfs-class.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: redis-nfs-storage
namespace: public-service
provisioner: redis/nfs
reclaimPolicy: Retain
创建并查看
[root@k8s-master01 redis]# kubectl apply -f redis-nfs-class.yaml
storageclass.storage.k8s.io/redis-nfs-storage created

[root@k8s-master01 redis]# kubectl get sc -n public-service
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
redis-nfs-storage redis/nfs Retain Immediate false

4)创建redis cluster集群的nfs-client-provisioner
[root@k8s-master01 redis]# ll
total 8
-rw-r–r-- 1 root root 1216 Feb 4 10:20 nfs-rbac.yaml
-rw-r–r-- 1 root root 155 Feb 4 10:24 redis-nfs-class.yaml

[root@k8s-master01 redis]# vim redis-nfs.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-nfs-client-provisioner
namespace: public-service
spec:
replicas: 1
selector:
matchLabels:
app: redis-nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: redis-nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: redis-nfs-client-provisioner
image: dockerhub.kubekey.local/nfs-client-provisioner
imagePullPolicy: Never
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: redis/nfs
- name: NFS_SERVER
value: 172.18.100.34
- name: NFS_PATH
value: /data/storage/k8s/redis
volumes:
- name: nfs-client-root
nfs:
server: 172.18.100.34
path: /data/storage/k8s/redis 
创建并查看
[root@k8s-master01 redis]# kubectl apply -f redis-nfs.yml
deployment.apps/redis-nfs-client-provisioner created

[root@k8s-master01 redis]# kubectl get pods -n public-service |grep nfs
redis-nfs-client-provisioner-58b46549dd-h87gg 1/1 Running 0 40s

2、部署Redis Cluster集群
本案例部署采用的namespace命名空间是public-service
1)准备image镜像
redis-trib.rb工具可以去redis源码中拷贝一个到当前目录,然后构建镜像。
[root@k8s-master01 redis]# pwd
/opt/k8s/k8s_project/redis
[root@k8s-master01 redis]# ll
total 12
-rw-r–r-- 1 root root 1216 Feb 4 15:31 nfs-rbac.yaml
-rw-r–r-- 1 root root 155 Feb 4 15:32 redis-nfs-class.yaml
-rw-r–r-- 1 root root 1006 Feb 4 15:32 redis-nfs.yml

[root@k8s-master01 redis]# mkdir image
[root@k8s-master01 redis]# cd image
[root@k8s-master01 image]# ll
total 64
-rw-r–r-- 1 root root 191 Feb 4 18:14 Dockerfile
-rwxr-xr-x 1 root root 60578 Feb 4 15:49 redis-trib.rb

[root@k8s-master01 image]# cat Dockerfile
FROM redis:5.0.6
RUN apt-get update -y
RUN apt-get install -y ruby
rubygems
RUN apt-get clean all
RUN gem install redis
RUN apt-get install dnsutils vim -y
COPY redis-trib.rb /usr/local/bin/
创建镜像并上传到私有仓库仓库
[root@k8s-master01 image]# docker build -t dockerhub.kubekey.local/redis:5.0.6-y .
[root@k8s-master01 image]# docker push dockerhub.kubekey.local/redis:5.0.6-y

2)创建configmap
redis配置文件使用configmap方式进行挂载,如果将配置封装到docker image中的话,俺么每次修改配置就需要重新docker build。个人觉得比较麻烦,所以使用configmap方式挂载配置。
[root@k8s-master01 redis]# pwd
/opt/k8s/k8s_project/redis
[root@k8s-master01 redis]# ll
total 12
drwxr-xr-x 2 root root 45 Feb 4 18:14 image
-rw-r–r-- 1 root root 1216 Feb 4 15:31 nfs-rbac.yaml
-rw-r–r-- 1 root root 155 Feb 4 15:32 redis-nfs-class.yaml
-rw-r–r-- 1 root root 1006 Feb 4 15:32 redis-nfs.yml

[root@k8s-master01 redis]# mkdir conf
[root@k8s-master01 redis]# cd conf/

[root@k8s-master01 conf]# vim redis-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-cluster
namespace: public-service
data:
fix-ip.sh: |
#!/bin/sh
CLUSTER_CONFIG="/data/nodes.conf"
if [ -f CLUSTERCONFIG];thenif[−z"{CLUSTER_CONFIG} ]; then if [ -z "CLUSTERC​ONFIG];thenif[−z"{POD_IP}" ]; then
echo “Unable to determine Pod IP address!”
exit 1
fi
echo “Updating my IP to ${POD_IP} in KaTeX parse error: Can't use function '\.' in math mode at position 63: … s/[0-9]\{1,3\}\̲.̲[0-9]\{1,3\}\.[…{POD_IP}’/’ CLUSTERCONFIGfiexec"{CLUSTER_CONFIG} fi exec "CLUSTERC​ONFIGfiexec"@”
redis.conf: |
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-node-timeout 10000
protected-mode no
daemonize no
pidfile /var/run/redis.pid
port 6379
tcp-backlog 511
bind 0.0.0.0
timeout 3600
tcp-keepalive 1
loglevel verbose
logfile /data/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
requirepass 123456
masterauth 123456
appendonly yes
appendfilename “appendonly.aof”
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 20000
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-entries 512
list-max-ziplist-value 64
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
需要注意:fix-ip.sh 脚本的作用用于当redis集群某pod重建后Pod IP发生变化,在/data/nodes.conf中将新的Pod IP替换原Pod IP。不然集群会出问题。

创建和查看
[root@k8s-master01 conf]# kubectl apply -f redis-configmap.yaml

[root@k8s-master01 conf]# kubectl get cm -n public-service |grep redis
redis-cluster 2 8m55s

3)准备StatefulSet
volumeClaimTemplates 用于StatefulSet控制器场景:
[root@k8s-master01 redis]# pwd
/opt/k8s/k8s_project/redis
[root@k8s-master01 redis]# ll
total 12
drwxr-xr-x 2 root root 34 Feb 4 18:52 conf
drwxr-xr-x 2 root root 45 Feb 4 18:14 image
-rw-r–r-- 1 root root 1216 Feb 4 15:31 nfs-rbac.yaml
-rw-r–r-- 1 root root 155 Feb 4 15:32 redis-nfs-class.yaml
-rw-r–r-- 1 root root 1006 Feb 4 15:32 redis-nfs.yml

[root@k8s-master01 redis]# mkdir deploy
[root@k8s-master01 redis]# cd deploy/
[root@k8s-master01 deploy]# cat redis-cluster.yml

apiVersion: v1
kind: Service
metadata:
namespace: public-service
name: redis-cluster
spec:
clusterIP: None
ports:

  • port: 6379
    targetPort: 6379
    name: client
  • port: 16379
    targetPort: 16379
    name: gossip
    selector:
    app: redis-cluster

apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: public-service
name: redis-cluster
spec:
serviceName: redis-cluster
podManagementPolicy: OrderedReady
replicas: 6
selector:
matchLabels:
app: redis-cluster
template:
metadata:
labels:
app: redis-cluster
spec:
containers:
- name: redis
image: dockerhub.kubekey.local/redis:5.0.6-y
ports:
- containerPort: 6379
name: client
- containerPort: 16379
name: gossip
command: ["/etc/redis/fix-ip.sh", “redis-server”, “/etc/redis/redis.conf”]
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: conf
mountPath: /etc/redis/
readOnly: false
- name: data
mountPath: /data
readOnly: false
volumes:
- name: conf
configMap:
name: redis-cluster
defaultMode: 0755
volumeClaimTemplates:

  • metadata:
    name: data
    annotations:
    volume.beta.kubernetes.io/storage-class: “redis-nfs-storage”
    spec:
    accessModes:
    - ReadWriteMany
    resources:
    requests:
    storage: 1Gi
    创建并查看
    [root@k8s-master01 deploy]# kubectl apply -f redis-cluster.yml

[root@k8s-master01 deploy]# kubectl get pods -n public-service |grep redis-cluster
redis-cluster-0 1/1 Running 0 10m
redis-cluster-1 1/1 Running 0 10m
redis-cluster-2 1/1 Running 0 10m
redis-cluster-3 1/1 Running 0 10m
redis-cluster-4 1/1 Running 0 9m35s
redis-cluster-5 1/1 Running 0 9m25s

[root@k8s-master01 deploy]# kubectl get svc -n public-service |grep redis-cluster
redis-cluster ClusterIP None 6379/TCP,16379/TCP 10m
查看PV、PVC
[root@k8s-master01 deploy]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-20bcb3be-90e1-4354-bd11-4f442a3bd562 10Gi RWX Delete Bound wiseco/data-redis-cluster-0 redis-nfs-storage 19m
pvc-3b53a31b-9a53-4bd4-93ff-2cf9fed551de 10Gi RWX Delete Bound wiseco/data-redis-cluster-2 redis-nfs-storage 12m
pvc-43c0cba2-54a9-4416-afb6-8b7730a199dc 10Gi RWX Delete Bound wiseco/data-redis-cluster-1 redis-nfs-storage 12m
pvc-66daade5-1b97-41ce-a9e0-4cf88d63894d 10Gi RWX Delete Terminating wiseco/data-redis-cluster-5 redis-nfs-storage 11m
pvc-dd62a086-1802-446a-9f9d-35620f7f0b4a 10Gi RWX Delete Bound wiseco/data-redis-cluster-4 redis-nfs-storage 11m
pvc-e5aa9802-b983-471c-a7da-32eebc497610 10Gi RWX Delete Bound wiseco/data-redis-cluster-3 redis-nfs-storage 12m

[root@k8s-master01 deploy]# kubectl get pvc -n public-service
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-redis-cluster-0 Bound pvc-20bcb3be-90e1-4354-bd11-4f442a3bd562 10Gi RWX redis-nfs-storage 19m
data-redis-cluster-1 Bound pvc-43c0cba2-54a9-4416-afb6-8b7730a199dc 10Gi RWX redis-nfs-storage 12m
data-redis-cluster-2 Bound pvc-3b53a31b-9a53-4bd4-93ff-2cf9fed551de 10Gi RWX redis-nfs-storage 12m
data-redis-cluster-3 Bound pvc-e5aa9802-b983-471c-a7da-32eebc497610 10Gi RWX redis-nfs-storage 12m
data-redis-cluster-4 Bound pvc-dd62a086-1802-446a-9f9d-35620f7f0b4a 10Gi RWX redis-nfs-storage 11m
data-redis-cluster-5 Bound pvc-66daade5-1b97-41ce-a9e0-4cf88d63894d 10Gi RWX redis-nfs-storage 11m

4)查看NFS共享存储
NFS服务器(172.16.60.238),查看共享目录/data/storage/k8s/redis
[root@k8s-harbor01 redis]# pwd
/data/storage/k8s/redis
[root@k8s-harbor01 redis]# ll
total 0
drwxrwxrwx 2 root root 63 Feb 4 18:59 wiseco-data-redis-cluster-0-pvc-20bcb3be-90e1-4354-bd11-4f442a3bd562
drwxrwxrwx 2 root root 63 Feb 4 18:59 wiseco-data-redis-cluster-1-pvc-43c0cba2-54a9-4416-afb6-8b7730a199dc
drwxrwxrwx 2 root root 63 Feb 4 18:59 wiseco-data-redis-cluster-2-pvc-3b53a31b-9a53-4bd4-93ff-2cf9fed551de
drwxrwxrwx 2 root root 63 Feb 4 19:00 wiseco-data-redis-cluster-3-pvc-e5aa9802-b983-471c-a7da-32eebc497610
drwxrwxrwx 2 root root 63 Feb 4 19:00 wiseco-data-redis-cluster-4-pvc-dd62a086-1802-446a-9f9d-35620f7f0b4a
drwxrwxrwx 2 root root 63 Feb 4 19:00 wiseco-data-redis-cluster-5-pvc-66daade5-1b97-41ce-a9e0-4cf88d63894d
[root@k8s-harbor01 redis]# ls ./*
./wiseco-data-redis-cluster-0-pvc-20bcb3be-90e1-4354-bd11-4f442a3bd562:
appendonly.aof nodes.conf redis.log

./wiseco-data-redis-cluster-1-pvc-43c0cba2-54a9-4416-afb6-8b7730a199dc:
appendonly.aof nodes.conf redis.log

./wiseco-data-redis-cluster-2-pvc-3b53a31b-9a53-4bd4-93ff-2cf9fed551de:
appendonly.aof nodes.conf redis.log

./wiseco-data-redis-cluster-3-pvc-e5aa9802-b983-471c-a7da-32eebc497610:
appendonly.aof nodes.conf redis.log

./wiseco-data-redis-cluster-4-pvc-dd62a086-1802-446a-9f9d-35620f7f0b4a:
appendonly.aof nodes.conf redis.log

./wiseco-data-redis-cluster-5-pvc-66daade5-1b97-41ce-a9e0-4cf88d63894d:
appendonly.aof nodes.conf redis.log

3、初始化Redis Cluster集群
接下来是形成Redis Cluster集群,运行以下命令并键入yes以接受配置。
集群形式:前三个节点成为主节点,后三个节点成为从节点。
需要注意:
redis-trib.rb必须使用ip进行初始化redis集群,使用域名会报如下错误:******/redis/client.rb:126:in `call’: ERR Invalid node address specified: redis-cluster-0.redis-headless.sts-app.svc.cluster.local:6379 (Redis::CommandError)
这里进行Redis Cluster集群初始化的命令:
以下命令并键入yes以接受配置。前三个节点成为主节点,后三个节点成为从节点。
kubectl exec -it redis-cluster-0 -n public-service – redis-trib.rb create --replicas 1 $(kubectl get pods -l app=redis-cluster -n public-service -o jsonpath=’{range.items[
]}{.status.podIP}:6379 ')
先获取Redis Cluster集群的6个节点Pod的ip地址
[root@k8s-master01 redis]# kubectl get pods -n wiseco -o public-service |grep redis-cluster
redis-cluster-0 1/1 Running 0 4h34m 172.30.217.83 k8s-node04
redis-cluster-1 1/1 Running 0 4h34m 172.30.85.217 k8s-node01
redis-cluster-2 1/1 Running 0 4h34m 172.30.135.181 k8s-node03
redis-cluster-3 1/1 Running 0 4h34m 172.30.58.251 k8s-node02
redis-cluster-4 1/1 Running 0 4h33m 172.30.85.216 k8s-node01
redis-cluster-5 1/1 Running 0 4h33m 172.30.217.82 k8s-node04

[root@k8s-master01 redis]# kubectl get pods -l app=redis-cluster -n public-service -o jsonpath=’{range.items[*]}{.status.podIP}:6379 ’
10.233.96.54:6379 10.233.90.151:6379 10.233.96.55:6379 10.233.90.152:6379 10.233.90.153:6379 10.233.96.63:6379

这里特别注意一下:
上面命令最后一个单引号前面一定要有空格!!
因为接下来进行Redis Cluster集群初始化的时候,集群节点间的ip+port之间要通过空格隔开。
因为集群设置有密码需要给redis-trib.rb 配置密码:
[root@k8s-master01 redis]# kubectl exec -it redis-cluster-0 -n public-service – vim /var/lib/gems/2.5.0/gems/redis-4.4.0/lib/redis/client.rb

[root@k8s-master01 redis]# kubectl exec -it redis-cluster-0 -n public-service – redis-trib.rb create --replicas 1 $(kubectl get pods -l app=redis-cluster -n public-service -o jsonpath=’{range.items[*]}{.status.podIP}:6379 ')

Creating cluster
Performing hash slots allocation on 6 nodes…
Using 3 masters:
172.30.217.83:6379
172.30.85.217:6379
172.30.135.181:6379
Adding replica 172.30.58.251:6379 to 172.30.217.83:6379
Adding replica 172.30.85.216:6379 to 172.30.85.217:6379
Adding replica 172.30.217.82:6379 to 172.30.135.181:6379
M: e5a3154a17131075f35fb32953b8cf8d6cfc7df0 172.30.217.83:6379
slots:0-5460 (5461 slots) master
M: 961398483262f505a115957e7e4eda7ff3e64900 172.30.85.217:6379
slots:5461-10922 (5462 slots) master
M: 2d1440e37ea4f4e9f6d39d240367deaa609d324d 172.30.135.181:6379
slots:10923-16383 (5461 slots) master
S: 0d7bf40bf18d474509116437959b65551cd68b03 172.30.58.251:6379
replicates e5a3154a17131075f35fb32953b8cf8d6cfc7df0
S: 8cbf699a850c0dafe51524127a594fdbf0a27784 172.30.85.216:6379
replicates 961398483262f505a115957e7e4eda7ff3e64900
S: 2987a33f4ce2e412dcc11c1c1daa2538591cd930 172.30.217.82:6379
replicates 2d1440e37ea4f4e9f6d39d240367deaa609d324d
Can I set the above configuration? (type ‘yes’ to accept): yes

Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join…

Performing Cluster Check (using node 172.30.217.83:6379)
M: e5a3154a17131075f35fb32953b8cf8d6cfc7df0 172.30.217.83:6379
slots:0-5460 (5461 slots) master
M: 961398483262f505a115957e7e4eda7ff3e64900 172.30.85.217:6379
slots:5461-10922 (5462 slots) master
M: 2d1440e37ea4f4e9f6d39d240367deaa609d324d 172.30.135.181:6379
slots:10923-16383 (5461 slots) master
M: 0d7bf40bf18d474509116437959b65551cd68b03 172.30.58.251:6379
slots: (0 slots) master
replicates e5a3154a17131075f35fb32953b8cf8d6cfc7df0
M: 8cbf699a850c0dafe51524127a594fdbf0a27784 172.30.85.216:6379
slots: (0 slots) master
replicates 961398483262f505a115957e7e4eda7ff3e64900
M: 2987a33f4ce2e412dcc11c1c1daa2538591cd930 172.30.217.82:6379
slots: (0 slots) master
replicates 2d1440e37ea4f4e9f6d39d240367deaa609d324d
[OK] All nodes agree about slots configuration.

Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered. 
通过上面初始化信息,可以看出集群关系:
redis-cluster-0是master节点,redis-cluster-3是它的从节点。
redis-cluster-1是master节点,redis-cluster-4是它的从节点。
redis-cluster-2是master节点,redis-cluster-5是它的从节点。

4、验证Redis Cluster集群部署
[root@k8s-master01 redis]# kubectl exec -it redis-cluster-0 -n public-service – redis-cli -a ‘123456’ cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:130
cluster_stats_messages_pong_sent:137
cluster_stats_messages_sent:267
cluster_stats_messages_ping_received:132
cluster_stats_messages_pong_received:130
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:267

[root@k8s-master01 redis]# for x in (seq05);doecho"redis−cluster−(seq 0 5); do echo "redis-cluster-(seq05);doecho"redis−cluster−x"; kubectl exec redis-cluster-$x -n wiseco – redis-cli -a ‘123456’ role; echo; done
redis-cluster-0
master
168
172.30.58.251
6379
168

redis-cluster-1
master
168
172.30.85.216
6379
168

redis-cluster-2
master
182
172.30.217.82
6379
168

redis-cluster-3
slave
172.30.217.83
6379
connected
182

redis-cluster-4
slave
172.30.85.217
6379
connected
168

redis-cluster-5
slave
172.30.135.181
6379
connected
182

注: 今天发现紫色飞猪大佬 写了一篇 集群版 的,在其基础上进行再升级。

k8s部署redis集群相关推荐

  1. 在K8s上部署Redis 集群

    一.前言 架构原理:每个Master都可以拥有多个Slave.当Master下线后,Redis集群会从多个Slave中选举出一个新的Master作为替代,而旧Master重新上线后变成新Master的 ...

  2. 通过operator部署redis集群(ucloud版)

    operator部署有状态的应用会简单很多 github文档:https://github.com/ucloud/redis-cluster-operator#deploy-redis-cluster ...

  3. Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群

    一.问题分析 本质上来说在 k8s 上部署一个 redis 集群和部署一个普通应用没有什么太大的区别,但需要注意下面几个问题: Redis 是一个有状态应用:这是部署 redis 集群时我们最需要注意 ...

  4. operator部署redis集群

    operator部署redis集群 1.现在operator的redis相关包 git clone https://github.com/ucloud/redis-cluster-operator.g ...

  5. K8S 部署rabbitmq集群

    K8S 部署rabbitmq集群 版本介绍 名称 版本 k8s 1.18 rabbitmq 3.8 命名空间:rabbitmq 我这里已经建立 configmap 配置文件 [root@k8s-mas ...

  6. Centos6.6部署Redis集群

    Centos6.6部署Redis集群 1 环境准备 1 环境安装redis 1 安装ruby 2 配置redis主从环境 3 部署redis sentinel服务器 5 集群使用 13 当前集群环境说 ...

  7. docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbit原理和架构可以参考https://blog.csdn.net/luanpeng825485697/article/details/8208 ...

  8. 三台机器使用Docker部署Redis集群

    三台机器使用Docker部署Redis集群 我们这里采用Docker在三台服务器上面进行Redis集群的搭建,它方便快捷.容易上手. 1.集群原理 在Redis集群中,所以的节点彼此关联,节点内部通过 ...

  9. Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka

    一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...

最新文章

  1. 构建一个增量推荐系统
  2. com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器提供的安全性认证无效...
  3. netstat [选项]
  4. 2017上海金马五校 购买装备 贪心+二分Check
  5. Visual Stutio中win32控制台应用程序、win32项目、MFC项目的区别:
  6. JavaWeb 命名规则
  7. android emulator虚拟设备分析第三篇之pipe上的qemud service
  8. 初识:如何实现利用C语言代码封装成可以安装的windows软件?
  9. 陈国良院士将出席“首届对象存储技术与应用大会”
  10. python计算程序运行时间毫秒_Python获取秒级时间戳与毫秒级时间戳方法
  11. Markdown编辑器使用教程_被迫流浪者的博客
  12. 破解Bandicam
  13. nmn抗衰老是骗局吗,美国nmn骗局,正面解答
  14. 手机通信专有名词中英文
  15. 数据库:一条sql语句查询每门课程都大于80分的学生姓名
  16. 色彩搭配的基本原理,在黑色的背景下,什么颜色才能够有效、漂亮地突出主题
  17. 筹备冲刺科创板,佰维存储做对了哪些事情?
  18. [转]什么样的女人才是老婆
  19. IAR在写结构体时不提示_防雷接地计算实例,造价小伙伴们都来做一下,看看算的对不对...
  20. 简析步进电机丢步原因

热门文章

  1. 携职教育:软考经验贴 | 系统集成项目管理工程师
  2. 电子顺磁共振谱(EPR,ESR)
  3. LaTex中PDF裁剪工具pdfcrop的使用
  4. 如何利用Intellij Idea搭建python编译运行环境
  5. 经纬恒润位列“2021北京民营企业科技创新百强榜单”第40名
  6. 压缩pdf,pdf压缩软件一分钟搞定
  7. 第一次到学校的电子阅览室上网
  8. LNMP脚本一键部署
  9. stm32毕业设计 NBIOT远程通信系统
  10. stm32f103can总线过滤器配置