ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

K8s 部署 Redis 6.2.3 集群

K8s 部署 Redis 6.2.3 集群

一、安装规划

组件replicas类型
Redis6StatefulSet
redis-trib1Deployment

使用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.yml
apiVersion: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:WaitForFirstConsumer
kubectl apply-fredis-local-storage.yml

创建命名空间,后面所有的操作均在此命名空间下执行:

vins.yml
apiVersion:v1kind:Namespacemetadata:name:redislabels:name:redis
kubectl apply-fns.yml

二、部署 Redis 集群节点

viredis.yml
apiVersion: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:5Gi
kubectl apply-fredis.yml

查看pod:

kubectl get pods-nredis

三、部署 redis-trib 工具

viredis-trib.yml
apiVersion: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 3600
kubectl 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 045dfbd9bc5a

k8s会很快再次拉起该服务,再次查看每个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写入依然正常。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进