为什么使用k8s和容器作为devops的底层平台

 

提到DevOps这个词,我相信很多人一定不会陌生。作为一个热门的概念,DevOps近年来频频出现在各大技术社区和媒体的文章中,备受行业大咖的追捧,也吸引了很多企业的关注。那么,DevOps是什么呢?

DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。

上面的图比较抽象,我们再来看下面的图,可以看到devops的整个流程。

从目标来看,DevOps就是让开发人员和运维人员更好地沟通合作,通过自动化流程来使得软件整体过程更加快捷和可靠。

我们知道程序可以在物理机器直接运行,也可以在虚拟机中运行,那么我们为什么要使用容器作为devops的底层平台呢。

首先我们要知道devops里面有个概念叫敏捷开发,其实简单来说,就是把大项目变成小项目,把大时间点变成小时间点。这里就要讲到微服务,他是把一个大项目拆分成多个小项目,多个小项目的更改测试部署可以同时进行,大大提交了软件交付的质量和效率,方法就是拆分。

这个时候如果有数百个数千个项目,那么如果平台是直接部署在物理机器上的那么,会有下面的问题。

第一个问题,那么多项目肯定是部署在很多个服务器上,那么怎么去管理这么多服务器,服务挂了怎么办,管理成本是不是随着规模扩大直线上升。

第二个问题,代码的运行是基于环境的,java8写的代码在java7中可能无法运行,如果保证所有机器的环境一致性呢,通过人工管理?很显然容易出错不靠谱。

第三,我可能需要各个项目之间的权限隔离,a项目的人员不能看到b项目的资源,那么一个项目一台服务器?很显然不现实,即使一个项目一台服务器还会有其它的问题。我觉得一个机器不够用了要再加N台,需要多少时间?

既然直接在物理机上不行那么还有虚拟化,可能有人要问我听说虚拟机和容器都是虚拟化技术,那么为什么要用容器呢,我们先看一张图。

可见容器是直接运行在物理机器上的,只是使用了宿主机的内核,而虚拟机在物理机的基础上虚拟了整个操作系统。首先程序跑在虚拟化的系统中计算性能会大打折扣,其次虚拟机的启动时间和容器也不是一个级别,虚拟机的管理也没有容器方便。

说了那么多这个也不行哪个也不行,为什么用容器就行了,它就能解决问题吗。

回答上面问题前我们先看下什么是docker容器。

Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上(包括流行的Linux机器、windows机器),也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

如图所示,docker利用了 namespaces和cgroups技术实现了容器之间的权限和资源隔离。

Namespaces隔离了容器进程之间的用户视图,即A看不到B,B也看不到A。

Cgroups限制了容器所使用的硬件资源,例如只让A使用宿主机的30%的CPU资源。

好了现在权限问题解决了,那么如何保证同项目的所有容器开发->生产环境的一致性呢。下面我们再了解一下容器的另外一个概念镜像。

Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

如果所示容器的运行是基于镜像的只要开发环境和正式环境用了同一份镜像,那么环境一致性就解决了so easy。

到这里权限和环境一致性的问题都解决了看来docker容器很强大,是不是用了docker所有问题都解决了,答案是NO。

我们还有一个管理问题,当成千上万的容器在运行的时候,我们怎么去管理他们的启动停止端口映射等其它问题呢,如果通过手工是不是太耗时了,是的所以我们需要另外一个强大的工具 k8s 即大名鼎鼎的 kubernetes,我们来了解一下。

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

 

在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

Kubernetes的主要特征

1、自动化

   kubernetes有一套自动化机制。可以降低整个集群的运维成本和运维难度。

   通过K8s我们可以实现自动扩容、自动更新、自动部署、自动化管理资源等等。

2、以服务为中心

   kubernetes以服务为中心,可以让我们抛开系统环境和运行细节,有更多精力去处理逻辑业务。

   构建在kubernetes上的系统,可以独立运行在物理机、虚拟机、私有云以及公有云。

3、高可用

   kubernetes会定期进行检查应用实例,这包括对这些实例的数量检查,实例健康状态检查等等。

   kubernetes如果发现有新的应用实例启动,会自动加入负载均衡中。

   kubernetes如果发现有应用实例状态不可用。kubernetes会自动干掉这个问题实例,并重新调度一个新实例。

4、滚动更新

   kubernetes可以使整个集群平滑升级(rolling-update)。就是说,kubernetes可以在不停止对外服务的前提下完成应用的更新。在规模比较大的集群中,kubernetes这一特性会非常实用。

基于这些特性k8s+docker容器就成了大部分企业选择的devops底层工具。

原文地址:https://www.cnblogs.com/ligang0357/p/15058145.html