【我的Linux,我做主!】DevOps文化及kubernetes概述

(1)DevOps文化
DevOps即运维自动化,目前在国外,互联网巨头如Google、Amazon、Facebook、LinkedIn、Netflix、Airbnb,传统软件公司如Adobe、IBM、微软、SAP等,亦或是网络业务非核心企业如苹果、沃尔玛、可口可乐、星巴克等都在采用DevOps或提供相关支持产品。那么DevOps究竟是怎样一回事呢。
DevOps一词来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps概念早先升温于2009年的欧洲,因传统模式的运维之痛而生。DevOps是为了填补开发端和运维端之间的信息鸿沟,改善团队之间的协作关系。不过需要澄清的一点是,开发到运维,中间还有测试环节。DevOps其实包含了三个部分:开发、测试和运维。换句话说,DevOps希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。
应用程序的架构在早期是单体架构,在早期应用程序是比较简单的,所以还是可以招架住,但是到后来人们发现单体应用程序难以承载越来越复杂的系统,就算可以横向扩展,但是单体应用的内部业务复杂度也会导致扩展很容易达到上限,所以单体的下一个时代就是分层架构,让应用程序各自分离开开发;再往后就是微服务,不是在简单的分层,而是把每一个应用都拆解成一个微小的服务,只干一件事,所以一个传统的3级应用程序需要拆解成数百个微型服务,让彼此之间进行协作。因此微服务天然的和容器非常契合,因为容器在分发、构建、部署起来都是非常方便的,所以把为服务和对应的容器结合起来后迅速的让它们找到了适合于落地的实现方案。包括DevOps理念也是如此,早期的DevOps技术中的交互环节和部署环节因为环境因素异构导致部署起来及其困难,因为docker技术的出现刚好弥补了这个裂缝,使得DevOps非常容易实现了。
在DevOps中有三种概念,其中第一个CI(CONTINUOUS INTEGRATION)是指持续集成,它属于开发人员的自动化流程,成功的CI意味着应用代码的更新会定期构建、测试并合并到共享存储库中,该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题;第二个CD(CONTINUOUS DELIVERY)是指持续交付,通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库,然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题,因此持续交付的目的就是确保尽可能减少部署新代码时所需的工作量;第三个CD(CONTINUOUS DEPLOYMENT)是持续部署,指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用,它主要是为了解决因手动流程降低应用交付速度,从而提高运维团队超负荷的问题,持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。
【我的Linux,我做主!】DevOps文化及kubernetes概述
由上所述,相信大家对DevOps有了一定的了解。但是除了触及工具链之外,作为文化和技术的方法论,DevOps还需要公司在组织文化上的变革。回顾软件行业的研发模式,可以发现大致有三个阶段:瀑布式开发、敏捷开发、DevOps。DevOps早在十几年前就有人提出来,但是为什么最近才开始受到越来越多的企业重视和实践呢?因为DevOps的发展是独木不成林的,现在有越来越多的技术支撑。微服务架构理念、容器技术使得DevOps的实施变得更加容易,计算能力和云环境的发展使得快速开发的产品可以立刻获得更广泛的使用。
那么DevOps的好处是什么呢?它的一个巨大的好处就是可以高效交付,这也正好是它的初衷。Puppet和DevOps Research and Assessment(DORA)主办了2016年DevOps调查报告中,根据全球4600位各IT公司的技术工作者的提交数据统计,得出高效公司可以完成平均每年1460次部署。与低效组织相比,高效组织的部署频繁200倍,产品投入使用速度快2555倍,服务恢复速度快24倍。在工作内容的时间分配上,低效者多花22%的时间用在为规划好或者重复工作上,而高效者却可以多花29%的时间用在新的工作上。所以这里的高效不仅仅指公司产出的效率提高,还指员工的工作质量得到提升。DevOps另外一个好处就是会改善公司组织文化、提高员工的参与感。员工们变得更高效,也更有满足和成就感;调查显示高效员工的雇员净推荐值更高,即对公司更加认同。
那么DevOps为什么会兴起呢?第一,首先条件成熟,技术的发展使得DevOps有了更多的配合。早期时,大家虽然意识到这个问题,但是苦于当时没有完善丰富的技术工具,是一种理想很丰满的情况。DevOps的实现可以基于新兴的容器技术;也可以在自动化运维工具Puppet、SaltStack、Ansible之后的延伸;还可以构建在传统的Cloud Foundry、OpenShift等PaaS厂商之上。第二,是来自市场的外部需求,IT行业已经越来越于市场的经济发展紧密挂钩,专家们认为IT将会由支持中心变成利润驱动中心。事实上,这个变化已经开始了,这不仅体现在Google、苹果这些大企业中,而且也发生在传统行业中,比如出租车业务中的Uber、酒店连锁行业中的Airbnb、图书经销商Amazon等。能否让公司的IT配套方案及时跟上市场需求的步伐,在今天显得至关重要。第三,对于工程师而言,他们也是DevOps的受益者。工具链的打通使得开发者们在交付软件时可以完成生产环境的构建、测试和运行,正如Amazon的CTO那句让人印象深刻的话:“谁开发谁运行。”(You build it,you run it)
(2)kubernetes概述
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡,
Kubernetes,又称为k8s或者简称为“kube”,是一种可自动实施Linux容器操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,您可以将运行Linux容器的多组主机聚集在一起,由Kubernetes帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云、私有云或混合云部署主机。因此,对于要求快速扩展的云原生应用而言(例如借助Apache Kafka进行的实时数据流处理),Kubernetes是理想的托管平台。
Kubernetes最初由Google的工程师开发和设计。Google是最早研发Linux容器技术的企业之一(组件了cgroups),曾公开分享介绍Google如何将一切都运行于容器之中(这个是Google云服务背后的技术)。Google每周会启用超过20亿个容器--全部由内部平台Borg支撑。Borg是Kubernetes的前身,多年来开发Borg的经验教训成了影响Kubernetes中许多技术的主要因素。
为什么需要Kubernetes呢?真正的生产型应用会涉及多个容器。这些容器必须跨多个服务器主机进行部署。容器安全性需要多层部署,因此可能会比较复杂。但Kubernetes有助于解决这一问题。Kubernetes可以提供所需的编排和管理功能,以便您针对这些工作负载大规模部署容器。借助Kubernetes编排功能,您可以构建多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的健康状况。有了Kubernetes,您便可切实采取一些措施来提高IT安全性。Kubernetes还需要与联网、存储、安全性、遥测和其他服务整合,以提供全面的容器基础架构。
Redhat公司目前也已经花大价钱压住在容器编排工具之上了,同时这个也体现在Kubernetes已经成为了红帽产品中的PaaS,大家知道Kubernetes属于开源技术,所以,没有正式的技术支持机构可以为您的商业业务提供支持。如果生产过程中Kubernetes出现实施问题,您一定会感到非常担心,您的客户可能也会如此。这时就是企业Kubernetes容器平台大展身手的时候了。OpenShift是企业版的Kubernetes,此外,它还具备更多功能。OpenShift引入了额外的先进技术,从而使Kubernetes成为可供企业使用的强大平台,这些技术包括:注册表、联网、遥测、安全性、自动化和服务。借助OpenShift的可扩展性以及控制和编排功能,您的开发人员可以构建新的容器化应用、对其进行托管并在云端加以部署,从而轻松快速地将各种奇思妙想转变为新业务。这些都是由开源领域的领导者红帽所开发,并提供全面支持的。
Kubernetes的代码托管在GitHub之上,官方站点为https://github.com/kubernetes ,我们可以看到目前K8S版本的迭代速度。同时亚马逊的AWS、微软的Azure、阿里云等大型云厂商也已经宣布原生支持K8S。
【我的Linux,我做主!】DevOps文化及kubernetes概述
(3)Kubernetes的特性
Kubernetes的主要特性主要体现在,第一它能够实现自动装箱,基于资源依赖以及其他约束能够自动完成容器的部署而且不影响其可用性。第二是能够实现自我修复,一旦一个容器崩溃了,可以在一秒中启动,把缺失的服务kill掉重新起一个就可以了,所以有了Kubernetes容器编排平台以后,我们更多关注的是群体,而不再是个体了。第三是能自动实现水平扩展,一个容器不够可以再起一个,不断的进行向上扩展,只要物理平台的资源是足够的,它还能够实现自动的服务发现和负载均衡,同时还能够实现自动的发布和回滚。第四个是可以支持密钥的配置和管理,我们如果启动了一个容器后,希望换一种配置来运行,我们定义一个ENTRYPOINT脚本,这个脚本能够接受用户传递给容器一些变量,把这些变量的值转换为容器内的应用程序可读取的配置信息,从而完成容器化应用配置,这是因为早期的应用程序不是面向云原生而开发的,所以那些应用程序需要读取配置文件来获取配置,而云原生开发的最好能基于环境变量获取配置,如果我们使用容器编排平台让容器启动自动化了,但每一次启动还要手工传环境变量的值这是一个很麻烦的事,所以我们需要一个外部的组件保存这些配置信息于外部,当镜像启动为容器时,我们只需要让镜像加载配置中心当中的配置信息就可以完成配置。第五个是Kubernetes还能实现存储编排,让存储卷实现动态供给,也就意味着某一个容器需要用到存储卷时根据容器自身的需求创建能够满足它的需要的存储卷,从而实现存储编排。第六个是能够实现任务的批处理运行。
(4)Kubernetes的架构
Kubernetes其实就是一个集群,要组合多台主机的资源整合成一个大的资源池统一对外提供计算、存储等能力的集群。我们在许多台主机上都安装上Kubernetes的相关应用程序,并通过应用程序协同工作,把多个主机当一台主机来使用。但是在Kubernetes当中集群是分角色的,我们知道模型通常分为两种,一种是P2P的,例如redis没有中心节点,每一个节点本身都能够直接接受服务请求,能路由请求的这种模型,第二种是由中心节点的集群,例如MySQL的主从复制,有一个节点是主节点,其他的都和它进行同步,那么K8S就是一个有中心节点架构的集群系统,即master/nodes模型,master主节点一般不需要太多,一般能够做冗余有3个就足够了,而nodes我们称之为worker,就类似于蜂王和工蜂的概念。客户端的请求先发送给Master,Master中会有一个调度器去分析各node现有的可用资源状态,找一个最佳适配运行用户所请求的容器的节点,并把它调度上去,由这个node本地的容器引擎负责把docker启动起来,这个node负责启动容器时先检查是否本地是否有镜像,如果没有需要到Registry将镜像拖下来,当然我们也可以建私有Registry,而且Registry自己也可以是一个容器,我们可以把私有Registry托管在Kubernetes自身之上。
【我的Linux,我做主!】DevOps文化及kubernetes概述
在Kubernetes上第一个组件名为API Server,可以负责接收请求、解析请求、处理请求。第二个组件为,如果用户的请求时创建一个容器,那么这个容器不应该运行在Master之上,而应该运行在Node之上,那么哪一个Node更合用,这个应该是由Master之上的组件scheduler调度器来决定,它负责去观测每一个Node上的总共计算资源,并根据用户所请求容器所需创建的资源量的下限来评估哪一个Node节点最合适。我们不能根据容器中的应用程序运行与否判断容器的健康与否,我们可以根据额外定义的可用性探测机制来探测服务的可用性,如果一旦容器中的应用挂了,我们又需要容器始终是运行的,在Node之上有一个应用程序,第三个就是kubelet,这个应用程序就是确保容器始终处于运行状态的。Kubernetes还运行了很多控制器的应用程序,负责去监控所管理的每一个容器是否是健康的,一旦发现容器是不健康的,控制器就向Master的API Server发请求,然后由scheduler调度从其他节点挑一个合适的并重新起一个容器。用于监控容器健康的控制器不健康了,那么容器的健康也就无法得到保证了,所以在Master之上还有第四个组件控制器管理器(Controller-Manager),由控制器管理器负责监控每一个控制器是否健康的,如果控制器不健康了,由控制器管理器确保它是健康的,而控制器管理器(Controller-Manager)则是通过冗余来保证其自身的可用性。所以从这个角度说Master是集群的大脑,它有如上的几个核心组件。
在K8S之上运行的最小单元不在是容器,Pod是K8S之上调度的最小的逻辑单元。在Pod内可以运行容器,一个Pod内包含多个容器,众多容器共享同一个UTS、Network、IPC三个名称空间,而另外三个User、Mount、PID三个名称空间是互相隔离的。而且同一个Pod内的各容器还共享第二种资源即存储卷,存储卷不在属于容器,存储卷是属于Pod的。一般来说同一个Pod只包含一个容器,除非容器之间有非常紧密的关系需要放在同一个Pod中。如果一个Pod中需要放多个容器,通常有一个容器是主容器,其他容器是辅助主容器中的应用程序完成更多功能而存在的,例如主容器中运行Nginx,会生成很多日志,这时候就可以在辅助的容器(边车)中运行ELK等日志收集程序。所以调度器调度的是一个Pod,Node运行的也是一个Pod,而Pod是一个原子单元。
【我的Linux,我做主!】DevOps文化及kubernetes概述
理论上说Node可以是任何形式的计算设备,只要能够有传统意义上的CPU、内存等,并且能装上Kubernetes的集群代理程序,都可以作为Kubernetes的一个份子来进行工作。例如下图,所有的node节点作为一个整体看作为一个大的计算池使用,有x个CPU和y容量的内存,由Kube_Cluster来统一管理的,Master就拥有这样一个统一的视图,当用户请求在Master创建资源时,我们可以做一个统一资源池的调度和评估,这样一来终端用户就无需再关心我们的资源是运行在哪个节点上了,所以就实现了云计算。
【我的Linux,我做主!】DevOps文化及kubernetes概述
如果将来我们想分类管理某一类Pod,我们应该怎么挑选出来某一类统一功能的Pod呢,为了能够做Pod识别,我们需要在Pod之上附加一些元数据,即key-value类型的标签,在创建完Pod的时候可以给Pod打上标签,让人可以基于标签的值来识别出Pod来,例如我们创建4个Nginx的Pod,我们给每个Pod加一个标签叫App,然后它的值是nginx,这样以后我们根据键和值信息就可以把一类的Pod分拣出来了,所以这个筛选的机制我们是靠一个组件标签选择器(Label Selector)来实现的。

—————— 本文至此结束,感谢阅读 ——————

猜你喜欢

转载自blog.51cto.com/13613726/2620258
今日推荐