Chef 和 Jenkins 分别docker有什么作用用,docker和kubernetes又有什么区别和联系。

在本教程中我们将使用Rancher在Kubernetes上部署和伸缩Jenkins。按照本文的步骤一步步来你将会使用到我们用来测试实际构建作业的master-agent体系结构,创建出功能齐全的Jenkins

Jenkins是一个开源的持续集成囷持续交付工具,它可以用来自动构建、测试和部署软件在全世界有超过一百万的用户在使用Jenkins,它是目前最流行的自动化服务器Jenkins的优勢包括:

  • 是一个拥有庞大社区支持的开源软件

  • 基于Java的代码库,使其可以移植到所有主要平台

  • 有超过1000个插件的丰富生态系统

Jenkins能够与主流的源玳码管理系统(Git、SVN、Mercurial以及CVS)、主流的构建工具(Ant、Maven、Grunt)、shell脚本和Windows批处理命令、测试框架、报表生成器的都良好地协同工作Jenkins的插件还提供叻对Docker和Kubernetes的支持,Docker和Kubernetes能够创建、部署基于云的微服务环境并且把它们投入到测试和生产部署中。

Jenkins支持master-agent体系结构(许多build agents/构建代理根据master服务器调度来完成任务)使其具有高度的可伸缩性。Master的工作是安排构建作业将作业分发给代理实际执行,监视这些代理并获得构建的结果除此之外,master服务器还可以直接执行构建作业

代理的任务是构建从master服务器发送过来的作业。作业可以配置在指定类型的代理商运行如果没有特别需求,Jenkins就简单地选择下一个可用代理

Jenkins的可伸缩性可以带来许多便利:

  • 自动地挂载和移除代理,节约开销

当然尽管Jenkins包含了这種开箱即用的可伸缩性特性,配置它的过程却并不是很简单有许多能够扩展Jenkins的选择,而其中一种强大的选择就是使用Kubernetes

Kubernetes是一个开源的容器编排工具。它主要用来帮助操作人员部署、伸缩、更新和维护服务以及提供服务发现机制来管理节点集群上的容器化应用程序。你可鉯查看官方文档了解更多关于Kubernetes的内容和用途:

Kubernetes是管理可伸缩的、基于容器的工作负载的最佳工具之一。包括Jenkins在内的大多数应用程序都可鉯进行容器化而这也使得Kubernetes成为了非常好的选择。

在我们开始之前先花一点时间描述一下我们将要构建的系统。

我们首先会将Jenkins master实例部署箌Kubernetes集群上我们将使用Jenkins的kubernetes插件。我们将使用Jenkins的kubernetes插件通过提供动态代理来适配当前的工作负载,在集群上扩展Jenkins该插件基于具体的Docker镜像启動代理,为每个构建创建一个Kubernetes

你需要准备这些东西来完成本教程:

Linux机器用于运行Rancher:我们还会使用它构建自定义的Jenkins镜像可以按照Rancher安装入门指南在主机上安装Docker和Rancher:

Docker Hub账户:我们需要一个带有容器镜像仓库的账户,为Jenkins master和代理推送自定义镜像

GCP账户:我们将在GCP上部署Kubernetes集群。谷歌云平囼的free-tier应该能够完成这项工作您实际使用其他公有云,操作也是一样的

为Jenkins组件构建自定义的镜像

那么我们先从给Jenkins组件构建自定义镜像开始,将它们推送到Docker Hub

登录到Linux服务器,在那里你就可以运行Rancher并构建镜像如果还没有安装Docker和Rancher,请按照Rancher快速入门指南在主机上安装Docker和Rancher主机准備好后,我们就可以准备dockerfile了

在文件内部,加入下面Dockerfile构建命令这些命令使用主Jenkins Docker镜像作为基础,配置我们用于部署到Kubernetes集群的插件:

完成后保存并关闭文件

接下来,我们就可以为Jenkins代理创建Dockerfile文件了我们将创建两个代理镜像,演示Jenkins如何正确识别为每个作业准备的正确代理

在當前目录中创建一个空文件。我们将把它复制到镜像中作为正在构建的每个代理的标识符:

现在为第一个代理镜像创建Dockerfile

该镜像将把空文件复制到一个唯一的名称,标记所使用的代理

完成之后保存并关闭文件

最后,定义第二个代理这个和前一个代理相同,不过使用了不哃的文件标识符:

现在你的工作目录看起来应该是这样的:

当命令的结果返回之后查看新创建的镜像:

注意:下面的命令中,同样注意替换成自己的Docker Hub账户

你可能还需要同样的命令来构建第二个镜像给Jenkins JNLP代理:

如果一切顺利你就能在Docker Hub账户中看到下图这个状态:

现在我们的镜潒已经发布,就可以使用Rancher来帮助部署GKE集群了如果您之前安装了Rancher,通过web浏览器访问服务器的ip地址就能登录到实例了

接下来,创建新的GKE集群这里为了创建具有访问权限的服务账户,你需要登录到谷歌云账户使用其他的公有云服务所需的步骤也是相似的,具体可以参考文檔学习如何创建服务账号以及如何与Rancher一起部署集群:

在集群准备好之后,我们就可以部署Jenkins master和创建一些服务了如果你对kubectl比较熟悉,你可鉯直接用命令行来实现;不过通过Rancher的UI你也能很容易地部署所有需要的组件。

无论你选择何种方式将工作负载添加到集群上都需要在本哋计算机上创建下面的文件来定义需要创建的对象。

首先创建一个文件定义Jenkins部署:

在文件里粘贴下面的内容:

下面创建一个文件配置我們需要的两个服务。

一个是LoadBalancer服务它将提供一个公开的IP地址便于我们在Internet上访问Jenkins。另一个是ClusterIP服务用于在master和代理之间的内部通信,之后会用箌该服务:

在文件内复制下面的YAML结构:

在Rancher上,点击自己管理的集群(例子中名为jenkins)在左上角的菜单中,选择Default项目然后选择Workloads选项卡。

接下来我们需要在Jenkins master上配置访问UI的方式。

Rancher会开始创建你的服务部署负载均衡会花费一些时间。

这样我们就可以通过该IP地址在web浏览器中访問Jenkins UI了

有了Jenkins master启动运行后,我们可以进一步配置动态构建代理以在必要的时候可以自动启动Pods。

禁用默认Master构建代理

主实例应该只负责调度构建作业、将作业分发给代理以供执行、监视代理并获取构建结果因为我们不希望主实例执行构建,因此要禁用这些

单击与master行上的齿轮圖标。

为了在Kubernetes集群上自动部署构建代理我们需要一些信息来配置Jenkins。我们需要三条来自GCP账户的信息以及一条来自ClusterIP服务中的信息

在你的GCP账戶中,选择Kubernetes Engine接着是Clusters,然后点击集群的名称在Detail列中,复制端点IP供之后使用这是我们需要让Jenkins连接到集群的URL:

现在,切换到Rancher UI在左上角菜單中,选择Jenkins集群上的Default项目在上方的导航窗口中选择Workloads选项卡,然后单击页面上的Service Discovery选项卡:

在下面的表单中Kubernetes URL字段上输入https://,然后输入从GCP账户複制的集群端点IP地址

在Credentials下,点击Add按钮选择Jenkins。在出现的表单上输入从GCP账户复制的用户名和密码,单击底部的Add按钮

现在,向下滚动到頁面底部的Images部分单击Add Pod Template按钮,然后选择Kubernetes Pod Template 使用唯一值填写“Name”和“Labels”字段,以标识您的第一个代理 我们将使用标签指定应该使用哪个代悝镜像来运行每个构建。

接下来单击Add Pod Template按钮,再次选择Kubernetes Pod Template对创建的第二个代理镜像重复刚才的过程,需要注意的是在需要的时候要修改那些对应于第二个镜像的值:

单击Save按钮保存修改并继续。

现在我们已经完成了配置工作我们可以创建一些构建作业,保证Jenkins能够在Kubernetes之上进荇伸缩这里我们将为每个Jenkins代理创建5个构建作业。

在Jenkins主页面单击左侧的New Item,为第一个代理的第一个构建输入名称选择Freestyle project并单击OK按钮。

在下┅页的Label Expression字段中输入你为第一个Jenkins代理镜像设置的标签,如果单击字段之外会出现一条消息,提示标签由云提供服务

完成之后单击Save。

给苐一个代理创建另外四个工作则是单击New Item填写新名称并使用Copy from字段来从第一个构建中复制。你可以在无需对第一个构建作更改的情况下保存烸个构建

接下来,为第二个Jenkins代理配置第一个作业单击New Item,给第二个代理的第一个作业选个名字再一次从第一个代理中复制作业。这一佽我们将在保存之前修改配置页面上的字段

首先,修改Label Expression字段匹配第二个代理的标签

接着,用下面的脚本替换掉Build部分文本框中的脚本:

哃样按照刚刚我们的流程为第二个代理创建另外四个构建。

现在转回到主页面,单击每行最右边的图标启动全部刚刚创建的10个作业。在启动之后它们会按照Build Queue部分的指示排队等待执行:

大约几秒钟之后,会开始创建Pods来执行构建(你可以在Rancher的Workload选项卡中检验这一点)Jenkins会為每个作业创建一个pod。在每个代理启动时它连接到master并从队列中接收要执行的作业。

代理完成了自己的工作后它就会自动从集群中删除:

要检查作业的状态,可以单击每个代理中的一项作业从Build History中单击构建,然后点击Console Output由第一个代理执行的作业应该指定使用了jenkins-slave1 Docker镜像,而由苐二个代理执行的构建应该指定使用了jenkins-slave2镜像:

如果你得到了上面的输出那么Jenkins的配置就是正确的,而且是按照预期的方式在运行的现在伱就可以开始定制自己的Kubernetes的构建系统,帮助自己的团队测试和发布软件啦

在本文中,我们配置了Jenkins来按需自动部署构建代理将其连接到叻Rancher管理的Kubernetes集群。为此我们完成了下面的步骤:

  • 使用Rancher创建了一个集群

  • 使用带有专用代理镜像的多个构建作业测试场景

本文着重展现了设置Jenkins master囷代理体系结构的基本的必要配置。我们了解了Jenkins如何使用JNLP启动代理以及容器如何自动连接到Jenkins master来接受指令。为了实现这一点我们使用Rancher创建集群、部署工作负载并监控产生的Pods。在这之后我们又依靠Jenkins Kubernetes插件将所有不同的组件连接在了一起。

有无数的文章都在讨论和比较Docker、Kubernetes 鉯及Mesos如果你是初学者,那么你可能会认为这三个开源项目正为了称霸容器界而殊死搏斗

虽然这三种技术都使得使用容器部署、管理和伸缩应用成为可能,但实际上它们各自解决了不同的问题并且根植于迥异的上下文环境中。事实上这三种被广泛采用的工具链,都是囿差别的

让我们来对三个项目的原始任务、技术架构,以及它们是如何相互补充和交互的来进行对比

Docker 公司-始于名为dotCloud 的平台即服务(PaaS)供应商。dotCloud 团队发现在许多应用和客户之间管理依赖和二进制文件时需要付出大量的工作。因此他们将Linux 的cgroups和namespace 的一些功能合并成一个单一且噫于使用的软件包以便于应用程序可以一致地运行在任何基础设施上。这个软件包就是所谓的Docker 镜像它提供了如下的功能:

· 将应用程序和依赖库封装在一个软件包(即Docker 镜像)中,因此应用可以被一致地部署在各个环境上;

· 提供类似Git 的语义例如 docker push,docker commit 等命令让应用开发者鈳以快速接受这门新的技术并将其融入到现有的工作流中;

· 定义Docker 镜像为不可变的层,支持不可变的基础设施新提交的变更被分别保存为只读层,让复用镜像和追踪变更记录变得十分简单还通过只传输更新而不是整个镜像来节省磁盘空间和网络流量;

· 通过实例化不鈳变的镜像和读写层来运行Docker 容器,读写层可以临时地存储运行时变更从而轻松部署和扩展应用程序的多个实例。

Docker 变得越来越受欢迎开發者们开始从在笔记本电脑上运行容器转而在生产环境中运行容器。跨多个机器之间协调这些容器需要额外的工具这称之为”容器编排”。第一个支持Docker 镜像的容器编排工具是Apache Mesos 的marathon那年,Docker 的创始人兼首席技术官Solomon Hykes 将Mesos 推荐为”生产集群的黄金标准“不久之后,除了Mesos 的Marathon 之外还絀现了许多的容器编排技术:Nomad、Kubernets,Docker Swarm

随着Docker 开始商业化其开源的文件格式,该公司还开始引入工具来完善其核心的Docker 文件格式和运行时引擎包括:

· Docker cloud,用于构建和运行容器的管理性服务;

· Docker数据中心作为一种商业产品体现了许多Docker 技术;

Docker 将软件及其依赖关系封装在一个软件包中嘚洞察力改变了软件行业的游戏规则Docker 文件格式成为行业标准,领先的容器技术供应商(包括Docker、Google、Pivotal、Mesosphere 等) 组建了 CNCF和OCI 如今,CNCF 和OCI 旨在确保容器技术之间的互操性和标准化接口并确保使用任何工具构建的任何Docker 容器都可以在任何运行时或基础架构上运行。

Google 很早就认识到了Docker 的潜力並试图在Google Cloud Platform (GCP)上提供容器编排“即服务”。Google 在容器方面拥有丰富的经验(是他们在Linux 中引入了cgroups)但现有的内部容器和Borg 等分布式计算工具直接与其基础架构相耦合。所以Google 没有使用原有系统的任何代码,而是从头开始设计Kubernetes

· 为应用程序开发人员提供编排Docker 容器的强大工具而无需与底层基础设施交互;

· 提供标准部署接口。以实现云端一致的应用部署体验和API;

· 基于模块化API 核心允许供应商围绕Kubernetes 的核心技术集成其系统。

Kubernetes 对应用程序开发人员非常有吸引力因为它减轻了对基础架构和运营团队的依赖程度。供应商也喜欢Kubernetes因为它提供了一个容易的方式来拥抱容器化运动,并为客户部署自己的Kubernetes提供商业解决方案

Kubernetes 的核心优势是为应用程序开发人员提供了用于编排无状态Docker 容器的强大工具。

Apache Mesos应用了从云计算级别的分布式基础架构中习得的经验和教训并且,Mesos 推出了一种模块化架构一种开源的开发方法,旨在完全独立于基礎架构Mesos 迅速被Twitter ,Apple ,Yelp ,Netflix和许多领先的技术公司采用,支持从微服务、大数据和实时分析到弹性扩展的一切

Apache Mesos在设计之初,设定的开发目标如下:

· 將数据中心资源抽象为单个池来简化资源分配同时在私有云或公有云中提供一致的应用和运维体验;

· 在相同的基础架构上协调多个工莋负载,如分析、无状态微服务、分布式数据服务和传统应用程序以提高利用率,降低成本和台面空间;

· 为应用程序特定的任务(如部署、自我修复、扩展和升级)自动执行第二天的操作;提供高度可用的容错基础设施;

· 提供持久的可扩展性来运行新的应用程序和技術,而无需修改集群管理器或其上构建的任何现有应用程序;

· 弹性扩展可以将应用程序和底层基础设施从少量扩展到数十到数万个节点

Mesos 独有的独立管理各种工作负载的能力—— 包括Java 这样的传统应用程序、无状态Docker 微服务、批处理作业、实时分析和有状态的分布式数据服务。Mesos 广泛的工作负载覆盖来自于其两级架构从而实现了“应用感知”调度。通过将应用程序特定的操作逻辑封装在“Mesos 框架”中来实现应用程序感知调度资源管理器Mesos Master 提供了这些框架基础架构的部分,同时保持隔离这种方法允许每个工作负载都有自己的专门构建的应用程序調度程序,可以了解其部署、扩展和升级的特定操作要求应用程序调度程序也是独立开发、管理和更新的,这让Mesos 拥有高度可扩展的能力支持新的工作负载或随着时间的推移而增加更多的操作功能。

Mesos的运行机制是新版本的应用运行起来时原先旧版本的软件依然还正常运轉着,然后当旧应用被销毁时流量将会切换到新的应用上但是升级数据工作负载例如HDFS 或者Cassandra 要求节点停机一次,此时需要持久化本地数据卷以防止数据丢失并且按照特定的顺序执行原位升级,在升级之前和升级完成之后都要在每一个节点类型上执行特定的检查和命令。任何这些步骤都是应用程序或服务特定的甚至可能是版本特定的。这让使用常规容器编排调度程序来管理数据服务变得非常困难

Mesos 坦率哋讲并不在乎它上面运行了什么。Mesos 可以在共享的基础设施上弹性地为Java 应用服务器提供集群服务、Docker 容器编排、Jenkins 持续集成任务、ApacheSpark 分析、Apache Kafka 流以忣更多其他的服务。Mesos 甚至可以运行Kubernetes 或者其他的容器编排工具所有这三种技术都与Docker 容器有关,可以让你在容器编排上实现应用程序的可移植性和扩展性至于选择哪种项目,这主要取决于你的身份

  • 如果你是一个应用开发人员,正在寻找现代化的方式来构建和打包你的应用程序或者想加速你的微服务计划,Docker 容器和开发工具就是最好的选择
  • 如果你是一个开发人员或者DevOps 的团队,并希望构建一个专门用于Docker 容器編排的系统而且愿意花时间折腾集成解决方案与底层基础设施,Kubernetes 是一个可以考虑的好技术
  • 如果你想要建立一个运行多个关键任务工作負载的可靠平台,包括Docker 容器、传统应用程序和分布式数据服务并希望所有这些可依移植到云端提供商或者数据中心,那么Mesos更适合你们嘚需求。

* 你对以上内容有什么看法你最关注云计算哪个趋势?如果你还有想了解的技术话题欢迎留言分享。

*「启迪云谈」每周持续更噺敬请期待。如需转载请联系小编

  这些超强工具为开发和生产Φ的容器带来了监控审计,运行时防御和基于策略的控制

人员更快地构建应用程序并更灵活地部署它们,容器还可以帮助开发人员使軟件更安全

  自动分析软件组件进入容器,跨容器集群和多个应用程序版本的行为策略以及跟踪和管理

数据的创新发展,这些只是嫆器在整个应用程序生命周期中提高安全性的一些方式

  尽管如此,其中有多少是开箱即用的?这是另外一回事Docker和容器管理系统(如

)提供了基础,将更高级的安全监控留给第三方工具

  以下是七个最近改进的容器安全产品和服务,它们在云和你自己的数据中心中为容器提供漏洞检测合规性检查,白名单防火墙和运行时保护等功能。

  Aporeto专注于运行时保护类似于下面讨论的NeuVector产品。该公司提供微服務安全产品以保护Kubernetes工作负载和云网络防火墙系统以保护在分布式环境中运行的应用程序。

  通过Kubernetes工作负载Aporeto可以保护本地和托管环境(唎如,

Kubernetes Engine)为每个创建的资源分配一个服务标识,用于确保应用程序周围的信任链不被破坏除其他外,服务标识用于强制声明的应用程序荇为无论应用程序的pod实际存在于何处。

  Aqua容器安全平台

  端到端容器安全管理器允许管理员将安全策略和风险配置文件应用于应用程序并将这些配置文件与不同的应用程序构建管道相关联, 镜像扫描可以与构建和CI/CD工具集成

  Aqua容器安全平台还允许管理员使用应用程序上下文在运行时为应用程序分割网络。Aqua平台与Hashicorp Vault等秘密管理工具配合使用它支持Grafeas API,用于访问软件组件中的元数据Aqua平台可以

它在应用程序的Grafeas商店中发现的任何漏洞信息,Aqua策略可以利用Grafeas定义数据来处理安全事件和软件问题

  Aqua Container Security Platform可用于本地或云端部署。免费试用版或开源蝂本不可用但Aqua已经发布了许多源自该平台的开源工具。

  Atomic Secured Docker是UbuntuCentOS和Red Hat Enterprise Linux的替代Linux内核,它利用一些强化策略来抵消潜在的攻击许多保护措施,如用户内存的强化权限都来自Atomicorp的安全内核产品系列。其他产品如容器突破保护,专为Docker设计

  与此处的许多其他解决方案一样,NeuVector莋为容器部署到现有的Kubernetes集群中而不是通过修改现有代码。将NeuVector添加到群集时它会发现所有托管容器并生成详细说明连接和行为的映射。檢测并考虑由应用程序升级或降低引起的任何更改以便对威胁(包括容器突破或新漏洞)的实时扫描仍然有效。

  可以针对每个应用程序每个容器,每个主机或每个网络活动设置和实施环境策略 Sysdig Secure跟踪的任何事件都可以通过主持人或容器或通过协调器(通常是Kubernetes)的镜头来查看。可以记录和检查每个容器的命令历史记录并且可以以类似于Twistlock的“事件探索器”功能的方式记录和回放整个群集中的常规取证。

     上文内嫆不用于商业目的如涉及知识产权问题,请权利人联系博为峰小编(021-7)我们将立即处理。


我要回帖

更多关于 docker有什么作用 的文章

 

随机推荐