天天看点

Redis On K8s

redis on k8s 优势很多:

1、可以通过运维平台对接k8s api,可以提高部署效率

2、扩缩容方便

3、迁移成本低,直连代理即可,和之前使用redis单机一样的配置

为什么这里没有采用小米的redis on k8s方案?

考虑到我们这很多微服务依赖的redis的压力并不大(大量1-4g实例),轻量级的redis主从即可满足需求,使用社区现有解决方案,基本不会增加运维成本。

如果引入predixy on k8s类的专业代理组件,需要投入的人力成本过大(predixy 在非k8s环境下之前也用过,偶发bug,目前我们团队也没有对其二开或bugfix的能力)

参考:

https://github.com/dandydeveloper/charts

https://artifacthub.io/packages/helm/dandydev-charts/redis-ha

架构如下图

看上去偏重些,redis的pod中有4个container,自带了prometheus监控和redis状态的治理,好在除了redis本身外其余container占用的资源都很少,整体还是可以接受的。

Redis On K8s

实战:

git clone 后, cd charts/

cp -a redis-ha redis-1g    # ps:我这里是搞了个redis-1g的独立文件夹,专用于启动1g的redis主从例。

然后去修改下value.yaml中的配置:

1、redis的 replicas 从3改为2(节约资源)

2、开启haproxy的配置支持,并修改replicas 从3改为2(节约资源)

3、开启metrics和servicemonitor(用于自动化的指标数据采集)

4、启用sysctlimage,并优化些内核参数 (非必要,可选)

5、设置quorum为1,修改min-replicas-to-write: 0(默认配置不是这样的,我这里精简掉了1个slave,所以必须把配置也改低些)

6、显式设置 maxmemory: "1024mb"  (强烈建议开启,写满后触发自动淘汰key,避免因为达到k8s的limits自动杀掉pod)

7、设置 maxmemory-policy: "volatile-lfu"  (建议,非必须修改项)

8、设置resources limit和 request的值(生产pod必须显式设置)

9、hardantiaffinity值的设置 (生产必须设置为true,测试的话如果没有很多k8s节点,可以这个参数设置为false)

10、各种exporter都设置为true

我这里改好的yaml如下:

配置文件改好后,我们去部署:

helm install redis-arch redis-1g

注意: 这个redis的yaml中,是开启了持久化的,我们的k8s还需要配置个default storgeclass,我这里用的是本机nfs(生产上可以用其它的解决方案)

Redis On K8s

等容器都启动好后,最终效果如下:

Redis On K8s
Redis On K8s
Redis On K8s
Redis On K8s

可以去grafana画板子(这个git仓库里面,也自带了一个grafana的周边,感兴趣的可以自行试用),下面是我随手画的demo:

Redis On K8s

扩容和缩容:

1、修改redis的configmap,调大maxmemory

2、修改sts配置文件,调大 limits(limits要求比maxmemory大些)

修改sts配置后,会自动触发redis的pod的重建

重建过程中,redis会触发主从切换,但是因为前端有haproxy了,因此不可用时间通常在20s以内

tips:

如果用不惯helm这种方式的,我们也可以部署一套redis出来后,把它全部的yam都扒拉出来,然后把可能需要改动的地方都用变量替换,制做出一套模板。

这样我们就可以通过 自研的服务去调k8s api(甚至用jenkins包装下执行apply一系列的yaml也行) 达到快速拉起一套redis集群的目的。