基于redis和docker的guestbook留言簿案例_redis应用案例
基于redis和docker的guestbook留言簿案例由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“redis应用案例”。
基于redis和docker的guestbook留言簿案例
在正式介绍之前,大家有必要先理解Kubernetes几个核心概念及其承担的功能。以下为Kubernetes的架构设计图:
1.Pods 在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个被创建、销毁、调度、管理的最小的部署单元。比如一个或一组容器。2.Replication Controllers Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller可以保证在其它主宿机启用同等数量的Pod。Replication Controller可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联。3.Services Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现,转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。如果与我们自建的平台进行整合?请关注下篇《kubernetes与HECD架构的整合》文章。4.Labels Labels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。5.Proxy Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。说说个人一点看法,目前Kubernetes 保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在GCE(Google Compute Engine)的对接优化,针对个人私有云还未推出一套可行的接入解决方案。在v0.5版本中才引用service代理转发的机制,且是通过iptables来实现,在高并发下性能令人担忧。但作者依然看好Kubernetes未来的发展,至少目前还未看到另外一个成体系、具备良好生态圈的平台,相信在V1.0时就会具备生产环境的服务支撑能力。
1.Kubernetes介绍 1.1 简介
Kubernetes是什么?
首先,它是一个全新的基于容器技术的分布式架构领先方案。其次,它是一个开放的开发平台。
最后,它是一个完备的分布式系统支撑平台。
Kubernetes是Google团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为Go语言。Kubernetes特点是:
•易学:轻量级,简单,容易理解
•便携:支持公有云,私有云,混合云,以及多种云平台 •可拓展:模块化,可插拔,支持钩子,可任意组合 •自修复:自动重调度,自动重启,自动复制。Kubernets目前在https://github.com/kubernetes/kubernetes进行维护。1.2 基本概念
•Node(节点):在Kubernetes中,节点是实际工作的点,较早版本称为Minion。节点可以是虚拟机或者物理机器,依赖于一个集群环境。每个节点都有一些必要的服务以运行Pod容器组,并且它们都可以通过主节点来管理。在Node上运行的服务进程包括docker daemon,Kubelet和 Kube-Proxy。
•Pod(容器组):是Kubernetes的基本操作单元,把相关的一个或多个容器构成一个Pod,通常Pod里的容器运行相同的应用。Pod包含的容器运行在同一个节点上,看作一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。
•Pod的生命周期:Pod的生命周期是通过Replication Controller来管理的。在整个过程中,Pod处于4种状态之一:Pending, Running, Succeeded, Failed。•Replication Controller(RC):用于定义Pod副本的数量。确保任何时候Kubernetes集群中有指定数量的Pod副本在运行,如果少于指定数量的Pod副本,Replication Controller会启动新的Pod,反之会杀死多余的以保证数量不变。
•Service(服务):一个Service可以看作一组提供相同服务的Pod的对外访问接口。
•Volume(存储卷):Volume是Pod中能够被多个容器访问的共享目录。•Label(标签):用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、Replication Controller可以有多个label,但是每个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。
•Proxy(代理):是为了解决外部网络能够访问跨机器集群中容器提供的应用服务而设计的。Proxy提供TCP/UDP sockets的proxy,每创建一种Service,Proxy主要从etcd获取Services和Endpoints的配置信息,或者也可以从file获取,然后根据配置信息在Minion上启动一个Proxy的进程并监听相应的服务端口,当外部请求发生时,Proxy会根据Load Balancer将请求分发到后端正确的容器处理。
•Namespace(命名空间):通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上的不同分组,便于在共享使用整个集群的资源同时还能分别管理。•Annotation(注解):与Label类似,但Label定义的是对象的元数据,而Annotation则是用户任意定义的“附加”信息。1.3 组件
1.3.1 Master运行三个组件:
•apiserver:作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
•scheduler:负责集群的资源调度,为新建的Pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。•controller-manager:负责执行各种控制器,目前有两类:(1)endpoint-controller:定期关联service和Pod(关联信息由endpoint对象维护),保证service到Pod的映射总是最新的。
(2)replication-controller:定期关联replicationController和Pod,保证replicationController定义的复制数量与实际运行Pod的数量总是一致的。1.3.2 Worker运行两个组件:
•kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的Pod,并根据Pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报Pod的运行状态。
•proxy:负责为Pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户Pod要访问其他Pod时,访问请求会经过本机proxy做转发。2.快速安装Kubernetes
2.1 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld 2.2 安装etcd和Kubernetes
vi virt7-docker-common-release.repo
[virt7-docker-common-release] 1 name=virt7-docker-common-release 2 baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_3 64/os/ 4 gpgcheck=0
yum install-y etcdkubernetes(docker版本冲突请先卸载)Dependencies Resolved ==== Package
Arch
Version
Repository Size ==== Installing: kubernetes
x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7
extras
k Installing for dependencies: docker
x86_64 1.9.1-25.el7.centos
extrasM docker-forward-journald x86_64 1.9.1-25.el7.centos
extras 824 k docker-selinux
x86_64 1.9.1-25.el7.centos
extras
k kubernetes-client
x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7
extras 9.3 M kubernetes-master
x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7
extrasM kubernetes-node
x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7
extras 9.3 M socat
x86_64 1.7.2.2-5.el7
base
255 k Transaction Summary ==== Install 1 Package(+7 Dependent packages)Installed: kubernetes.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7
Dependency Installed: docker.x86_64 0:1.9.1-25.el7.centos
docker-forward-journald.x86_64 0:1.9.1-25.el7.centos
docker-selinux.x86_64 0:1.9.1-25.el7.centos
kubernetes-client.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7
kubernetes-master.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7
kubernetes-node.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7
socat.x86_64 0:1.7.2.2-5.el7
Complete!2.3 修改配置
vim /etc/sysconfig/docker
修改为OPTIONS='--selinux-enabled=false--insecure-registry gcr.io'
vim /etc/kubernetes/apiserver
删除ServiceAccount
KUBE_ADMISSION_CONTROL=“--admiion
-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,SecurityContextDeny,ResourceQuota” 2.4 启动服务
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy 3.Guestbook部署
•redis-master: 用于前端Web应用进行“写”留言的操作,其中已经保存了一条内容为“Hello World!”的留言。
•guestbook-redis-slave: 用于前端Web应用进行“读”留言的操作,并与redis-master的数据保持同步。•guestbook-php-frontend: PHP Web服务,在网页上展示留言内容,也提供一个文本输入框供访客添加留言。
3.1 下载镜像
#docker pull kubeguide/redis-master
#docker pull kubeguide/guestbook-redis-slave
#docker pull kubeguide/guestbook-php-frontend REPOSITORY
TAG
IMAGE ID
CREATED
VIRTUAL SIZE
docker.io/kubeguide/guestbook-php-frontend latest
38658844a359months ago
509.6 MB
docker.io/kubeguide/redis-master
latest
423e126c2ad4months ago
419.1 MB
docker.io/kubeguide/guestbook-redis-slave
00206e07dd92months ago MB
3.2 设置工作目录
#mkdirkube-guestbook
#cd kube-guestbook
3.3 创建redis-master Pod和服务
#vi redis-master-controller.yaml
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:
containerPort: 6379
创建redis-master Pod
#kubectl create-f redis-master-controller.yaml
#kubectl get pods
一开始pod在pending状态
[root@CentOS7 kube-guestbook]# kubectl get pods
NAME
READY STATUS
RESTARTS AGE
redis-master-7i338 0/1
ContainerCreating 0
47s
第一次启动容器时间比较久,如果没什么问题,状态会更新为Running
[root@CentOS7 kube-guestbook]# kubectl get pods
NAME
READY STATUS RESTARTS AGE
redis-master-7i338 1/1
Running 0
11m
#viredis-master-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
ports:
# the port that this service should serve on
-port: 6379
targetPort: 6379
selector:
name: redis-master
创建redis-master服务
#kubectl create-f redis-master-service.yaml #kubectl get services
[root@CentOS7 kube-guestbook]# kubectl get services NAME
CLUSTER_IP EXTERNAL_IP PORT(S)SELECTOR
AGE kubernetes 10.254.0.1
443/TCP
8d redis-master 10.254.137.9
6379/TCP name=redis-master 7s
3.4 创建redis-slave Pod和服务
#viredis-slave-controller.yaml
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: GET_HOSTS_FROM
value: env
ports:
port: 6379 selector:
name: redis-slave 创建redis-slave服务
#kubectl create-f redis-slave-service.yaml #kubectl get services
# kubectl get services
NAME
CLUSTER_IP EXTERNAL_IP)SELECTOR
AGE
kubernetes 10.254.0.1
P
8d
redis-master 10.254.137.9
name=redis-master 13m
redis-slave 10.254.181.125
name=redis-slave 7s
3.5 创建frontend Pod和服务
PORT(S443/TC6379/TCP6379/TCP # vi frontend-controller.yaml
apiVersion: v1 kind: ReplicationController metadata: name: frontend labels:
name: frontend spec: replicas: 3 selector:
name: frontend template:
metadata:
labels:
name: frontend
spec:
containers:
name: GET_HOSTS_FROM
value: env
ports:
port: 80
nodePort:30001
selector:
name: frontend 创建frontend服务
#kubectl create-f frontend-service.yaml #kubectl get services
NAME
CLUSTER_IP
EXTERNAL_IP PORT(S)ELECTOR
AGE frontend
10.254.131.102 nodes
80/TCP me=frontend
19s kubernetes 10.254.0.1
443/TCP none>
8d redis-master 10.254.137.9
6379/TCP =redis-master 30m redis-slave 10.254.181.125
6379/TCP =redis-slave 17m
3.6通过浏览器访问网页
访问主机30001端口,我们看到网页已经默认有一条Hello World!
S na
kubectl stop rcredis-master
kubectl stop rcredis-slave
kubectl stop rc frontend
kubectl delete service redis-master
kubectl delete service redis-slave
kubectl delete service frontend
3.8 其他
kubectl get node 获取节点
kubectl describe node xxx 详细信息
留言簿系统一、系统概述本系统是一个简单的留言簿系统,可以用于发表留言、查看已发表留言、管理留言等功能,具有以下特点:1、无需FSO、无需数据库支持,高速运行;2、具有强大的分......
班长士勇一脸凝重地写下“沉船”二字,似乎大有深意又让人摸不着头脑,这位采贝诗人因“老鼠迪克和猫在鲜红的地毯上举行婚礼”之句声誉鹊起;河南博爱县人朱友强独与天地精神相往......
面包是到处都有的。对于我们的眼睛,不是缺少面包,而是缺少发现。--毕业时老师对学生这样说毕业时节雨纷纷,毕业生们欲断魂。试问前途何处有,学生遥指中关村。--计算机系 其实世......
虎狼声声啸,人生任逍遥。--生物系人类没有新闻,发展怎有希望?--新闻系不当自然进住者,争当建设者。--建工系国外的世界很精彩,国外的世界也很无奈。--外语系商海一声笑,滔滔两岸潮......
刀豆文库小编为你整合推荐4篇redis的性能报告,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
