谈谈Pod在微服务中的运用

本文整理自【时速云线上微信群分享】第十期html

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

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

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

alt 文本

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

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

1)全部容器共享一个IP地址和端口空间,意味着容器之间能够经过localhost高效访问,不能有端口冲突docker

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

3)容器之间能够经过IPC(inter-process communication)进行通讯(目前这个feature尚未实现,主要依赖于Docker对容器之间进程通讯的支持,在Docker社区有issue track)
因此,若是按照每一个Docker容器一个process的建议,Pod则是支持多个关系紧密进程很好的方式,更像是一个容器化的虚拟机。设计模式

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

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

alt 文本

好比一个容器服务对外提供Restful Service,服务可能会在某些状况下hang或者响应时间变长,咱们就能够定义一个URL做为health check,一旦这个URL没有正常响应,就认为须要重启服务,这时候就可使用 LivenessProbe。安全

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

alt 文本

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

好比咱们能够定义在容器建立后,先执行一条命令把本身的应用复制到tomcat的webapps下,那么直到这个hook操做完成,才会进行容器启动等后续操做。

alt 文本

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

Pod能够用来承载垂直化的集成应用,好比LAMP,可是Pod的主要目的仍是支持须要一块儿部署、一块儿管理的辅助进程,包括:

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

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

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

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

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

http://blog.kubernetes.io/201...

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

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

alt 文本

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

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

若是使用Pod的方式,经过简单的编排,既能够保持原有服务逻辑、部署方式不变,又能够增长新的日志收集服务。

并且若是咱们对全部服务的日志生成有一个统一的标准,或者仅对日志收集服务稍加修改,就能够将日志收集服务和其余服务进行Pod编排,提供统1、标准的日志收集方式。

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

2)提供ssh、ftp访问容器数据的能力

Docker Hub或者不少第三方的镜像并无安装sshd的服务,不方便咱们进入容器进行配置、代码的修改、调试,不少时候须要从新构建镜像、或者在镜像基础上安装sshd的服务,这都须要时间和必定的学习成本。

而经过Pod的方式,咱们就能够将现有镜像和一个ssh、ftp镜像进行编排,得到操做容器内数据的能力。

alt 文本

3)代码自动更新

咱们部署了一个node.js的应用,并且部署了几10、上百个节点,那么我但愿这个应用能够定时的同步最新的代码,以便自动升级线上环境。

这时,咱们固然也不但愿改动原来的node.js 应用,能够开发一个Git代码仓库的自动同步服务,而后经过Pod的方式进行编排,并共享代码目录,就能够达到更新node.js应用代码的效果。

而且这个同步服务还能够同其余使用Git代码仓库的服务编排,实现一样的需求。

alt 文本

4)适配不一样IaaS平台的环境

咱们开发了一个节点管理的agent,这个agent须要读取当前部署环境的一些信息,能够经过底层平台的API实现。

可是,当部署到AWS、阿里云、青云等不一样平台时,API就没法统一了。这样,咱们能够实现不一样平台的适配服务来获取各自的信息,而且和agent经过Pod编排部署,在不改变agent逻辑的状况下,经过服务组合来适配于不一样平台。

alt 文本

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

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

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

2)点击“部署”,能够预览yaml格式的编排文件:

alt 文本

alt 文本

其中关键是存储卷的配置,咱们须要提早建立这个存储卷,并修改yaml中的 disk 属性,以匹配本身的存储卷。

若是咱们须要修改存储卷名称,或者对其余镜像进行编排,能够复制这个模版,建立本身的Pod编排。注意:目前只有北京2区、杭州区支持存储卷功能,因此请在这两个区建立存储和部署Pod。

建立成功后,能够在容器服务的列表中看到一个“多容器服务”:

alt 文本

点击“查看全部服务地址”,能够看到对应的mysql和ubuntu的访问地址。

经过ssh 登录到22端口对应的服务地址,就能够直接访问到mysql的数据了。

alt 文本

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

详细信息能够参考官方文档:

http://doc.tenxcloud.com/doc/...

因此,咱们能够在不少实际的部署场景中充分发挥Pod的这些特性,将服务进行更细力度的拆分,经过编排加强服务模块,这样既能够减小重复的开发工做,下降服务的藕合度,也可使咱们的系统更轻量、更灵活。

Q&A

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

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

alt 文本

2.问:pod和swarm的最大区别是什么?我感受差很少,是否是Pod更偏上层一些?

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

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

答:Pod里面多少个容器理论上没有特别的限制,目前咱们通常是2-3个。Pod里面定义的容器,基本上就是对Docker容器的定义。Pod中支持Docker容器自己的绝大部分参数,好比cpu、memory、是否privilege、是否root等。Pod对Docker容器基本参数有所删减,但从更高的层面进行了扩展。具体能够查看kubernetes文档。

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

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

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

答:嗯,web控制台和ssh并不同。若是你使用scp、sftp传送文件,则须要容器内安装sshd服务。

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

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

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

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

相关文章
相关标签/搜索