公众号
关注微信公众号
移动端
创头条企服版APP

【时速云线上分享】第十期:谈谈 Pod 在微服务中的运用

5501
时速云 2016-06-20 10:14 抢发第一评

本文主要包括Pod的基本概念、使用场景,以及如何在时速云平台上进行Pod的编排部署,希望对大家在进行微服务架构实践时有所帮助。

 

1.    我们先来看一下Pod的基本特性

 

Pod Kubernetes为部署、管理、编排容器化应用提出的概念,也是Kubernetes中的最小部署单元,直译过来的意思是豆荚,既简单又实用。


Pod1.png

 

Pod是由一组紧耦合的容器组成的容器组,当然目前最流行的就是Docker容器,Pod就可以作为1或者多个Docker 容器的载体,当然也支持CoreOS rkt,并很容易扩展支持更多容器技术。

 

Pod中的所用容器会被一致调度、同节点部署,并且在一个共享环境中运行。这里的共享环境包括以下几点:

 

1)所有容器共享一个IP地址和端口空间,意味着容器之间可以通过localhost高效访问,不能有端口冲突

 

2)允许容器之间共享存储卷,通过文件系统交互信息

 

3)容器之间可以通过IPCinter-process communication)进行通信(目前这个feature还没有实现,主要依赖于Docker对容器之间进程通信的支持,在Docker社区有issue track

 

所以,如果按照每个Docker容器一个process的建议,Pod则是支持多个关系紧密进程很好的方式,更像是一个容器化的虚拟机。

 

Pod也提供探针功能,对容器服务进行健康检查,目前有两种方式:

 

1LivenessProbe,用来检测服务是否正常运行,如果定义的规则失败了,系统就会杀掉这个容器,默认情况下自动创建一个新的容器。

pod2.png

比如一个容器服务对外提供Restful Service,服务可能会在某些情况下hang或者响应时间变长,我们就可以定义一个URL作为health check,一旦这个URL没有正常响应,就认为需要重启服务,这时候就可以使用 LivenessProbe

 

2ReadinessProbe,用来标识容器是否准备好提供正常服务,如果没有启动完成检测失败,系统会将该服务节点从服务代理的列表中删除,用户的请求就不会路由到该节点了。Pod定义和LivenessProbe类似:pod3.png

Pod的生命周期管理中,还提供了在容器启动后(postStart) 和容器停止前(preStop)两个handler,方便我们在这两个事件上添加自定义的hook操作。

 

 

比如我们可以定义在容器创建后,先执行一条命令把自己的应用复制到tomcatwebapps下,那么直到这个hook操作完成,才会进行容器启动等后续操作。

pod4.png

2. 接下来,我们看看Pod有哪些主要的应用场景

Pod可以用来承载垂直化的集成应用,比如LAMP,但是Pod的主要目的还是支持需要一起部署、一起管理的辅助进程,包括:

 

1)内容管理系统,文件和数据加载进程,本地cache管理进程等

 

2)日志压缩、rotation、备份、快照等

 

3)数据变化监听、日志和监控适配器,事件分发等

 

4)控制、管理、配置、升级程序

 

 

如果希望了解更多相关解释,推荐一篇关于这种容器组的设计模式的文章,也是微服务架构中很重要的思想:

http://blog.kubernetes.io/2015/06/the-distributed-system-toolkit-patterns.html

 

下面我们来看几个实际的使用场景:

 

1)业务服务需要收集日志

pod5.png

某服务模块已经实现了一些核心的业务逻辑,并且稳定运行了一段时间,日志记录在了某个目录下,按照不同级别分别为 error.logwarning.loginfo.log,现在希望收集这些日志并发送到统一的日志处理服务器上。

 

 

这时我们可以修改原来的服务模块,在其中添加日志收集、发送的服务,但这样可能会影响原来服务的配置、部署方式,从而带来不必要的问题和成本,也会增加业务逻辑和基础服务的藕合度。

 

如果使用Pod的方式,通过简单的编排,既可以保持原有服务逻辑、部署方式不变,又可以增加新的日志收集服务。

 

而且如果我们对所有服务的日志生成有一个统一的标准,或者仅对日志收集服务稍加修改,就可以将日志收集服务和其他服务进行Pod编排,提供统一、标准的日志收集方式。

 

这里的核心业务服务日志收集服务分别是一个Docker镜像,运行在隔离的容器环境中。

2)提供sshftp访问容器数据的能力

Docker Hub或者很多第三方的镜像并没有安装sshd的服务,不方便我们进入容器进行配置、代码的修改、调试,很多时候需要重新构建镜像、或者在镜像基础上安装sshd的服务,这都需要时间和一定的学习成本。

 

而通过Pod的方式,我们就可以将现有镜像和一个sshftp镜像进行编排,获得操作容器内数据的能力。pod6.png 

3)代码自动更新

我们部署了一个node.js的应用,而且部署了几十、上百个节点,那么我希望这个应用可以定时的同步最新的代码,以便自动升级线上环境。

 

这时,我们当然也不希望改动原来的node.js 应用,可以开发一个Git代码仓库的自动同步服务,然后通过Pod的方式进行编排,并共享代码目录,就可以达到更新node.js应用代码的效果。

 

并且这个同步服务还可以同其他使用Git代码仓库的服务编排,实现同样的需求。

pod7.png

4)适配不同IaaS平台的环境

我们开发了一个节点管理的agent,这个agent需要读取当前部署环境的一些信息,可以通过底层平台的API实现。

 

但是,当部署到AWS、阿里云、青云等不同平台时,API就无法统一了。这样,我们可以实现不同平台的适配服务来获取各自的信息,并且和agent通过Pod编排部署,在不改变agent逻辑的情况下,通过服务组合来适配于不同平台。pod8.png

其实,Kubernetes 的一些新的功能需求,也会建议先通过Pod的编排来解决,而不是直接修改Kubernetes的代码,可见Pod还是用处多多的。

 

3. 最后,我们一起看看如何在时速云平台上进行Pod的编排

1)登录到时速云公有云平台,通过右侧的导航,选择服务编排 -> 公有编排,其中分为Pod编排Stack编排两类,点击Pod 编排可以看到官方示例ubuntu-mysql,这个模版会将ubuntumysql两个容器编排在一个Pod中。

 

 

2)点击部署,可以预览yaml格式的编排文件:

pod9.png

其中关键是存储卷的配置,我们需要提前创建这个存储卷,并修改yaml中的 disk 属性,以匹配自己的存储卷。

 

如果我们需要修改存储卷名称,或者对其他镜像进行编排,可以复制这个模版,创建自己的Pod编排。注意:目前只有北京2区、杭州区支持存储卷功能,所以请在这两个区创建存储和部署Pod

 

 

创建成功后,可以在容器服务的列表中看到一个多容器服务pod10.png

点击查看所有服务地址,可以看到对应的mysqlubuntu的访问地址。

 

 

pod11.png

通过ssh 登陆到22端口对应的服务地址,就可以直接访问到mysql的数据了。

pod12.png

并且存储卷中的数据会保存在独立的分布式存储系统中,保证数据的安全和高可用。

详细信息可以参考官方文档:

http://doc.tenxcloud.com/doc/v1/stack/index.html

 

所以,我们可以在很多实际的部署场景中充分发挥Pod的这些特性,将服务进行更细力度的拆分,通过编排增强服务模块,这样既可以减少重复的开发工作,降低服务的藕合度,也可以使我们的系统更轻量、更灵活。

 

Q&A

 

1.问:关于“提供sshftp访问容器数据的能力”, pod中包含一个业务container和一个ssh服务container,时速云的控制台可以进入到容器内部。那么ssh进入的container只是提供ssh服务的container,好像也没办法ssh到业务container

答:业务应用Containerssh服务container共享数据存储,可以通过ssh访问共享存储,这样也避免了修改“业务应用”中的不可变运行环境。(参考“不可变基础设施”)pod6.png

 

2. 问:podswarm的最大区别是什么?我感觉差不多,是不是Pod更偏上层一些?

答:两者没有可比性。Pod只是一种容器的部署、管理方式,是kubernetes的最小部署和管理单元,是一组容器的集合;swarm是容器编排工具,和kubernetes属于同一类。

 

3. 问:一个pod最好包含几个容器?启动pod的配置文件里面能不能定义容器的大小?

答:Pod里面多少个容器理论上没有特别的限制,目前我们一般是2-3个。Pod里面定义的容器,基本上就是对Docker容器的定义。Pod中支持Docker容器本身的绝大部分参数,比如cpumemory、是否privilege、是否root等。PodDocker容器基本参数有所删减,但从更高的层面进行了扩展。具体可以查看kubernetes文档。

 

4. 问:Pod中定义容器时包括pause

答:每个Pod都会附带一个pause容器,pause容器不执行实际的业务逻辑,只是对pod的网络、IO等进行控制。

 

5. 问:时速云对docker hub上的镜像部署,也能提供ssh到容器内部的功能么?我的理解是,“打开web控制台”是ssh到容器里。

答:嗯,web控制台和ssh并不一样。如果你使用scpsftp传送文件,则需要容器内安装sshd服务。

 

6. 问:Pod没用过,不过用过docker compose 它们俩有什么区别?

答:compose不支持紧耦合的容器组,也不支持容器共享存储。

7. 问:能定义容器(磁盘)的大小吗?如果有的话,在哪儿修改?

答:docker daemon的参数包含磁盘的定义,指定devicemapperoption来改变默认大小。

                                                                                

 

 


您也可以关注我们的官方微信公众号(ID:ctoutiao),给您更多好看的内容。

声明:本文由时速云企业号发布,依据企业号用户协议,该企业号为文章的真实性和准确性负责。创头条作为品牌传播平台,只为传播效果负责,在文章不存在违反法律规定的情况下,不继续承担甄别文章内容和观点的义务。
您阅读这篇文章花了0
转发这篇文章只需要1秒钟
喜欢这篇 0
评论一下 0
相关文章
评论
试试以这些内容开始评论吧
登录后发表评论
阿里云创新中心
×
#热门搜索#
精选双创服务
历史搜索 清空

Tel:18514777506

关注微信公众号

创头条企服版APP