1、PV创建

  在nfs或者其他类型后端存储创建pv,首先创建共享目录

  1. [root@nfs ~]# cat /etc/exports
  2. /k8s/redis-sentinel/ *(rw,sync,no_subtree_check,no_root_squash)
  3. /k8s/redis-sentinel/ *(rw,sync,no_subtree_check,no_root_squash)
  4. /k8s/redis-sentinel/ *(rw,sync,no_subtree_check,no_root_squash)

  下载yaml文件

  1. https://github.com/dotbalo/k8s/

  创建pv,注意Redis的空间大小按需修改

  1. [root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-pv.yaml
  2. [root@k8s-master01 redis-sentinel]# kubectl get pv | grep redis
  3. pv-redis-sentinel- 4Gi RWX Recycle Bound public-service/redis-sentinel-master-storage-redis-sentinel-master-ss- redis-sentinel-storage-class 16h
  4. pv-redis-sentinel- 4Gi RWX Recycle Bound public-service/redis-sentinel-slave-storage-redis-sentinel-slave-ss- redis-sentinel-storage-class 16h
  5. pv-redis-sentinel- 4Gi RWX Recycle Bound public-service/redis-sentinel-slave-storage-redis-sentinel-slave-ss- redis-sentinel-storage-class 16h

2、创建namespace

  默认是在public-service中创建Redis哨兵模式

  1. kubectl create namespace public-service
  2. # 如果不使用public-service,需要更改所有yaml文件的public-service为你namespace。
  3. # sed -i "s#public-service#YOUR_NAMESPACE#g" *.yaml

3、创建ConfigMap

  Redis配置按需修改,默认使用的是rdb存储模式

  1. [root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-configmap.yaml
  2. [root@k8s-master01 redis-sentinel]# kubectl get configmap -n public-service
  3. NAME DATA AGE
  4. redis-sentinel-config 17h

  注意,此时configmap中redis-slave.conf的slaveof的master地址为ss里面的Headless Service地址。

4、创建service

  service主要提供pods之间的互访,StatefulSet主要用Headless Service通讯,格式:statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local

  - serviceName为Headless Service的名字

  - 0..N-1为Pod所在的序号,从0开始到N-1

  - statefulSetName为StatefulSet的名字

  - namespace为服务所在的namespace,Headless Servic和StatefulSet必须在相同的namespace

  - .cluster.local为Cluster Domain

  如本集群的HS为:

    Master:

      redis-sentinel-master-ss-0.redis-sentinel-master-ss.public-service.svc.cluster.local:6379

    Slave:

      redis-sentinel-slave-ss-0.redis-sentinel-slave-ss.public-service.svc.cluster.local:6379

      redis-sentinel-slave-ss-1.redis-sentinel-slave-ss.public-service.svc.cluster.local:6379

  创建Service

  1. [root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-service-master.yaml -f redis-sentinel-service-slave.yaml
  2.  
  3. [root@k8s-master01 redis-sentinel]# kubectl get service -n public-service
  4. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  5. redis-sentinel-master-ss ClusterIP None <none> /TCP 16h
  6. redis-sentinel-slave-ss ClusterIP None <none> /TCP <invalid>

5、创建StatefulSet

  1. [root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-rbac.yaml -f redis-sentinel-ss-master.yaml -f redis-sentinel-ss-slave.yaml
  1. [root@k8s-master01 redis-sentinel]# kubectl get statefulset -n public-service
  2. NAME DESIRED CURRENT AGE
  3. redis-sentinel-master-ss 16h
  4. redis-sentinel-slave-ss 16h
  5. rmq-cluster 3d
  6. [root@k8s-master01 redis-sentinel]# kubectl get pods -n public-service
  7. NAME READY STATUS RESTARTS AGE
  8. redis-sentinel-master-ss- / Running 16h
  9. redis-sentinel-slave-ss- / Running 16h
  10. redis-sentinel-slave-ss- / Running 16h

  此时相当于已经在k8s上创建了Redis的主从模式。

6、dashboard查看

  状态查看

  pods通讯测试

  master连接slave测试

  1. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-master-ss- -n public-service -- redis-cli -h redis-sentinel-slave-ss-.redis-sentinel-slave-ss.public-service.svc.cluster.local ping
  2. PONG
  3. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-master-ss- -n public-service -- redis-cli -h redis-sentinel-slave-ss-.redis-sentinel-slave-ss.public-service.svc.cluster.local ping
  4. PONG

  slave连接master测试

  1. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local ping
  2. PONG
  3. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local ping
  4. PONG

  同步状态查看

  1. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local info replication
  2. # Replication
  3. role:master
  4. connected_slaves:
  5. slave0:ip=172.168.5.94,port=,state=online,offset=,lag=
  6. slave1:ip=172.168.6.113,port=,state=online,offset=,lag=
  7. master_replid:ad4341815b25f12d4aeb390a19a8bd8452875879
  8. master_replid2:
  9. master_repl_offset:
  10. second_repl_offset:-
  11. repl_backlog_active:
  12. repl_backlog_size:
  13. repl_backlog_first_byte_offset:
  14. repl_backlog_histlen:

  同步测试

  1. # master写入数据
  2. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local set test test_data
  3. OK
  4. # master获取数据
  5. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local get test
  6. "test_data"
  7. # slave获取数据
  8. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli get test
  9. "test_data"

  从节点无法写入数据

  1. [root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli set k v
  2. (error) READONLY You can't write against a read only replica.

  NFS查看数据存储

  1. [root@nfs redis-sentinel]# tree .
  2. .
  3. ├──
  4.    └── dump.rdb
  5. ├──
  6.    └── dump.rdb
  7. └──
  8. └── dump.rdb
  9.  
  10. directories, files

  说明:个人认为在k8s上搭建Redis sentinel完全没有意义,经过测试,当master节点宕机后,sentinel选择新的节点当主节点,当原master恢复后,此时无法再次成为集群节点。因为在物理机上部署时,sentinel探测以及更改配置文件都是以IP的形式,集群复制也是以IP的形式,但是在容器中,虽然采用的StatefulSet的Headless Service来建立的主从,但是主从建立后,master、slave、sentinel记录还是解析后的IP,但是pod的IP每次重启都会改变,所有sentinel无法识别宕机后又重新启动的master节点,所以一直无法加入集群,虽然可以通过固定podIP或者使用NodePort的方式来固定,或者通过sentinel获取当前master的IP来修改配置文件,但是个人觉得也是没有必要的,sentinel实现的是高可用Redis主从,检测Redis Master的状态,进行主从切换等操作,但是在k8s中,无论是dc或者ss,都会保证pod以期望的值进行运行,再加上k8s自带的活性检测,当端口不可用或者服务不可用时会自动重启pod或者pod的中的服务,所以当在k8s中建立了Redis主从同步后,相当于已经成为了高可用状态,并且sentinel进行主从切换的时间不一定有k8s重建pod的时间快,所以个人认为在k8s上搭建sentinel没有意义。所以下面搭建sentinel的步骤无需在看。

  PS:Redis Cluster:https://github.com/dotbalo/k8s/tree/master/redis/k8s-redis-cluster

7、创建sentinel

  1. [root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-ss-sentinel.yaml -f redis-sentinel-service-sentinel.yaml
  2.  
  3. [root@k8s-master01 redis-sentinel]# kubectl get service -n public-servicve
  4. No resources found.
  5. [root@k8s-master01 redis-sentinel]# kubectl get service -n public-service
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. redis-sentinel-master-ss ClusterIP None <none> /TCP 17h
  8. redis-sentinel-sentinel-ss ClusterIP None <none> /TCP 36m
  9. redis-sentinel-slave-ss ClusterIP None <none> /TCP 1h
  10. rmq-cluster ClusterIP None <none> /TCP 3d
  11. rmq-cluster-balancer NodePort 10.107.221.85 <none> :/TCP,:/TCP 3d
  12. [root@k8s-master01 redis-sentinel]# kubectl get statefulset -n public-service
  13. NAME DESIRED CURRENT AGE
  14. redis-sentinel-master-ss 17h
  15. redis-sentinel-sentinel-ss 8m
  16. redis-sentinel-slave-ss 17h
  17. rmq-cluster 3d
  18. [root@k8s-master01 redis-sentinel]# kubectl get pods -n public-service | grep sentinel
  19. redis-sentinel-master-ss- / Running 17h
  20. redis-sentinel-sentinel-ss- / Running 2m
  21. redis-sentinel-sentinel-ss- / Running 2m
  22. redis-sentinel-sentinel-ss- / Running 2m
  23. redis-sentinel-slave-ss- / Running 17h
  24. redis-sentinel-slave-ss- / Running 17h

8、查看日志

  查看哨兵状态

  1. [root@k8s-master01 ~]# kubectl exec -ti redis-sentinel-sentinel-ss- -n public-service -- redis-cli -h 127.0.0.1 -p info Sentinel
  2. # Sentinel
  3. sentinel_masters:
  4. sentinel_tilt:
  5. sentinel_running_scripts:
  6. sentinel_scripts_queue_length:
  7. sentinel_simulate_failure_flags:
  8. master0:name=mymaster,status=ok,address=172.168.6.111:,slaves=,sentinels=

9、容灾测试

  1. # 查看当前数据
  2. [root@k8s-master01 ~]# kubectl exec -ti redis-sentinel-master-ss- -n public-service -- redis-cli -h 127.0.0.1 -p get test
  3. "test_data"

  关闭master节点

  查看状态

  1. [root@k8s-master01 ~]# kubectl get pods -n public-service
  2. NAME READY STATUS RESTARTS AGE
  3. redis-sentinel-sentinel-ss- / Running 22m
  4. redis-sentinel-sentinel-ss- / Running 22m
  5. redis-sentinel-sentinel-ss- / Running 22m
  6. redis-sentinel-slave-ss- / Running 17h
  7. redis-sentinel-slave-ss- / Running 17h

  查看sentinel状态

  1. [root@k8s-master01 redis]# kubectl exec -ti redis-sentinel-sentinel-ss- -n public-service -- redis-cli -h 127.0.0.1 -p info Sentinel
  2. # Sentinel
  3. sentinel_masters:
  4. sentinel_tilt:
  5. sentinel_running_scripts:
  6. sentinel_scripts_queue_length:
  7. sentinel_simulate_failure_flags:
  8. master0:name=mymaster,status=ok,address=172.168.6.116:,slaves=,sentinels=
  9. [root@k8s-master01 redis]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h 127.0.0.1 -p info replication
  10. # Replication
  11. role:slave
  12. master_host:172.168.6.116
  13. master_port:
  14. master_link_status:up
  15. master_last_io_seconds_ago:
  16. master_sync_in_progress:
  17. slave_repl_offset:
  18. slave_priority:
  19. slave_read_only:
  20. connected_slaves:
  21. master_replid:4097ccd725a7ffc6f3767f7c726fc883baf3d7ef
  22. master_replid2:603280e5266e0a6b0f299d2b33384c1fd8c3ee64
  23. master_repl_offset:
  24. second_repl_offset:
  25. repl_backlog_active:
  26. repl_backlog_size:
  27. repl_backlog_first_byte_offset:
  28. repl_backlog_histlen:82961

赞助作者:

  1.  

  

  1.  

kubernetes实战(五):k8s持久化安装Redis Sentinel的更多相关文章

  1. CentOS安装Redis Sentinel HA集群

    安装了很多次,但是每次安装还要翻以前的配置,故列文备忘.下文依赖于2.x版本搭建主从节点实现基于sentinel机制的简单Redis HA(相对高可用Redis集群,真正高可用还要等3.0之后版本). ...

  2. kubernetes实战(四):k8s持久化安装rabbitmq集群

    1.下载文件 https://github.com/dotbalo/k8s/ 2.创建namespace kubectl create namespace public-service 如果不使用pu ...

  3. helm安装redis+Sentinel集群搭建

    一.redis集群特点 数据 在多个Redis节点之间自动分片 sentinel特点: 它的主要功能有以下几点 不时地监控redis是否按照预期良好地运行; 如果发现某个redis节点运行出现状况,能 ...

  4. docker-compose 安装redis sentinel,共享主机网络模式

    采坑记录: docker sentinel模式安装完后因为是使用bridge模式,所以只有docker中运行的程序才能访问.刚开始尝试使用端口映射,返现sentinel返回的地址依然是docker的内 ...

  5. kubernetes实战篇之helm安装

    系列目录 Helm是kubernetes的应用包管理工具,是CNCF孵化器下的一个项目,主要用来管理 Charts.类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM.它提供了一种简单 ...

  6. 亲密接触Redis-第二天(Redis Sentinel)

    简介 经过上次轻松搭建了一个Redis的环境并用Java代码调通后,这次我们要来看看Redis的一些坑以及Redis2.8以后带来的一个新的特性即支持高可用特性功能的Sentinel(哨兵). Red ...

  7. 亲热接触Redis-第二天(Redis Sentinel)

    简单介绍 经过上次轻松搭建了一个Redis的环境并用Java代码调通后.这次我们要来看看Redis的一些坑以及Redis2.8以后带来的一个新的特性即支持高可用特性功能的Sentinel(哨兵). R ...

  8. Linux(ubuntu)安装redis集群,redis集群搭建

    今天学习一下redis集群的搭建.redis在现在是很常用的数据库,在nosql数据库中也是非常好用的,接下来我们搭建一下redis的集群. 一.准备 首先我们要安装c语言的编译环境,我们要安装red ...

  9. kubernetes实战(二十五):kubeadm 安装 高可用 k8s v1.13.x

    1.系统环境 使用kubeadm安装高可用k8s v.13.x较为简单,相比以往的版本省去了很多步骤. kubeadm安装高可用k8s v.11 和 v1.12 点我 主机信息 主机名 IP地址 说明 ...

随机推荐

  1. php将汉字转换为拼音和得到词语首字母(一)

    <?php /** * 修复二分法查找方法 * 汉字拼音首字母工具类 * 注: 英文的字串:不变返回(包括数字) eg .abc123 => abc123 * 中文字符串:返回拼音首字符 ...

  2. 转【翻译】怎样在Ubuntu 12.04上配置Apache SSL证书

    关于SSL证书 SSL证书是加密网站信息和创建一个更安全的连接的一种方式.另外,证书能够向网站訪问者展示VPS的身份信息. 证书颁发机构颁发SSL证书.用来验证server的具体信息,而一个自签名的证 ...

  3. apache Storm之一-入门学习

    准备工作 这个教程使用storm-starter项目里面的例子.我推荐你们下载这个项目的代码并且跟着教程一起做.先读一下:配置storm开发环境和新建一个strom项目这两篇文章把你的机器设置好. 一 ...

  4. Ubuntu:为 Firefox 浏览器 安装 flash 插件

    从adobe上下载浏览器flashplayer插件:推荐 x.tar.gz格式的——通用格式. 解压tar.gz后可以得到:libflashplayer.so 文件 将 libflashplayer. ...

  5. 帝国留言板管理员回复发送EMAIL通知客户

    说明:修改1:e/admin/tool/ReGook.php   /*回复表单*/ 43行处添加代码 ------------------------------------------------- ...

  6. python2.0 s12 day8 _ socketserver学习

    Socket 概念 一个socket就是一个点对点的链接.当今,大多数的通信都是基于Internet Protocl,因此大多数的网络Socket都是Internet Protocl(互联网)的通信( ...

  7. POST提交表单,本地Windows测试无乱码,而将项目部署到服务器端产生乱码原因之一

    项目在Windows机上eclipse发布至tomcat测试没有问题,表单提交到数据库的中文都能正常显示,而将项目部署到服务器上时,出现中文乱码 确认POST提交都使用了request.setChar ...

  8. complex()

    complex() 用于将一个对象转换为复数 In [1]: complex(123) # 将整数转换为复数 Out[1]: (123+0j) In [2]: complex(') # 将纯数字的字符 ...

  9. mysql的if null 的用法

    <!-- 查询 分页查询 --> <select id="queryByPageList" resultMap="weixinActivityResul ...

  10. nutch爬取时Exception in thread “main” java.io.IOException: Job failed!

    用cygwin运行nutch 1.2爬取提示IOException: $ bin/nutch crawl urls -dir crawl -depth 3 -topN 10 crawl started ...