




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于redis和docker的guestbook留言簿案例 在正式介绍之前,大家有必要先理解Kubernetes几个核心概念及其承担的功能。以下为Kubernetes的架构设计图:1. Pods在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个被创建、销毁、调度、管理的最小的部署单元。比如一个或一组容器。2. Replication ControllersReplication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller可以保证在其它主宿机启用同等数量的Pod。Replication Controller可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联。3. ServicesServices是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现,转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。如果与我们自建的平台进行整合?请关注下篇kubernetes与HECD架构的整合文章。4. LabelsLabels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。5. ProxyProxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。说说个人一点看法,目前Kubernetes 保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在GCE(Google Compute Engine)的对接优化,针对个人私有云还未推出一套可行的接入解决方案。在v0.5版本中才引用service代理转发的机制,且是通过iptables来实现,在高并发下性能令人担忧。但作者依然看好Kubernetes未来的发展,至少目前还未看到另外一个成体系、具备良好生态圈的平台,相信在V1.0时就会具备生产环境的服务支撑能力。1.Kubernetes介绍1.1 简介Kubernetes是什么?首先,它是一个全新的基于容器技术的分布式架构领先方案。其次,它是一个开放的开发平台。最后,它是一个完备的分布式系统支撑平台。Kubernetes是Google团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为Go语言。Kubernetes特点是:易学:轻量级,简单,容易理解便携:支持公有云,私有云,混合云,以及多种云平台可拓展:模块化,可插拔,支持钩子,可任意组合自修复:自动重调度,自动重启,自动复制。Kubernets目前在/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.快速安装Kubernetes2.1 关闭防火墙 systemctl disable firewalld systemctl stop firewalld2.2 安装etcd和Kubernetes vi virt7-docker-common-release.repo 1234virt7-docker-common-releasename=virt7-docker-common-releasebaseurl=/repos/virt7-docker-common-release/x86_64/os/gpgcheck=0 yum install -y etcd kubernetes (docker版本冲突请先卸载)Dependencies Resolved=Package Arch Version Repository Size=Installing:kubernetes x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7 extras 34 kInstalling for dependencies:docker x86_64 1.9.1-25.el7.centos extras 13 Mdocker-forward-journald x86_64 1.9.1-25.el7.centos extras 824 kdocker-selinux x86_64 1.9.1-25.el7.centos extras 70 kkubernetes-client x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7 extras 9.3 Mkubernetes-master x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7 extras 15 Mkubernetes-node x86_64 1.2.0-0.9.alpha1.gitb57e8bd.el7 extras 9.3 Msocat x86_64 -5.el7 base 255 kTransaction 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:-5.el7 Complete!2.3 修改配置 vim /etc/sysconfig/docker 修改为OPTIONS=-selinux-enabled=false -insecure-registry gcr.io vim /etc/kubernetes/apiserver 删除ServiceAccountKUBE_ADMISSION_CONTROL=-admission -control=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,SecurityContextDeny,ResourceQuota2.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-proxy3.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 38658844a359 7 months ago 509.6 MB docker.io/kubeguide/redis-master latest 423e126c2ad4 8 months ago 419.1 MB docker.io/kubeguide/guestbook-redis-slave latest 00206e07dd92 8 months ago 109.5 MB3.2 设置工作目录 #mkdir kube-guestbook #cd kube-guestbook3.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: - name: master image: docker.io/kubeguide/redis-master ports: - containerPort: 6379 创建redis-master Pod #kubectl create -f redis-master-controller.yaml #kubectl get pods 一开始pod在pending状态 rootCentOS7 kube-guestbook# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-7i338 0/1 ContainerCreating 0 47s 第一次启动容器时间比较久,如果没什么问题,状态会更新为Running rootCentOS7 kube-guestbook# kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-7i338 1/1 Running 0 11m #vi redis-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 servicesrootCentOS7 kube-guestbook# kubectl get services NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGEkubernetes 443/TCP 8dredis-master 6379/TCP name=redis-master 7s3.4 创建redis-slave Pod和服务#vi redis-slave-controller.yamlapiVersion: v1kind: ReplicationControllermetadata: name: redis-slave labels: name: redis-slavespec: replicas: 2 selector: name: redis-slave template: metadata: labels: name: redis-slave spec: containers: - name: slave image: docker.io/kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379创建redis-slave Pod#kubectl create -f redis-slave-controller.yaml#kubectl get rcCONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEredis-master master docker.io/kubeguide/redis-master name=redis-master 1 26mredis-slave slave docker.io/kubeguide/guestbook-redis-slave name=redis-slave 2 10s# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-7i338 1/1 Running 0 27mredis-slave-jju81 1/1 Running 0 28sredis-slave-yzzmd 1/1 Running 0 28s# vi redis-slave-service.yamlapiVersion: v1kind: Servicemetadata: name: redis-slave labels: name: redis-slavespec: ports: - port: 6379 selector: name: redis-slave创建redis-slave服务#kubectl create -f redis-slave-service.yaml#kubectl get services# kubectl get servicesNAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGEkubernetes 443/TCP 8dredis-master 6379/TCP name=redis-master 13mredis-slave 25 6379/TCP name=redis-slave 7s3.5 创建frontend Pod和服务# vi frontend-controller.yamlapiVersion: v1kind: ReplicationControllermetadata: name: frontend labels: name: frontendspec: replicas: 3 selector: name: frontend template: metadata: labels: name: frontend spec: containers: - name: php-redis image: docker.io/kubeguide/guestbook-php-frontend env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 80创建frontend Pod#kubectl create -f frontend-controller.yaml#kubectl get rcCONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGEfrontend php-redis docker.io/kubeguide/guestbook-php-frontend name=frontend 3 7sredis-master master docker.io/kubeguide/redis-master name=redis-master 1 36mredis-slave slave docker.io/kubeguide/guestbook-redis-slave name=redis-slave 2 9m# kubectl get p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年杭州拱墅区长庆潮鸣街道社区卫生服务中心招聘编外聘用人员1人模拟试卷附答案详解
- 家庭琐事记事作文8篇
- 2025河南民航发展投资集团有限公司招聘28人考前自测高频考点模拟试题附答案详解(突破训练)
- 2025河南郑州二七区一国企招聘各部门人员9人考前自测高频考点模拟试题附答案详解(完整版)
- 快乐的郊游抒情作文9篇
- 成本控制与管理流程工具箱
- 写景:美丽的公园景色(10篇)
- 业务提案与需求调研收集表标准格式
- 2025年桦甸市产业发展有限公司招聘模拟试卷及答案详解(各地真题)
- 2025贵州黔西南州教育局公益性岗位招聘4人模拟试卷及完整答案详解一套
- 单梁行车培训
- 客运公司团建活动方案
- 护理安全警示教育案例
- 窑街煤电集团酒泉天宝煤业有限公司红沙梁矿井矿产资源开发与恢复治理方案专家组审查意见
- 绿城集团职级管理制度
- 加油站装修质量管理制度
- 青少年心理健康知识教育主题班会50
- 中韩新农村建设比较:基于路径、成效与启示的深度剖析
- 汽车维修服务中心车辆维修证明书(8篇)
- 《围城》介绍课件
- 2025承包商入厂安全培训考试试题及完整答案(全优)
评论
0/150
提交评论