一、安装规划
| 组件 | replicas | 类型 |
|---|---|---|
| Redis | 6 | StatefulSet |
| redis-trib | 1 | Deployment |
使用k8s版本为:v1.18.0。
本次使用OpenEBS来作为存储引擎,OpenEBS是一个开源的、可扩展的存储平台,它提供了一种简单的方式来创建和管理持久化存储卷。它支持各种存储后端,包括但不限于ZFS、Btrfs、XFS等。同时,OpenEBS具有高度的可扩展性和可配置性,可以满足不同的存储需求。
使用redis-trib管理Redis集群。redis-trib是官方提供的Redis Cluster的管理工具,可以检查集群、创建删除节点、删除key、批量下发实例命令等等。
如果没有安装OpenEBS,需要先安装 :
kubectl apply-fhttps://openebs.github.io/charts/openebs-operator.yaml验证OpenEBS是否正确安装:
kubectl get pods-nopenebs
所有的OpenEBS pods都处于Running状态表示正常。
创建StorageClass,这里使用OpenEBS的hostpath模式:
viredis-local-storage.ymlapiVersion:storage.k8s.io/v1kind:StorageClassmetadata:name:redis-local-storageannotations:openebs.io/cas-type:localcas.openebs.io/config:|- name: StorageType value: hostpath - name: BasePath value: /data/openebs/redisprovisioner:openebs.io/localreclaimPolicy:DeletevolumeBindingMode:WaitForFirstConsumerkubectl apply-fredis-local-storage.yml创建命名空间,后面所有的操作均在此命名空间下执行:
vins.ymlapiVersion:v1kind:Namespacemetadata:name:redislabels:name:rediskubectl apply-fns.yml二、部署 Redis 集群节点
viredis.ymlapiVersion:v1kind:Servicemetadata:name:redis-hlnamespace:redislabels:app:redis-hlspec:ports:-port:6379name:clientclusterIP:Noneselector:app:redis---apiVersion:v1kind:Servicemetadata:name:redis-npnamespace:redislabels:app:redis-npspec:type:NodePortports:-port:6379name:clientnodePort:31639targetPort:6379selector:app:redis---apiVersion:v1kind:ConfigMapmetadata:name:redis-confignamespace:redislabels:app:redis-configdata:redis.conf:|+ cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-require-full-coverage no cluster-migration-barrier 1 appendonly yes---apiVersion:apps/v1kind:StatefulSetmetadata:name:redisnamespace:redisspec:serviceName:"redis-hl"replicas:6selector:matchLabels:app:redistemplate:metadata:labels:app:redisspec:containers:-name:redisimage:redis:6.2.3ports:-containerPort:6379name:servercommand:["redis-server","/etc/redis/redis.conf"]volumeMounts:-name:redis-configmountPath:/etc/redis/redis.confsubPath:redis.conf-name:redis-datamountPath:/datavolumes:-name:redis-configconfigMap:name:redis-configvolumeClaimTemplates:-metadata:name:redis-dataspec:accessModes:["ReadWriteOnce"]storageClassName:redis-local-storageresources:requests:storage:5Gikubectl apply-fredis.yml查看pod:
kubectl get pods-nredis三、部署 redis-trib 工具
viredis-trib.ymlapiVersion:apps/v1kind:Deploymentmetadata:name:redis-tribnamespace:redislabels:app:redis-tribspec:replicas:1selector:matchLabels:app:redis-tribtemplate:metadata:name:redis-triblabels:app:redis-tribspec:containers:-name:redis-tribimage:sunnywang/redis-tools-ubuntu:v0.5.1imagePullPolicy:IfNotPresentargs:-/bin/bash--c-sleep 3600kubectl apply-fredis-trib.yml查看pod:
kubectl get pods-nredis四、初始化 Redis 集群
进入到redis-trib pod中,注意改成你环境中的名称:
kubectlexec-itredis-trib-596696b5cb-z2fg2-nredis -- /bin/bash初始化主节点,这里规划redis-0、redis-1、redis-2为主节点:
redis-trib.py create`dig+short redis-0.redis-hl.redis.svc.cluster.local`:6379`dig+short redis-1.redis-hl.redis.svc.cluster.local`:6379`dig+short redis-2.redis-hl.redis.svc.cluster.local`:6379然后为每个主节点添加副本节点:
为redis-0添加redis-3副本节点:
redis-trib.py replicate --master-addr`dig+short redis-0.redis-hl.redis.svc.cluster.local`:6379 --slave-addr`dig+short redis-3.redis-hl.redis.svc.cluster.local`:6379为redis-1添加redis-4副本节点:
redis-trib.py replicate --master-addr`dig+short redis-1.redis-hl.redis.svc.cluster.local`:6379 --slave-addr`dig+short redis-4.redis-hl.redis.svc.cluster.local`:6379为redis-2添加redis-5副本节点:
redis-trib.py replicate --master-addr`dig+short redis-2.redis-hl.redis.svc.cluster.local`:6379 --slave-addr`dig+short redis-5.redis-hl.redis.svc.cluster.local`:6379连接任意redis节点,查看集群状态:
redis-cli-hredis-0.redis-hl-c查看集群信息:
cluster info查看集群节点:
cluster nodes测试读写:
五、故障测试
这里测试手动杀掉其中一个Redis节点,让K8s重新拉起服务,使其原有的ip改变看是否影响集群。
首先查看当前的ip信息:
kubectl get pods-nredis-owide
可以看到此时reids-0的ip是10.244.2.106,下面进到其node主机上,查看docker进程:
dockerps|grepredis-0
直接强制删除这俩容器:
dockerrm-f34b60c4eb470 045dfbd9bc5ak8s会很快再次拉起该服务,再次查看每个pod的ip:
kubectl get pods-nredis-owide
可以看出reids-0的ip已经变成了10.244.2.110,再次连接任意reids节点:
redis-cli-hredis-0.redis-hl-c查看集群信息:
cluster info可以看到此时集群状态依然是ok,并且集群节点还是6个。
查看集群节点:
cluster nodes可以看出,新ip10.244.2.110已经加入集群,测试写数据:
可以看出,重定向到新ip写入依然正常。