k8s部署redis|k8s部署redis cluster集群的实现

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。
  • 群集内部的通信是通过内部总线进行的,使用协议传播有关群集的信息或发现新节点。
k8s以StatefulSet方式部署redis cluster集群: 1. 部署nfs
2. 创建pv
3. 部署redis
4. 初始化redis集群

主机说明:

系统 ip 角色 cpu 内存 hostname
CentOS 7.8 192.168.30.128 master >=2 >=2G master1
CentOS 7.8 192.168.30.129 master >=2 >=2G master2
CentOS 7.8 192.168.30.130 node >=2 >=2G node1
CentOS 7.8 192.168.30.131 node >=2 >=2G node2
CentOS 7.8 192.168.30.132 node >=2 >=2G node3

kubectl get nodeNAMESTATUSROLESAGEVERSIONmaster1Readymaster33dv1.14.0master2Readymaster33dv1.14.0node1Ready33dv1.14.0node2Ready33dv1.14.0node3Ready33dv1.14.0

部署nfs
在master2节点上做nfs共享,
yum -y install nfs-utils rpcbindmkdir -p /data/redis/{cluster0,cluster1,cluster2,cluster3,cluster4,cluster5}vim /etc/exports

/data/redis/cluster0 192.168.30.0/24(rw,sync,no_root_squash)/data/redis/cluster1 192.168.30.0/24(rw,sync,no_root_squash)/data/redis/cluster2 192.168.30.0/24(rw,sync,no_root_squash)/data/redis/cluster3 192.168.30.0/24(rw,sync,no_root_squash)/data/redis/cluster4 192.168.30.0/24(rw,sync,no_root_squash)/data/redis/cluster5 192.168.30.0/24(rw,sync,no_root_squash)

chmod -R 755 /data/redisexportfs -arvsystemctl enable rpcbind && systemctl start rpcbindsystemctl enable nfs && systemctl start nfs

nfs部署完毕。对于需要使用nfs的node节点,都要安装nfs:
yum -y install nfs-utils

创建pv
创建pv:

mkdir -p /home/k8s/redis&& cd /home/k8s/redisvim pv.yaml

apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pv0spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.30.129path: /data/redis/cluster0---apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pv1spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.30.129path: /data/redis/cluster1---apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pv2spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.30.129path: /data/redis/cluster2---apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pv3spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.30.129path: /data/redis/cluster3---apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pv4spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.30.129path: /data/redis/cluster4---apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pv5spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.30.129path: /data/redis/cluster5

kubectl apply -f pv.yamlkubectl get pvNAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGEnfs-pv01GiRWXRetainAvailable3snfs-pv11GiRWXRetainAvailable3snfs-pv21GiRWXRetainAvailable3snfs-pv31GiRWXRetainAvailable3snfs-pv41GiRWXRetainAvailable3snfs-pv51GiRWXRetainAvailable3s

pv创建完毕。
部署redis
vim namespace.yamlapiVersion: v1kind: Namespacemetadata:name: public-service

vim redis.confappendonly yescluster-enabled yescluster-config-file /var/lib/redis/nodes.confcluster-node-timeout 5000dir /var/lib/redisport 6379

vim redis.yamlapiVersion: v1kind: Servicemetadata:name: redisnamespace: public-servicelabels:app: redisspec:selector:app: redisappCluster: redis-clusterports:- name: redisport: 6379clusterIP: None---apiVersion: v1kind: Servicemetadata:name: redis-accessnamespace: public-servicelabels:app: redisspec:selector:app: redisappCluster: redis-clusterports:- name: redis-accessprotocol: TCPport: 6379targetPort: 6379---apiVersion: apps/v1kind: StatefulSetmetadata:name: redisnamespace: public-servicespec:serviceName: redisreplicas: 6selector:matchLabels:app: redisappCluster: redis-clustertemplate:metadata:labels:app: redisappCluster: redis-clusterspec:terminationGracePeriodSeconds: 20affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- redistopologyKey: kubernetes.io/hostnamecontainers:- name: redisimage: redis:latestcommand:- "redis-server"args:- "/etc/redis/redis.conf"- "--protected-mode"- "no"resources:requests:cpu: "500m"memory: "500Mi"ports:- containerPort: 6379name: redisprotocol: TCP- containerPort: 16379name: clusterprotocol: TCPvolumeMounts:- name: confmountPath: /etc/redis- name: datamountPath: /var/lib/redisvolumes:- name: confconfigMap:name: redis-confitems:- key: redis.confpath: redis.confvolumeClaimTemplates:- metadata:name: datanamespace: public-servicespec:accessModes: [ "ReadWriteMany" ]resources:requests:storage: 1Gi

kubectl apply -f namespace.yamlkubectl create configmap redis-conf --from-file=redis.conf -n public-servicekubectl apply -f redis.yamlkubectl get svc -n public-serviceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEredisClusterIPNone6379/TCP20sredis-accessClusterIP10.96.2.1006379/TCP20skubectl get pod -n public-serviceNAMEREADYSTATUSRESTARTSAGEredis-01/1Running02m43sredis-11/1Running02m18sredis-21/1Running0108sredis-31/1Running080sredis-41/1Running048sredis-51/1Running030skubectl get pvc -n public-serviceNAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGEdata-redis-0Boundnfs-pv41GiRWX3m4sdata-redis-1Boundnfs-pv01GiRWX2m39sdata-redis-2Boundnfs-pv11GiRWX2m9sdata-redis-3Boundnfs-pv21GiRWX101sdata-redis-4Boundnfs-pv31GiRWX69sdata-redis-5Boundnfs-pv51GiRWX51s

redis-access这个service方便集群内访问redis集群,redis部署完毕。
初始化redis集群
使用Redis-tribe工具进行集群的初始化。
下载redis-tribe:

kubectl run -it ubuntu --image=ubuntu --restart=Never -n public-service bashroot@ubuntu:/# cat > /etc/apt/sources.list << EOFdeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricteddeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricteddeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiversedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricteddeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverseEOF

root@ubuntu:/# apt-get updateroot@ubuntu:/# apt-get install -y libncursesw5 libreadline6 libtinfo5 --allow-remove-essentialroot@ubuntu:/# apt-get install -y libpython2.7-stdlib python2.7 python-pip redis-tools dnsutilsroot@ubuntu:/# pip install --upgrade piproot@ubuntu:/# pip install redis-trib==0.5.1

初始化集群:

root@ubuntu:/# redis-trib.py create \`dig +short redis-0.redis.public-service.svc.cluster.local`:6379 \`dig +short redis-1.redis.public-service.svc.cluster.local`:6379 \`dig +short redis-2.redis.public-service.svc.cluster.local`:6379root@ubuntu:/# redis-trib.py replicate \--master-addr `dig +short redis-0.redis.public-service.svc.cluster.local`:6379 \--slave-addr `dig +short redis-3.redis.public-service.svc.cluster.local`:6379root@ubuntu:/# redis-trib.py replicate \--master-addr `dig +short redis-1.redis.public-service.svc.cluster.local`:6379 \--slave-addr `dig +short redis-4.redis.public-service.svc.cluster.local`:6379root@ubuntu:/# redis-trib.py replicate \--master-addr `dig +short redis-2.redis.public-service.svc.cluster.local`:6379 \--slave-addr `dig +short redis-5.redis.public-service.svc.cluster.local`:6379root@ubuntu:/# exit

查看集群:

kubectl exec -it -n public-service redis-0 bashroot@redis-0:/data# redis-cli -c127.0.0.1:6379> CLUSTER NODES#列出节点信息aac2b3d320da67eedf3512ed0e38a1cdce5bc8fe 172.10.2.55:6379@16379 slave 7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 0 1592276224727 3 connected2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 172.10.2.54:6379@16379 master - 0 1592276224224 1 connected 0-5461524f03526a4b683d7d4de19296431810bfdc22cf 172.10.3.60:6379@16379 slave df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 0 1592276223117 5 connected7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 172.10.4.77:6379@16379 myself,master - 0 1592276224000 2 connected 5462-10922df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 172.10.3.59:6379@16379 master - 0 1592276223217 0 connected 10923-16383c1dbaaef4a583e372c43eed52c22cd9ad7184d18 172.10.4.78:6379@16379 slave 2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 0 1592276223719 4 connected127.0.0.1:6379> CLUSTER INFO#集群状态cluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:5cluster_my_epoch:2cluster_stats_messages_ping_sent:514cluster_stats_messages_pong_sent:491cluster_stats_messages_meet_sent:2cluster_stats_messages_sent:1007cluster_stats_messages_ping_received:491cluster_stats_messages_pong_received:516cluster_stats_messages_received:1007

redis集群初始化完成,已经形成3主3从的cluster集群。
写入数据:

127.0.0.1:6379> SET key1 aaaOK127.0.0.1:6379> SET key2 bbb-> Redirected to slot [4998] located at 172.10.2.54:6379OK172.10.2.54:6379> SET key3 cccOK

kubectl exec -it -n public-service redis-4 bashroot@redis-4:/data# redis-cli -c127.0.0.1:6379> GET key1-> Redirected to slot [9189] located at 172.10.4.77:6379"aaa"172.10.4.77:6379> GET key2-> Redirected to slot [4998] located at 172.10.2.54:6379"bbb"172.10.2.54:6379> GET key3"ccc"

可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。
主从切换:

选择redis-2模拟宕掉,测试主从切换,
kubectl get pod -n public-service -o wideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATESredis-01/1Running062m172.10.4.77node1redis-11/1Running062m172.10.2.54node2redis-21/1Running061m172.10.3.59node3redis-31/1Running061m172.10.2.55node2redis-41/1Running061m172.10.4.78node1redis-51/1Running061m172.10.3.60node3ubuntu0/1Completed057m172.10.2.56node2kubectl exec -it -n public-service redis-2 bashroot@redis-2:/data# redis-cli -c127.0.0.1:6379> ROLE1) "master"2) (integer) 28983) 1) 1) "172.10.3.60"2) "6379"3) "2898"

可以看到,redis-2是master,它的slave是172.10.3.60,即redis-5。
kubectl delete pod -n public-service redis-2#模拟节点宕掉kubectl get pod -n public-service redis-2 -o wideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATESredis-21/1Running038s172.10.3.61node3kubectl exec -it -n public-service redis-2 bashroot@redis-2:/data# redis-cli -c127.0.0.1:6379> ROLE1) "slave"2) "172.10.3.60"3) (integer) 63794) "connected"5) (integer) 3430

kubectl exec -it -n public-service redis-5 bashroot@redis-5:/data# redis-cli -c127.0.0.1:6379> ROLE1) "master"2) (integer) 35843) 1) 1) "172.10.3.61"2) "6379"3) "3570"127.0.0.1:6379> CLUSTER NODESaac2b3d320da67eedf3512ed0e38a1cdce5bc8fe 172.10.2.55:6379@16379 slave 7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 0 1592278859530 2 connected2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 172.10.2.54:6379@16379 master - 0 1592278859000 1 connected 0-5461c1dbaaef4a583e372c43eed52c22cd9ad7184d18 172.10.4.78:6379@16379 slave 2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 0 1592278859000 1 connected524f03526a4b683d7d4de19296431810bfdc22cf 172.10.3.60:6379@16379 myself,master - 0 1592278857000 6 connected 10923-163837c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 172.10.4.77:6379@16379 master - 0 1592278858021 2 connected 5462-10922df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 172.10.3.61:6379@16379 slave 524f03526a4b683d7d4de19296431810bfdc22cf 0 1592278859000 6 connected

可以看到,redis-2在重启之后变为slave,而它之前的slave——redis-5变为master,而且是新redis-2的master。
集群的主从切换没有问题。k8s部署redis cluster集群完成。

【k8s部署redis|k8s部署redis cluster集群的实现】到此这篇关于k8s部署redis cluster集群的实现的文章就介绍到这了,更多相关k8s部署redis cluster内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读