分类 > 正文

在kubernetes集群中创建redis主从多实例

继续使用上次实验环境 https://www.58jb.com/html/180.html ,因为环境中已经配置好flannel网络了,接下要就是慢慢在此环境中创建一些实例。因为只是搭建简单的环境是比较容易上手,随便网上一搜可能就出来了。但是要自己去从头一步一步跑起项目,还是基于真实的项目来跑的话还是需要自己多研究,当然目前还是止于使用阶段,要深入还得多看资料。

本次要记录的是自己从创建镜像到实现redis主从示例,为什么要自己制作镜像呢?其实就是为了自己可以学多点,毕竟网上的都人别人做好的,你自己没做过根本不知道制作过程中会遇到什么。为什么有些镜像大,有些镜像比较小。这都是在哪里做的优化?
本次直接使用alpine基础镜像,因为它小,加上个redis也就11M左右的镜像,如果使用centos可能就大点了,这里先不做存储的方便,只是简单的实现redis-master和redis-slave之间的自动发现。
为了自己好区分我直接制作两个镜像,一个为redis-master专门用来跑master服务的,一个为redis-slave专门跑slave实例的。其实可以只用一个,只需分两个配置文件或者是两个不同的启动方法,这里不做这个介绍。

redis-slave镜像制作

需要二个文件:Dockerfile、run.sh

Dockerfile内容如下:

FROM alpine:3.4
RUN apk add --no-cache redis sed bash
COPY run.sh /run.sh
CMD [ "/run.sh" ]
ENTRYPOINT [ "bash" ]

其实默认可以不使用redis.conf文件的,如果需要就在上面的Dockerfile文件也加入,这里目前也处于测试,先不加配置。

run.sh启动脚本,也就是一行文件。

[root@k8s-node1 slave]# cat run.sh
#/bin/sh
redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} ${REDIS_MASTER_SERVICE_PORT}

打包成镜像传到内网仓库:

docker build -t redis-slave .
docker tag redis-slave reg.docker.tb/harbor/redis-slave
docker push reg.docker.tb/harbor/redis-slave

redis-master镜像制作

跟上面的配置差不多一样,只是启动时的命令有点不而已。
Dockerfile内容如下:

FROM alpine:3.4
RUN apk add --no-cache redis sed bash
COPY run.sh /run.sh
CMD [ "/run.sh" ]
ENTRYPOINT [ "bash" ]

其实默认可以不使用redis.conf文件的,如果需要就在上面的Dockerfile文件也加入,这里目前也处于测试,先不加配置。

run.sh启动脚本,也就是一行文件。

[root@k8s-node1 master]# cat run.sh
#/bin/sh
redis-server

打包成镜像传到内网仓库:

docker build -t redis-master .
docker tag redis-master reg.docker.tb/harbor/redis-master
docker push reg.docker.tb/harbor/redis-master

创建kube的配置文件yaml

创建一个master-service.yaml 来统一Master的入口,同时会自动关联到labels为redis-master的所有Pod,这里要注意Service要优于pod启动,不然无法通过环境变量把配置信息写入到pod中。

apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
ports:
- port: 6379
targetPort: 6379
selector:
name: redis-master

redis-master.yaml 以rc的方式来创建一个master容器,它会保证容器的副本数量。

apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: reg.docker.tb/harbor/redis-master
ports:
- containerPort: 6379

redis-slave-service.yaml跟上面的Service一样,都是管理redis-slave所有容器的,此服务创建后会把所有的slave实例的容器分配一个集群IP.

apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
ports:
- port: 6379
selector:
name: redis-slave

redis-slave.yaml 同样是以RC的方式来创建redis-slave实例,这里的数量为两个。需要注意的是Image这里指定是刚才打包的镜像名。

apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
replicas: 2
selector:
name: redis-slave
template:
metadata:
labels:
name: redis-slave
spec:
containers:
- name: worker
image: reg.docker.tb/harbor/redis-slave
env:
- name: GET_HOSTS_FROM
value: env
#value: dns
ports:
- containerPort: 6379

注意:要实现master和slave服务自动发现,需要配置它们之间的对应关系。Kubernetes有两种方法就是环境变量ENV和DNS记录解析,因为我的实验环境没有使用这个DNS来解析,所以只能使用ENV环境变量。

上面的redis-slave.yaml 就是使用了env环境变量。

接下来创建实例吧:

master:
kubectl create -f redis-service.yaml
kubectl create -f redis-master.yaml slave:
kubectl create -f redis-slave-service.yaml
kubectl create -f redis-slave.yaml

查看启动的效果:

[root@k8s-master redis-pod]# kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE
po/redis-master-qpzlh 1/1 Running 0 1h 172.21.2.2 k8s-node1
po/redis-slave-2rwk5 1/1 Running 0 1h 172.21.2.3 k8s-node1
po/redis-slave-6tf2f 1/1 Running 0 1h 172.21.8.3 k8s-node2 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
rc/redis-master 1 1 1 1h master reg.docker.tb/harbor/redis-master name=redis-master
rc/redis-slave 2 2 2 1h worker reg.docker.tb/harbor/redis-slave name=redis-slave NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc/kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 3d <none>
svc/redis-master ClusterIP 10.254.152.116 <none> 6379/TCP 1h name=redis-master
svc/redis-slave ClusterIP 10.254.188.60 <none> 6379/TCP 1h name=redis-slave

简单的测试master和slave是否可以同步数据:
连接master容器,可以看到有两个Replication中有两个connected_slaves就是从实例,后面跟着的就是IP地址。

[root@k8s-master redis-pod]# kubectl exec -it redis-master-qpzlh -- /bin/bash
bash-4.3# redis-cli
127.0.0.1:6379> info
# Server
redis_version:3.2.11
redis_git_sha1:535782f7
redis_git_dirty:0
redis_build_id:80ce8a1f388ac530
redis_mode:standalone
os:Linux 4.4.113-1.el7.elrepo.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:5.3.0
process_id:5
run_id:6629f021c2e5bd972fff05c84566cc92c7e59be0
tcp_port:6379
uptime_in_seconds:7105
uptime_in_days:0 ......
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
...... # Replication
role:master
connected_slaves:2
slave0:ip=172.21.2.3,port=6379,state=online,offset=5276,lag=1
slave1:ip=172.21.8.0,port=6379,state=online,offset=5276,lag=1
master_repl_offset:5276
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5275

连接一个slave容器查看信息,可以看到Replication中role:slave为从实例,master的IP和端口等信息。

[root@k8s-master ~]# kubectl exec -it redis-slave-2rwk5 -- /bin/bash
bash-4.3# redis-cli
127.0.0.1:6379> info
# Server
redis_version:3.2.11
redis_git_sha1:535782f7
redis_git_dirty:0
redis_build_id:80ce8a1f388ac530
redis_mode:standalone
os:Linux 4.4.113-1.el7.elrepo.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:5.3.0
process_id:5
run_id:d48c42ea0a83babda663837ed5a6f9ef5a3ff9bf
tcp_port:6379
uptime_in_seconds:3957
uptime_in_days:0 ......
# Replication
role:slave
master_host:10.254.152.116
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:5542
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

此时在Master上创建一个key, 在slave上立马就可以获取到了。

master:
127.0.0.1:6379> set name swper
OK slave:
127.0.0.1:6379> get name
"swper" slave上只读:
127.0.0.1:6379> set test 1
(error) READONLY You can't write against a read only slave.

这样就实现了一主多从的效果了,集群的IP现在是外部无法访问的,kubernetes节点中可以相互连通。
其实原本是很简单的实验,我居然在传递参数的时候少了个$号导致一直获取不到

在kubernetes集群中创建redis主从多实例的更多相关文章

  1. 如何在 Kubernetes 集群中玩转 Fluid + JuiceFS

    作者简介: 吕冬冬,云知声超算平台架构师, 负责大规模分布式机器学习平台架构设计与功能研发,负责深度学习算法应用的优化与 AI 模型加速.研究领域包括高性能计算.分布式文件存储.分布式缓存等. 朱唯唯 ...

  2. 在Kubernetes集群中使用calico做网络驱动的配置方法

    参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...

  3. 初试 Kubernetes 集群中使用 Traefik 反向代理

    初试 Kubernetes 集群中使用 Traefik 反向代理 2017年11月17日 09:47:20 哎_小羊_168 阅读数:12308    版权声明:本文为博主原创文章,未经博主允许不得转 ...

  4. Kubernetes集群中Service的滚动更新

    Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...

  5. 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式

    一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...

  6. kubernetes集群中的pause容器

    昨天晚上搭建好了k8s多主集群,启动了一个nginx的pod,然而每启动一个pod就伴随这一个pause容器,考虑到之前在做kubelet的systemd unit文件时有见到: 1 2 3 4 5 ...

  7. ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...

  8. Kubernetes集群中Jmeter对公司演示的压力测试

    6分钟阅读 背景 压力测试是评估Web应用程序性能的有效方法.此外,越来越多的Web应用程序被分解为几个微服务,每个微服务的性能可能会有所不同,因为有些是计算密集型的,而有些是IO密集型的. 基于微服 ...

  9. (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试

    背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...

随机推荐

  1. EZ 2018 1 21 2018noip第五次膜你赛

    这次分数普遍偏高,而且yu'ben'ao又AK了! 但是最后一题莫名爆0让我很感伤啊(搓了1个多小时的20分暴力)! 难度偏低,主要是T2没剪枝,炸了3个点. T1 这种SB题恐怕是千年难遇了,PJ- ...

  2. Luogu P3370 【模板】字符串哈希

    方法很多,hash,双hash(个人想到一种三hash),挂链,还有STL: map 乱搞 CODE #include<iostream> #include<map> #inc ...

  3. webVR全景图多种方案实现(pannellum,aframe,Krpano,three,jquery-vrview)

    前言 有一篇文章我说了H5实现全景图预览,全景视频播放的原理,有需要的小伙伴可以自行去看一下 今天我就拿出我的实践干货出来,本人实测实测过 需求 老板:我需要可以上传全景图片,然后手机网站上都可以36 ...

  4. EditText点击出现光标但不弹出软键盘

    3.0以下版本可以用editText.setInputType(InputType.TYPE_NULL)来实现.或者设置editText.setKeyListener(null)来实现. 3.0以上版 ...

  5. centos 7部署ELK

    一.ELK介绍 Elasticsearch 是基于 JSON 的分布式搜索和分析引擎,专为实现水平扩展.高可用和管理便捷性而设计.Logstash 是动态数据收集管道,拥有可扩展的插件生态系统,能够与 ...

  6. Linux DDos防御

    今天要说的就是一款能够自动屏蔽DDOS攻击者IP的软件:DDoS deflate. DDoS deflate介绍 DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本.它通过netst ...

  7. PAT甲题题解-1078. Hashing (25)-hash散列

    二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...

  8. Linux内核分析——第二周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高 ...

  9. 将搬家至CSDN

    emmm,感觉没利用好博客,自己也弄了一个github上面的hexo博客https://clarkkun.github.io/,但是死活传不上去内容,尴尬 ̄□ ̄||,三个博客齐头并进吧

  10. 刚做了个实验,验证++和!和printf的先后次序