redis,docker和kubernetes留言簿案例实战

kubernetes实战-基于redis和docker的留言簿案例

[置顶] kubernetes实战-基于redis和docker的留言簿案例

标签: dockerkubernetesredis

2015-06-22 19:41 7570人阅读 评论(5) 收藏 举报

本文章已收录于:

 Docker知识库

 分类:

docker(7) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、介绍

本案例基于Kubernetes和Docker,其中包括

1、web前端

2、redis master

3、redis slave

其中web前端通过javascript redis api和redis master交互

kubernetes体系架构

二、配置

0、先决条件

Kubernetes 集群

1、启动redis master

使用replication controller确保只有一个pod在运行(当某个节点down了,rc会在另一个健康的node启动redis master),但可能会有数据丢失。

[[email protected] example]# kubectl create -f redis-master-controller.json

replicationcontrollers/redis-master

[[email protected] example]# kubectl get rc

CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS

redis-master master redis name=redis-master 1

验证master运行成功,如下展示了pod运行在centos2/192.168.1.112这台机器上

[[email protected] example]# kubectl get pods

POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE

redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running 55 seconds

master redis Running 55 seconds

SSH到centos2/192.168.1.112查看docker状态

[[email protected] yum.repos.d]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

91689ce56668 redis:latest "/entrypoint.sh redi 3 minutes ago Up 3 minutes k8s_master.52732b08_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_97e79b7b

38c3180813c3 gcr.io/google_containers/pause:0.8.0 "/pause" 3 minutes ago Up 3 minutes k8s_POD.49eee8c2_redis-master-svar7_default_5b6d5485-1894-11e5-b3ad-000c293c8c19_298e038f

注意:kubectl create执行后,如果镜像不存在,会执行docker pull,根据网络情况,下载中的pods 在kubertnetes UI上会显示pending状态

2、启动master service

一个kubernetes service会对一个或多个container进行负载均衡,这是通过我们上面redis-master中定义的labels元数据实现的,值得注意的是,在redis中只有一个master,但是我们依然为它创建一个service,这是因为这样我们就能使用一个elastic IP来路由到具体某一个master。

kubernetes集群中的service是通过container中的环境变量实现服务发现的,service基于pod label实现container的负载均衡。

在第一步中创建的pod包含了一个label“name=redis-master”,service的selector字段决定了service将流量转发给哪个pod,port和targetPort信息定义了service proxy运行在什么端口。

[[email protected] example]# kubectl create -f redis-master-service.json

services/redis-master

[[email protected] example]# kubectl get services

NAME LABELS SELECTOR IP(S) PORT(S)

redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP

上面的运行成功后,所有pods都能发现redis master运行在6379端口,从salve到master流量走向会有以下两步:

1、一个redis slave会连接到redis master service的port上

2、流量会从service节点上的port到targetPort

如果targetPort未指定,默认和port一致

3、启动replicated slave pod

虽然redis master是一个单独的pod,redis slaves是一个replicated pod,在Kubernetes中,一个Replication Controller负责管理一个replicated pod的多个实例,RC会自动拉起down掉的replica(可以通过杀死docker 进程方式简单测试)

[[email protected] example]# kubectl create -f redis-slave-controller.json

replicationcontrollers/redis-slave

[[email protected] example]# kubectl get rc

CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS

redis-master master redis name=redis-master 1

redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2

[[email protected] example]# kubectl get pods

POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE

redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running 41 minutes

master redis Running 41 minutes

redis-slave-31tkb 172.17.0.10 centos2/192.168.1.112 name=redis-slave Running 29 seconds

slave kubernetes/redis-slave:v2 Running 28 seconds

redis-slave-uk8nu 172.17.0.11 centos2/192.168.1.112 name=redis-slave Running 29 seconds

slave kubernetes/redis-slave:v2 Running 28 seconds

可以看到一个master pod和两个slave pod

4、启动slave service

和master一样,我们希望有一个代理服务连接到redis slave,除了服务发现之外,slave service还为web app client提供了透明代理。

这次service 的selector是name=redis-slave,我们可以方便的使用kubectl get services -l "label=value"命令来定位这些服务

[[email protected] example]# kubectl create -f redis-slave-service.json

services/redis-slave

[[email protected] example]# kubectl get services

NAME LABELS SELECTOR IP(S) PORT(S)

redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP

redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP

5、创建frontend pod

这是一个简单的PHP 服务,用来和master service(写请求)或slave service(读请求)交互

[[email protected] example]# kubectl create -f frontend-controller.json

replicationcontrollers/frontend

[[email protected] example]# kubectl get rc

CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS

frontend php-redis kubernetes/example-guestbook-php-redis:v2 name=frontend 3

redis-master master redis name=redis-master 1

redis-slave slave kubernetes/redis-slave:v2 name=redis-slave 2

运行成功后,查看当前pod运行状态

[[email protected] example]# kubectl get pods

POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE

frontend-fr5z1 172.17.0.13 centos2/192.168.1.112 name=frontend Running 2 minutes

php-redis kubernetes/example-guestbook-php-redis:v2 Running 2 minutes

frontend-gjx3t 172.17.0.14 centos2/192.168.1.112 name=frontend Running 2 minutes

php-redis kubernetes/example-guestbook-php-redis:v2 Running 2 minutes

frontend-v608r 172.17.0.12 centos2/192.168.1.112 name=frontend Running 2 minutes

php-redis kubernetes/example-guestbook-php-redis:v2 Running 2 minutes

redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running 53 minutes

master redis Running 53 minutes

redis-slave-31tkb 172.17.0.10 centos2/192.168.1.112 name=redis-slave Running 12 minutes

slave kubernetes/redis-slave:v2 Running 12 minutes

redis-slave-uk8nu 172.17.0.11 centos2/192.168.1.112 name=redis-slave Running 12 minutes

slave kubernetes/redis-slave:v2 Running 12 minutes

可以看到一个redis master,两个redis slave和三个frontend pods

6、创建guestbook service

和其他service一样,你可以创建一个service管理frontend pods

[[email protected] example]# kubectl create -f frontend-service.json

services/frontend

[[email protected] example]# kubectl get services

NAME LABELS SELECTOR IP(S) PORT(S)

frontend name=frontend name=frontend 10.254.154.111 80/TCP

redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP

redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP

我们可以通过frontend service(10.254.154.111)访问pods,但是这个IP明显是无法在外部访问的,下一节讲解如何在外部网络访问guestbook

7、外部网络访问guestbook

kubernetes 支持两种访问暴露一个服务到外部IP地址NodePorts 和LoadBalancers,https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/services.md#external-services

另外可以查看防火墙,找到service对应的端口,如下

[[email protected] example]# kubectl get pods,services

POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED MESSAGE

frontend-fr5z1 172.17.0.13 centos2/192.168.1.112 name=frontend Running 22 minutes

php-redis kubernetes/example-guestbook-php-redis:v2 Running 22 minutes

frontend-gjx3t 172.17.0.14 centos2/192.168.1.112 name=frontend Running 22 minutes

php-redis kubernetes/example-guestbook-php-redis:v2 Running 22 minutes

frontend-v608r 172.17.0.12 centos2/192.168.1.112 name=frontend Running 22 minutes

php-redis kubernetes/example-guestbook-php-redis:v2 Running 22 minutes

redis-master-svar7 172.17.0.9 centos2/192.168.1.112 name=redis-master Running About an hour

master redis Running About an hour

redis-slave-31tkb 172.17.0.10 centos2/192.168.1.112 name=redis-slave Running 32 minutes

slave kubernetes/redis-slave:v2 Running 32 minutes

redis-slave-uk8nu 172.17.0.11 centos2/192.168.1.112 name=redis-slave Running 32 minutes

slave kubernetes/redis-slave:v2 Running 32 minutes

NAME LABELS SELECTOR IP(S) PORT(S)

frontend name=frontend name=frontend 10.254.154.111 80/TCP

kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.2 443/TCP

kubernetes-ro component=apiserver,provider=kubernetes <none> 10.254.0.1 80/TCP

redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP

redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP

[[email protected] example]# kubectl get services

NAME LABELS SELECTOR IP(S) PORT(S)

frontend name=frontend name=frontend 10.254.154.111 80/TCP

kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.2 443/TCP

kubernetes-ro component=apiserver,provider=kubernetes <none> 10.254.0.1 80/TCP

redis-master name=redis-master name=redis-master 10.254.154.90 6379/TCP

redis-slave name=redis-slave name=redis-slave 10.254.159.145 6379/TCP

发现redis-master是在10.254.154.90上,登录到centos2上,执行iptables-save,发现其中有这样一条规则

-A KUBE-PORTALS-HOST -d 10.254.154.90/32 -p tcp -m comment --comment "default/redis-master:" -m tcp --dport 6379 -j DNAT --to-destination 192.168.1.112:49038

说明,centos2本机的49038端口映射到master container内的6379了,当然我们就能执行在本机访问redis了

[[email protected] yum.repos.d]# redis-cli -p 49038

127.0.0.1:49038> set a b

OK

127.0.0.1:49038> get a

"b"

8、使用curl简单测试

提交数据

curl "localhost:8000/index.php?cmd=set&key=messages&value=jay_sais_hi"

查询数据

curl "localhost:8000/index.php?cmd=get&key=messages"

附本案例用到的6个.json文件

1、redis-master-controller.json

{

"kind":"ReplicationController",

"apiVersion":"v1beta3",

"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":"redis",

"ports":[

{

"containerPort":6379

}

]

}

]

}

}

}

}

2、redis-master-service.json

{

"kind":"Service",

"apiVersion":"v1beta3",

"metadata":{

"name":"redis-master",

"labels":{

"name":"redis-master"

}

},

"spec":{

"ports": [

{

"port":6379,

"targetPort":6379

}

],

"selector":{

"name":"redis-master"

}

}

}

3、redis-slave-controller.json

{

"kind":"ReplicationController",

"apiVersion":"v1beta3",

"metadata":{

"name":"redis-slave",

"labels":{

"name":"redis-slave"

}

},

"spec":{

"replicas":2,

"selector":{

"name":"redis-slave"

},

"template":{

"metadata":{

"labels":{

"name":"redis-slave"

}

},

"spec":{

"containers":[

{

"name":"slave",

"image":"kubernetes/redis-slave:v2",

"ports":[

{

"containerPort":6379

}

]

}

]

}

}

}

}

4、redis-slave-service.json

{

"kind":"Service",

"apiVersion":"v1beta3",

"metadata":{

"name":"redis-slave",

"labels":{

"name":"redis-slave"

}

},

"spec":{

"ports": [

{

"port":6379

}

],

"selector":{

"name":"redis-slave"

}

}

}

5、frontend-controller.json

{

"kind":"ReplicationController",

"apiVersion":"v1beta3",

"metadata":{

"name":"frontend",

"labels":{

"name":"frontend"

}

},

"spec":{

"replicas":3,

"selector":{

"name":"frontend"

},

"template":{

"metadata":{

"labels":{

"name":"frontend"

}

},

"spec":{

"containers":[

{

"name":"php-redis",

"image":"kubernetes/example-guestbook-php-redis:v2",

"ports":[

{

"containerPort":80

}

]

}

]

}

}

}

}

6、frontend-service.json

{

"kind":"Service",

"apiVersion":"v1beta3",

"metadata":{

"name":"frontend",

"labels":{

"name":"frontend"

}

},

"spec":{

"ports": [

{

"port":80

}

],

"selector":{

"name":"frontend"

}

}

}

 

时间: 2024-10-01 05:01:23

redis,docker和kubernetes留言簿案例实战的相关文章

实战Docker到Kubernetes技术系列视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

基于大数据技术推荐系统算法案例实战视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

第93课:Spark Streaming updateStateByKey案例实战和内幕源码解密

本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战二.Spark Streaming updateStateByKey源码解密 第一部分: updateStateByKey的主要功能是随着时间的流逝,在Spark Streaming中可以为每一个可以通过CheckPoint来维护一份state状态,通过更新函数对该key的状态不断更新:对每一个新批次的数据(batch)而言,Spark Streaming通过使用updateStateByKey

第93讲:Spark Streaming updateStateByKey案例实战和内幕源码

本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战 二.Spark Streaming updateStateByKey源码解密 第一部分: updateStateByKey它的主要功能是随着时间的流逝,在Spark Streaming中可以为每一个key可以通过CheckPoint来维护一份state状态,通过更新函数对该key的状态不断更新:在更新的时候,对每一个新批次的数据(batch)而言,Spark Streaming通过使用upda

第85讲:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

大神教你轻松玩转Docker和Kubernetes中如何运行MongoDB微服务

本文介绍了利用Docker和Kubernetes搭建一套具有冗余备份集合的MongoDB服务,从容器对CI和CD引发的改变入手,讨论了容器技术对MongoDB带来的挑战和机会,然后实战如何部署一套稳定的MongoDB服务,非常的干货 介绍 想尝试在笔记本电脑上运行MongoDB么?希望通过执行一个简单的命令,然后就有一个轻量级.自组织的沙盒么?并可再通过一条命令就可以移除所有的痕迹么? 需要在多个环境中运行相同的应用程序栈?创建自己的容器镜像,使得开发.测试.操作和支持团队启动一份完全相同的环境

基于docker、kubernetes部署openstack到atomic系统上

声明: 本人阅读笔记,翻译类文章仅作意译.如有不对之处,请指出. 需要更本源的理解,请自行阅读英文. 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:寻觅神迹 内容系本人学习.研究和总结,如有雷同,实属荣幸! 基于docker.kubernetes部署openstack到atomic系统上 openstack的服务定义,是不是看起来很简洁? openstack的实际组件构成,是不是看起来很复杂? 所有的openstack

Power BI教程_Power BI数据分析快速上手及案例实战

Power BI数据分析快速上手及案例实战 课程学习地址:http://www.xuetuwuyou.com/course/194 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本课程在<Power BI 数据分析快速上手>基础上结合大量的实例,深入讲解PowerBI中看似难懂的各种概念.操作, 并结合行业中的典型案例贯穿了从初级的数据透视表工具.数据透视表选项.数据透视表的刷新.数据透视表中的排序,到中级的动 态数据透视表的创建.数据透视表函数 GETPI