当前位置: 首页 > 科技观察

微服务、容器、DevOps的三角恋看得清吗-

时间:2023-03-15 01:39:52 科技观察

你能看清微服务、容器和DevOps的三角恋吗?容器的流行带来了微服务架构和DevOps的快速发展。1微服务的缺点1.1测试和发布的工作量急剧增加。单个应用拆分成多个微服务后,虽然可以实现快速的开发迭代,但会为测试和运维部署带来更大的成本。很多业务在早期都是一个大型的单体web应用。在测试和运维时,只需要将Web应用打包成WAR包部署到Tomcat即可。然后要把这些服务打包,测试,上线,测试这些服务接口的功能。最后,多个系统发布上线,测试和运维工作量急剧增加。这时候就需要有一种方法来减轻测试和运维的负担。上一讲我给出的解决方案是DevOps。DevOps可以理解为开发和运维的结合。服务开发人员不再只负责服务代码开发,还要负责服务测试、上线发布,甚至故障处理的全生命周期流程。微服务拆分带来的复杂工作得到解放。DevOps需要开发、测试和发布过程的自动化。这就需要开发者将本地部署测试通过的代码和运行环境复制到测试环境,测试通过后再复制到线上环境发布。虽然看起来是抄代码,但实际上,本地环境、测试环境、线上环境往往是隔离的,软件配置环境差异很大,导致开发、测试、发布流程分离。1.2机器初始化复杂度急剧增加由于不同微服务在弹性伸缩时所需要的软件运行环境存在差异,导致机器初始化复杂度增加。拆分后的微服务比原来的单体应用更加灵活,往往需要根据实际访问量进行在线伸缩,通常使用创建在公有云上的ECS进行伸缩。这给运维带来了挑战,因为在公有云上创建的ECS通常只包含基础OS环境,而微服务运行所依赖的软件配置需要运维单独初始化,因为微服务的软件配置依赖不同的微服务是不一样的,比如Java服务。依赖JDK需要在ECS上安装JDK,不同的微服务JDK版本可能不同。服务部署的初始化非常繁琐。2幸好有你:容器容器技术解决了本地、测试、线上环境的隔离,解决了部署服务初始化繁琐的问题。集装箱,即Containers,可译为集装箱,货物在港口用集装箱装箱,然后由货轮通过海运运输到另一个港口,在港口卸货后,再由大卡车运往目的地。这样,货物在任何地方流通时都可以用集装箱包装,而不需要根据货物是在货轮上还是在大卡车上重新组装。软件容器就是这样一个功能,它封装了软件的运行环境。容器本质上是Linux中的一个进程,但是容器可以拥有自己的根文件系统、网络配置、进程空间,甚至可以通过Namespace和Cgroups拥有自己的用户ID空间,所以容器中的进程就像运行在其上的另一个进程主机。在单独的操作系统中,它与主机操作系统中运行的其他进程隔离。Docker是基于Linux内核的Cgroups和Namespace对进程的封装和隔离。容器虽然解决了应用的运行时隔离问题,但是如果应用可以从一台机器迁移到另一台机器仍然正常运行,就需要保证另一台机器上的OS是一致的,并且应用依赖于各种环境也必须一致。Docker镜像解决了这个痛点。也就是说,Docker镜像不仅可以打包应用本身,还可以打包应用的所有依赖,甚至是整个OS。这样,运行在本地机器上的应用程序就可以使用Docker镜像将应用程序文件、所有依赖软件和os打包成一个镜像,可以在任何安装了Docker的地方运行。Docker镜像解决了DevOps中微服务运行环境难以在本地环境、测试环境、线上环境保持一致的问题。这样开发就可以将本地环境运行测试的代码,以及依赖的软件和操作系统本身打包成一个镜像,然后自动部署到测试环境进行测试,然后自动测试通过后发布到线上环境上去,打通开发、测试、发布全流程。无论是使用内部物理机还是公有云机器来部署服务,都可以使用Docker镜像来封装微服务运行环境,从而屏蔽内部物理机和公有云机器运行环境的差异,做到一视同仁,降低运维的复杂度。3微服务容器化实践Docker解决了服务运行环境迁移的问题,因为在使用Docker镜像时,不是直接将业务代码、依赖的软件环境、os打包成镜像,而是利用Docker镜像的分层机制编写Dockerfile将镜像打包一层一层。因为虽然不同的微服务依赖的软件环境不同,但是它们还是一样的。因此,在打包Docker镜像时,可以分层设计,逐层复用,以减少每层镜像文件的大小。4业务案例查看如何在生产环境中使用Docker映像。Docker镜像分为四层。基础环境层定义了操作系统的版本、时区、语言、yum源、TERM等。运行环境层定义了业务代码的运行环境,如Java代码运行环境JDK的版本。Web容器层定义了业务代码运行所在容器的配置,比如Tomcat容器的JVM参数。业务代码层定义了业务代码的实际版本,比如V4业务或者blossom业务。这样每一层镜像都会在上层的基础上添加新的内容,比如DockerfileFROMregistry.intra.xxx.com/xxx_rd_content/tomcat_feed:jdk8.0.40_tomcat7.0.81_g1_dnsADDconfs/data1/confs/ADDnode_pool/data1/node_pool/ADDauthconfs/data1/authconfsforV4业务/ADDauthkey.properties/data1/ADDwatchman.properties/data1/ADD200.sh/data1/xxx/bin/200.shADD503.sh/data1/xxx/bin/503.shADDcatalina.sh/data1/xxx/bin/catalina.shADDserver.xml/data1/xxx/conf/server.xmlADDlogging.properties/data1/xxx/conf/logging.propertiesADDROOT/data1/xxx/webapps/ROOT/RUNchmod+x/data1/xxx/bin/200.sh/data1/xxx/bin/503.sh/data1/xxx/bin/catalina.shWORKDIR/data1/xxx/binFROM表示上层镜像文件为tomcat_feed:jdk8.0.40_tomcat7.0.81_g1_dns”,其中显示这一层包括Java运行环境JDK和Web容器Tomcat,Tomcat版本,JVM参数等ADD,即本层要添加到镜像中的文件,主要包括业务代码和配置RUN,本层镜像启动时需要执行的命令WORKDIR,本层镜像启动后的工作目录。这样可以利用Dockerfile完成本层镜像的生产,基于上层镜像的迁移难度,提高了运维的自动化水平,也为DevOps理念的普及和推广提供了基础。业务上云。当然,Docker也会带来新的问题。比如,旧的物理机运维模型无法适应,需要容器新的运维模型。