这是我的一篇客座文章Devops World |必威国际有限公司詹金斯世界演讲者曼迪哈伯德
Devops World |必威国际有限公司詹金斯世界2018年

我们构建和部署软件的方式终于发生了重大变化。在构建、测试和部署单片应用程序的那台挑剔的、主要的构建机器上工作的日子已经屈指可数了。这是一件“好事”-这是我们如何实现业务转型目标的结果。现代应用程序由分布式服务组成,通常包含独立于其他服务开发和部署的多个微服务。然而,用它们自己的依赖关系和时间表构建这些服务的唯一方法是从一开始就进行持续集成和交付。和往常一样,你的Jenkins平台是你必威国际有限公司的朋友。

但是,让我们花点时间在微服务的环境中思考一下,特别是如果您仅将Jenkins用于单片应用程序。您将创建更多的Jenkins作业,每个作业每天运行多次。这是一个重大的流程更改,认识到这一点并更改我们的方法非常重要管理Je必威国际有限公司nkins以适应这些变化,这是Jenkins的能力范围内的事情,但您需要有一点不同的想法,并投资来弥补这些最后一英里部署差距。

我的詹金斯环境的演变必威国际有限公司

作为一名DevOps实践者,我面临的最大挑战之一是管理Jenkins代理基础设施的一组漫长而不断发展的选项。必威国际有限公司只有几个大的工作,你真的不需要太担心你的代理人。但是,当您为数十个甚至数百个服务编排CI/CD管道时,优化效率和最小化成本就变得非常重要。这段经历让我多年来思考和测试了许多不同的Jenkins构建代理架构。必威国际有限公司这段旅程你们可能也很熟悉。

这些是我多年来运行的Jenkins环境类型。必威国际有限公司

  1. 在控制器上执行所有构建。将所有运动部件集中在一个实例上。(我称之为你好,詹金斯)必威国际有限公司

  2. 用构建每个服务所需必威国际有限公司的所有工具创建一个Jenkins EC2代理,然后克隆它,如果我需要“扩展”Jenkins。(我称其为Monster Agent。)

  3. 为我需要构建的每个服务创建一个单独的Jen必威国际有限公司kinS EC2代理。(我称之为雪花代理。)

  4. 在容器中运行构建步骤。例如,使用该容器的推出代理Docker插件或使用多级Dockerfiles封装构建,测试和包装应用的所有逻辑。它们都是集装箱抽象中的第一步,并允许您轻松从一个容器复制伪像到另一个容器。当然,任何一种方法都需要访问Docker引擎,并且我已经管理了我的Docker主机,以便以多种不同的方式运行Jenkins代理:必威国际有限公司

    1. 在我的Jenkins控制器容器中运行Docker引擎- Dock必威国际有限公司er in Docker (DinD)

    2. 挂载运行my Jenkins controller容器的主机的Docker套接字,允许代理作为兄必威国际有限公司弟容器或sidecar容器运行-Docker外部的Docker(DooD)

    3. 为Jenkins控制器配置单个外部EC2 Docker主机,用于在容器中启动构建必威国际有限公司

    4. 使用包含Docker引擎的AMI的EC2插件动态启动代理,然后在一个多阶段Dockerfile中运行所有步骤

所有这些方法都是试图摆脱策划和管理Jenkins代理和基础设施的业务,每个都具有自己的福利和缺点。必威国际有限公司但最近,我开始在新的詹金斯环境中工作 - Kubernetes上的Jenk必威国际有限公司ins。

一旦您将Jenkins、构建代理和作业视为容器化服必威国际有限公司务,迁移平台就会变得更加简单。当我开始这么做的时候,我从来没有使用过Kubernetes,甚至没有在辅助项目中使用过。这就是说,在谷歌云平台(GCP)的GKE中创建Kubernetes集群非常简单,使用掌舵图表并开始在我的新Kubernetes集群上运行的jenkins代理中运行的构必威国际有限公司建步骤。

从管道脚本启动Kubernetes中的代理

这篇文章和2018年我的Jenkins World演讲的重点必威国际有限公司是向您展示如何配置Jenkins,以从管道脚本启动Kubernetes中的代理。我的示例假设您在运行Jenkins控制器的同一个Kubernetes集群中启动代理,但还有其他选择。必威国际有限公司您将从安装Kubernetes插件.作为奖励,当我使用默认Helm库中的最新稳定图表安装Jen必威国际有限公司kins时,Kubernetes插件就会自动为我安装。

一旦在Kubernetes集群上运必威国际有限公司行Jenkins控制器,只需要几个配置步骤,然后就可以开始在Kubernetes上启动临时构建代理。

配置Jenkins控制器必威国际有限公司

您首先需要创建为Jenkins控制器设置的凭据,以访问Kubernetes集群。必威国际有限公司为此,请执行以下步骤:

  1. 在Jenkin必威国际有限公司s UI中,单击证书左侧导航窗格中的链接

  2. 单击旁边的箭头(全球)商店在詹金斯那里必威国际有限公司表格(你必须将鼠标悬停在链接旁边才能看到箭头)

  3. 点击添加凭据

  4. 在“种类”下,指定库伯内特斯服务帐户

  5. 将范围设置为全球的

  6. 单击“确定”。

就是这样!此配置允许Jenkins控制器使用Kubernetes服务帐户访问Kub必威国际有限公司ernetes API。

在Jenkins控制器上创建云配置必威国际有限公司

下一步是为您的k8集群创建一个云配置。(我用k8代替Kubernetes是因为它打字更快,而不仅仅是为了酷。)

  1. 在Jenkin必威国际有限公司s UI,去管理Jenki必威国际有限公司ns.配置系统

  2. 向下滚动直到您看到云设置然后单击添加一个新的云框并选择Kubernetes.

  3. 必须设置以下参数:

    • 姓名-默认为Kubernetes.

    • kubernetes urlhttps://kubernetes.default.-这是从服务帐户自动配置的。

    • Kubernetes命名空间默认的-除非你在另一个命名空间中运行你的控制器

    • 证书:选择在上一步中创建的Kubernetes Service Account凭据

    • 必威国际有限公司詹金斯网址http:// < you必威国际有限公司r_jenkins_hostname >: 8080

    • 必威国际有限公司詹金斯隧道:5555—用于与代理通信的端口

Kubernetes配置

这些是我在K8s集群中启动代理所必须设置的唯一参数。您当然可以修改其他参数来调整您的环境。

现在您已经配置了Jenkins控制器,使它能够访问k8集群,现在必威国际有限公司可以定义一些荚了。pod是Kubernetes的基本构建块,由一个或多个具有共享网络和存储的容器组成。每一个詹金必威国际有限公司斯特工都是作为库伯内特的太空舱发射的。它将始终包含运行Jenkins代理jar的默认JNLP容器和您在pod定义中指定的任何其他容器。必威国际有限公司至少有两种方法可以配置pod模板——在Jenkins UI中和在管道脚本中。必威国际有限公司

在Jenkins UI中配置POD模板必威国际有限公司

  1. 在Jenkin必威国际有限公司s UI,去管理Jenki必威国际有限公司ns.配置系统

  2. 向下滚动到上一步中配置的云设置

  3. 点击添加POD模板按钮并选择Kubernetes Pod模板

  4. 输入以下参数:

    • 姓名<选择>

    • 名称空间默认的-除非在上一步中配置了不同的命名空间

    • 标签<选择>- 这将用于识别jenkinsfiles的代理豆荚必威国际有限公司

    • 用法:选择“尽可能多地使用此节点“如果您希望将此POD成为您的默认节点,则没有指定节点。选择”只构建具有与此节点匹配的标签匹配表达式的作业“仅在流水线脚本中指定标签时才能使用此POD

    • pod模板的名称是继承的- 你可以留下这个空白。一旦您获得此配置的经验,它将是有用的,但现在不要担心它。

    • 容器:您要在此吊舱内启动的容器。下面将对此进行详细描述。

    • venvars.:您想在运行时注入到pod中的环境变量。下面将详细描述这一点。

    • :要装入pod内的任何卷。下面将对此进行详细说明。

Kubernetes Pod模板

记住,一个豆荚由一个或多个容器组成,它们一起生存和死亡。pod必须始终包含JNLP容器,如果您使用Helm Chart安装控制器,则默认配置该容器。但是,您可能希望添加具有构建应用程序所需的工具链的容器。

添加自己的容器模板

  1. 在Jenkin必威国际有限公司s UI中,返回到上一步创建的pod模板

  2. 点击添加容器按钮并选择集装箱模板

  3. 在以下字段中输入值:

    • 姓名<选择>

    • Docker图像:您最喜欢的任何码头图像,如果您正在构建申请,您可以进入‘golang:1.11-阿尔卑斯山3.8’

    • 标签:输入您要使用的任何标签字符串,以便在管道脚本中引用此集装箱模板

    • 总是拉映像: - 选择此选项如果希望插件在创建POD时每次创建POD时,请选择该选项。

集装箱模板

您可以保留其他参数的默认值,但您可以看到该插件为您提供了对pod和其中运行的单个容器的细粒度控制。您可以通过该插件设置Kubernetes pod配置中的任何值。您还可以通过输入原始YAML来注入配置数据。我鼓励你不要被你在这个插件中可以配置的选项数量分散注意力。你只需要配置其中的一小部分就可以获得一个工作环境。

你可以点击添加环境变量在容器模板中的按钮将环境变量注入特定容器。你可以点击添加环境变量按钮,将环境变量注入到pod模板中的所有容器中。下面的环境变量被自动注入到默认的JNLP容器中,以允许它自动连接到Jenkins控制器:必威国际有限公司

  • 必威国际有限公司詹金斯大学:J必威国际有限公司enkins web界面url

  • 必威国际有限公司JENKINS_JNLP_URL:特定代理的JNLP定义的URL

  • 必威国际有限公司詹金斯的秘密:身份验证的秘密密钥

  • 必威国际有限公司詹金斯的名字:Jenkins代理的名称必威国际有限公司

如果您单击添加卷按钮,您将看到几个用于向pod添加卷的选项主机体积路径选择在吊舱内安装docker插座。然后我可以运行一个安装了Docker客户端的容器,并使用主机Docker套接字来构建和推送Docker映像。

此时,我们为我们的Kubernetes群集创建了云配置,并定义了由一个或多个容器组成的POD。现在,我们如何使用它来运行Jenkins工作?必威国际有限公司我们只需在我们的Jenkins管道脚本中通过标签引用POD和容器。必威国际有限公司我们使用我们给出了节点块中的POD的标签,以及我们希望在容器块中使用的容器的标签。此帖子中的示例使用脚本管道,但您可以使用声明性流水线语法实现相同的结果:

节点(试验吊舱){阶段(结帐){签出scm}阶段(建造){容器(go-agent) {//这是我们构建代码的地方。} } }

在jenkins文件中定义Pod必威国际有限公司

通过UI配置插件是一个非常好的概念证明。但是,它不会产生一个软件定义的基础架构,可以对其进行版本控制并与源代码一起存储。幸运的是,您可以直接在Jenkinsfile中创建整个pod定义。必威国际有限公司詹金斯档案里有什么不能做的吗?必威国际有限公司

可以将UI或YAML定义中可用的任何配置参数添加到Podtemplate.集装箱模板部分。在下面的示例中,我定义了一个带有两个容器模板的pod。在节点块中使用pod标签来表示我们希望自旋这个pod的一个实例。任何直接在节点块中定义而不是在容器块中定义的步骤都将在默认的JNLP容器中运行。

容器块用于表示块中的步骤应该在具有给定标签的容器中运行。我已经定义了一个带有标签的容器模板“戈朗”,我将使用它构建Go可执行文件,最终将其打包成Docker映像。在我已经指出我想挂载主机的Docker套接字,但我仍然需要Docker客户端使用Docker API与它交互。因此,我定义了一个带有标签的容器模板码头工人的它使用安装了Docker客户端的映像。

Podtemplate(姓名试验吊舱标签试验吊舱容器:[容器(容器)(姓名戈兰图片戈朗:1.9.4-阿尔卑斯山3.7),容器(姓名Docker.图片Trion 必威国际有限公司/ Jenkins-Docker-Client),),:[hostpathvolume(山路/var/run/docker.sock),hostPath/var/run/docker.sock,],{//节点= pod标签节点(试验吊舱){//容器=容器标签阶段(建造){容器(戈兰){//这是我们构建代码的地方。} } 阶段(建立码头工人形象){容器(Docker.){//这是我们构建Docker映像的地方} } } })

在我的基于Docker的管道脚本中,我构建了Docker映像并将它们推送到Docker注册表中,对我来说,用新的Kubernetes设置完全复制这些映像非常重要。一旦我完成了这个,我就准备用gcloud,Google Cloud SDK,并将该图像推向Google容器注册表,以期预期部署到我的K8S群集。

为此,我使用gcloud映像指定了一个容器模板,并将docker命令更改为gcloud命令。就这么简单!

Podtemplate(姓名试验吊舱标签试验吊舱容器:[容器(容器)(姓名戈兰图片戈朗:1.9.4-阿尔卑斯山3.7),容器(姓名gcloud图片gcr.io / cloud-builders / gcloud),],{//节点= pod标签节点(试验吊舱){//容器=容器标签阶段(建造){容器(戈兰){//这是我们构建代码的地方。} } 阶段(建立码头工人形象){容器(gcloud){//这是我们构建和推送Docker映像的地方。} } } })

在Kubernetes上安装必威国际有限公司Jenkins控制器、运行临时代理以及构建和部署示例应用程序只花了我几个小时。我又花了一个周末深入研究以更好地了解该平台。如果您快速学习,您可以在几天内安装并运行。r上有大量可用的资源我希望这篇博文有助于进一步了解这些知识。更好的是,来看看我在詹金斯世界的会议必威国际有限公司让我们面对面谈谈。

那么,你还想知道什么?在推特上给我打个电话。我甚至可以把你的问题加入我的詹金斯世界会议。我想下一个是Mesos?必威国际有限公司

来迎接曼迪和其他詹金斯和kubernetes专家必威国际有限公司必威国际有限公司詹金斯世界9月16日至19日,注册代码jwfoss.您通过30%的折扣。

关于作者
曼迪哈伯德

Mandy Hubbard拥有近20年的专业QA经验,其中大部分都是在快节奏的启动环境中推动产品质量。她充满热情,通过过程改进,测试自动化,遵循CI / CD最佳实践和所有DEVOPS的所有事物来充满激情。她目前是CS Disco的软件工程师/ QA架构师,这是一个创新的创业公司,提供了一种基于云的eDiscovery平台。