【实战】K8S部署Redis集群代理Predixy

文章目录

    • 前言
    • 技术积累
      • 为什么要在redis集群前面加个predixy代理?
      • 这样做的好处有哪些?
      • 常用代理配置
      • 网络存储
    • 实战构建predixy镜像并部署
      • 下载predixy源码编译构建镜像
      • 创建K8S配置文件predixy-configmap并执行
      • 网络储存PV与PVC
      • 部署predixy-deployment
    • 测试代理效果
    • 写在最后

前言

部署在K8S中的redis可以在集群内通过服务名访问,这个我们前面博文K8S Helm部署Redis Cluster & Redisinsight 已经介绍过了。但是还是有很多的问题,比如不能在K8S集群外访问,并且在切换库的时候会发生异常,而且只能安装特定的客户端来访问数据库。所以,今天就直接引入Redis集群代理Predixy来管理,让我们把集群当做单机一样。

技术积累

为什么要在redis集群前面加个predixy代理?

在这里插入图片描述

如上图所视,在redis集群之上还存在一个predixy集群。在predixy集群之上可以加个nginx,负载最终端的请求,对于客户端来说,看起来只是连接了一个单机版的redis,实际上连接的是一个集群。

这样做的好处有哪些?

Redis pod重启可导致IP变化
POD重新安装后,NODE IP会变化,此时终端无感知
Redis处理连接负载高
集群扩缩容无感知
数据安全风险

常用代理配置

在这里插入图片描述

我们希望能够继续使用Redis Cluster来管理Redis集群,所以Codis和Twemproxy不再考虑。redis-cluster-proxy是Redis官方在6.0版本推出的支持Redis Cluster协议的Proxy,但是目前还没有稳定版,暂时也无法大规模应用。

网络存储

PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。

PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。

PV是运维人员来创建的,开发操作PVC,可是大规模集群中可能会有很多PV,如果这些PV都需要运维手动来处理这也是一件很繁琐的事情,所以就有了动态供给概念,也就是Dynamic Provisioning。而我们上面的创建的PV都是静态供给方式,也就是Static Provisioning。而动态供给的关键就是StorageClass,它的作用就是创建PV模板。

创建StorageClass里面需要定义PV属性比如存储类型、大小等;另外创建这种PV需要用到存储插件。最终效果是,用户提交PVC,里面指定存储类型,如果符合我们定义的StorageClass,则会为其自动创建PV并进行绑定。

实战构建predixy镜像并部署

下载predixy源码编译构建镜像

载predixy源码

mkdir -p /k8s/predixy
cd /k8s/predixy
wget https://codeload.github.com/joyieldInc/predixy/zip/refs/heads/master
unzip master
mv predixy-master predixy-1.0.5

编译源码

cd predixy-1.0.5
make 

准备Dockerfile
[root@master predixy]# pwd
/k8s/predixy
[root@master predixy]# vim predixy-dockerfile.yaml

FROM centos:7
RUN yum install -y epel-release net-tools
RUN yum install -y redis
RUN yum install -y libstdc++-static gcc gcc-c++ make
RUN mkdir /opt/predixy-1.0.5
RUN mkdir /etc/predixy
COPY ./predixy-1.0.5/src/predixy  /usr/local/bin/
COPY ./predixy-1.0.5/conf/*  /etc/predixy/
ENTRYPOINT ["/usr/local/bin/predixy","/etc/predixy/predixy.conf"]

然后就可以使用该镜像

[root@master predixy]# docker build .  -t prodixy:v1.0.5 -f predixy-dockerfile.yaml

创建K8S配置文件predixy-configmap并执行

vim predixy-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: predixy-confignamespace: redis-cluster  #namespace按自已的修改
data:predixy.conf: |################################### GENERAL ###################################### Predixy configuration file example## Specify a name for this predixy service## redis command INFO can get thisName Predixy-DefaultNS## Specify listen address, support IPV4, IPV6, Unix socket## Examples:# Bind 127.0.0.1:7617# Bind 0.0.0.0:7617# Bind /tmp/predixy## Default is 0.0.0.0:7617Bind 0.0.0.0:7617## Worker threadsWorkerThreads 4## Memory limit, 0 means unlimited## Examples:# MaxMemory 100M# MaxMemory 1G# MaxMemory 0## MaxMemory can change online by CONFIG SET MaxMemory xxx## Default is 0# MaxMemory 0## Close the connection after a client is idle for N seconds (0 to disable)## ClientTimeout can change online by CONFIG SET ClientTimeout N## Default is 0 为0时表示禁止该功能,不主动断开客户端连接ClientTimeout 0## IO buffer size## Default is 4096# BufSize 4096################################### LOG ########################################## Log file path## Unspecify will log to stdout## Default is UnspecifiedLog /data/predixy.log## LogRotate support## 1d rotate log every day## nh rotate log every n hours   1 <= n <= 24## nm rotate log every n minutes 1 <= n <= 1440## nG rotate log evenry nG bytes## nM rotate log evenry nM bytes## time rotate and size rotate can combine eg 1h 2G, means 1h or 2G roate a time## Examples:# LogRotate 1d 2G# LogRotate 1dLogRotate 1d## Default is disable LogRotate## In multi-threads, worker thread log need lock,## AllowMissLog can reduce lock time for improve performance## AllowMissLog can change online by CONFIG SET AllowMissLog true|false## Default is true# AllowMissLog false## LogLevelSample, output a log every N## all level sample can change online by CONFIG SET LogXXXSample NLogVerbSample 0LogDebugSample 0LogInfoSample 100LogNoticeSample 1LogWarnSample 1LogErrorSample 1################################### AUTHORITY ################################### Include auth.confAuthority {Auth "123456pw" {    # predixy 代理密码,业务后端认证需要配置的密码Mode admin   # 权限}}################################### SERVERS #####################################Include cluster.conf# Include sentinel.conf# Include try.conf################################################################################这个clusterserverpool也可以放到cluster.conf文件中,看自已的需求ClusterServerPool {Password 123456    # redis cluste 集群密码MasterReadPriority 60StaticSlaveReadPriority 50DynamicSlaveReadPriority 60RefreshInterval 1ServerTimeout 1ServerFailureLimit 10ServerRetryTimeout 1KeepAlive 120Servers {#这个很重要,就是redis-server的集群IP地址,一定要要能取到,可以按我上面的curl方法,能取就行+ redis-cluster.redis-cluster.svc.cluster.local:6379  }}################################### DATACENTER ################################### LocalDC specify current machine dc# LocalDC bj## see dc.conf# Include dc.conf################################### COMMAND ###################################### Custom command define, see command.conf#Include command.conf################################### LATENCY ###################################### Latency monitor define, see latency.conf#Include latency.confMode write}Auth "#a complex password#" {Mode admin}
}

#执行

kubectl apply -f predixy-configmap.yaml

网络储存PV与PVC

#创建pvc,没有安装nfs-storage的自行查看之前的博文安装

vim predixy-pvc-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: predixy-pvc-nfsnamespace: redis-cluster
spec:accessModes:- ReadWriteManyresources:requests:storage: 5GistorageClassName: nfs-storage

#执行

kubectl apply -f predixy-pvc-nfs.yaml

#查看状态

#  nfs创建了pvc会自动创建pv
[root@master nfs]# kubectl get pvc -A|grep  predixy-pvc-nfs
redis-cluster   predixy-pvc-nfs                           Bound    pvc-8524dbd5-fe88-49c5-9417-b1df0815f595   5Gi        RWX            nfs-storage    5m12s[root@master nfs]# kubectl get pv -A | grep predixy
pvc-8524dbd5-fe88-49c5-9417-b1df0815f595   5Gi        RWX            Delete           Bound         redis-cluster/predixy-pvc-nfs                     nfs-storage             18m

部署predixy-deployment

注:predixy是无状态服务

vim predixy-deployment.yaml
--- 
apiVersion: apps/v1
kind: Deployment ## 升级、回滚
metadata:annotations:deployment.kubernetes.io/revision: '1'name: predixynamespace: redis-cluster
spec:progressDeadlineSeconds: 600replicas: 2revisionHistoryLimit: 5selector:matchLabels:app: predixystrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: predixyspec:containers:- command:- predixy- /etc/predixy/predixy.confimage: registry.cn-hangzhou.aliyuncs.com/senfel/predixy:v1.0.5name: predixyterminationMessagePath: /dev/termination-logterminationMessagePolicy: Fileresources:requests:cpu: 100mmemory: 30Milimits:cpu: 100mmemory: 30MivolumeMounts:- mountPath: /etc/predixy/name: predixy-config-dirreadOnly: true- mountPath: /data/name: predixy-data-dirimagePullSecrets:- name: registry.cn-hangzhou.aliyuncs.comdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerterminationGracePeriodSeconds: 30volumes:- configMap:defaultMode: 420name: predixy-config ## ConfigMapname: predixy-config-dir- name: predixy-data-dirpersistentVolumeClaim:claimName: predixy-pvc-nfs ## 存储---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler ## 自动扩容
metadata:name: predixynamespace: redis-cluster
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: predixyminReplicas: 1maxReplicas: 3metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50- type: Resourceresource:name: memorytarget:type: AverageValueaverageValue: 80Mi---
apiVersion: v1
kind: Service ## 服务
metadata:name: predixynamespace: redis-cluster
spec:externalTrafficPolicy: Clusterports:- name: predixy-portnodePort: 30617port: 7617protocol: TCPtargetPort: 7617sessionAffinity: Nonetype: NodePortselector:app: predixy

#执行

kubectl apply -f predixy-deployment.yaml

#查看状态

[root@master nfs]# kubectl get pod -A|grep predixy

redis-cluster predixy-ff95dcbc5-k9zjs 1/1 Running 0 15m
redis-cluster predixy-ff95dcbc5-nllx8 1/1 Running 0 15m

#删除

kubectl delete -f predixy-deployment.yaml

测试代理效果

K8S集群外部直接使用客户端调用

C:\Users\dev>redis-cli -h 10.10.22.91 -p 30617
10.10.22.91:30617> auth 123456pw
OK
10.10.22.91:30617> get name
“senfel”
10.10.22.91:30617> set name senfel1
OK
10.10.22.91:30617> get name
“senfel1”
10.10.22.91:30617> set age
(error) ERR wrong number of arguments for ‘set’ command
10.10.22.91:30617> set age 10
OK
10.10.22.91:30617> get age
“10”
10.10.22.91:30617>

写在最后

K8S部署Redis集群代理Predixy还是比较简单,只需要编译Predixy源码并构建镜像然后部署在K8S集群即可。最后的效果也是比较nice,直接可以负载均衡到任意的redis节点,让redis集群管理和K8S外部环境任意访问都轻而易举。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake TcpServer项目 生成静态库.a / 动态库.so

CMake 实战构建TcpServer项目 静态库/动态库-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135608829?spm1001.2014.3001.5501 在这篇博客的基础上&#xff0c;我们把头文件放在include里边&#xff0c;把源文件放在src里边&#xff0c;重新构建 hehedali…

IPFoxy运营干货|谷歌广告Google Ads建立广告需要注意什么?

投放谷歌广告需要多少个步骤和什么准备工作&#xff0c;本文将来讲述&#xff0c;主要分5个内容&#xff1a;一、投放前竞对研究&#xff1b;二、投放前广告账户设置&#xff1b;三、建立广告系列&#xff1b;四、建立广告组&#xff1b;五、广告长期策略。接下来我们来开始建立…

AI视觉训练环境-【2】开发客户端搭建

本文介绍搭建一套简单的AI视觉训练环境的过程,作者也是刚开始接触机器视觉,现将学习过程中的搭建过程梳理下来分享给大家。创作过程实属不易,如不喜欢请轻轻绕过,如有建议无比欢迎,只愿我们共同进步。 训练环境 1.概述 开发环境基于yolov5进行训练演练,开发人员通过PyCha…

Gazebo的模型下载。

git clone zouxu634866/gazebo_modelshttps://gitee.com/zouxu6348660/gazebo_models.git&#xff0c;并完成路径配置。 &#xff08;本文提供了gitee下载&#xff0c;国外的Github下载较慢。&#xff09;

16位单片机单片机S1C17153

16位单片机单片机 .16KB ROM / 2KB内存 * S1C17653对于程序开发很有用。 .产生具有内置振荡器的操作时钟。 - OSC3B振荡器电路&#xff1a;2MHz/1MHz/500kHz&#xff08;类型&#xff09;内部振荡器电路 -OSC1无振荡器电路&#xff1a;32.768 kHz&#xff08;类型&#xf…

【C语言】linux内核ipoib模块 - ipoib_intf_init

一、ipoib_intf_init函数定义 int ipoib_intf_init(struct ib_device *hca, u8 port, const char *name,struct net_device *dev, struct ipoib_dev_priv *priv) {struct rdma_netdev *rn netdev_priv(dev);int rc;priv->ca hca;priv->port port;rc rdma_init_netde…

微信小程序(四)页面跳转

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.相对路径页面跳转 2. 绝对路径页面跳转 index.wxml <!-- navigator是块级元素&#xff0c;占一整行 --> <!-- 页面跳转url&#xff0c;相对路径 --> <navigator url"../logs/logs"><butto…

匿名/箭头函数,立即执行函数IIFE;函数声明式和函数表达式

目录 匿名/箭头函数&#xff1a;简洁 继承上一层作用域链的this 不绑定arguments,用rest参数 rest 参数&#xff1a;...真正的数组 因为没有function声明&#xff0c;所以没有原型prototype&#xff0c;所以不能作为构造函数 当函数体只有一句时&#xff0c;可省 return ,…

c++:基于c语言基础上的语法不同(1)

前言&#xff1a;此篇文章适合学完c语言基础概念的同学&#xff0c;是帮助c向c语言的同学快速掌握基本语法。 基础格式 #include<iostream>using namespace std; int main() {system("pause");return 0; } 输入&#xff1a; cin>>a;//a是输入内容 输出…

MySQL面试总结

MySQL优化 1.MySQL如何定位慢查询 1.1开源工具 1.2MySQL自带慢日志 1.3解答 2.EXPLAIN 2.1解答 3.什么是索引 4.B树 4.1数据结构对比 5.聚簇索引&#xff08;聚集索引&#xff09; 6.覆盖索引 7.索引创建原则 8.什么情况下索引失效 9.你对sql优化经验 10.事务 11.MVCC 11.主从…

力扣 | 438. 找到字符串中所有字母异位词

滑动窗口解题 示例 在s里面控制一个p字符串长度的滑动窗口&#xff0c;统计该滑动窗口中的每种字符出现的次数 import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Problem_438_FindAnagrams {public List<Integer> findAnagram…

「JavaSE」类和对象3

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 类和对象3 &#x1f349;多态&#x1f34c;重写&#x1f34c;向上转型&向下转型&#x1f34c;静态绑定&动态绑定&#x…