用例——使用Artifactory为Kubernetes构建、测试、部署管道
文摘:
Ray Tsang和Kit Merker,谷歌。2016年5月:Kubernetes是一个强大的开源容器编排/集群管理工具,可以帮助您在机器集群上管理和部署容器化应用程序和服务。您可以使用Artifactory来存储和管理应用程序的所有容器映像,并部署到Kubernetes.
加入本课程,了解如何使用Jenkins和Artifactory设置构建、测试和部署管道。一旦映像准备就绪,Artifactory就可以触发滚动更新部署到Kubernetes集群,而无需停机—自动!
讨论转录:
(基特和雷——快速切换)好吧,你来吧。然后呢?是的。
(基特)我有权力。好了。
[雷]好吧。大家早上好。谢谢你们来参加这次会议。我叫Ray,是谷歌云平台的开发人员。我做了两件事。一个是把谷歌提供给开发者的最新最好的技术,另一件事是我喜欢听到你们的反馈以及你们今天是如何使用这些技术的。所以联系我最好的方式就是在土星节时打我的推特。
[Kit]我是Kit。我是谷歌Cloud的产品经理。我在Kubernetes项目早期工作过,我也在容器引擎、容器注册表方面工作过,我在容器生态系统中有点活跃。现在正在开发云启动器,这是我们的应用程序市场,并与JFrog等公司建立合作关系。所以要一直努力工作。
[基特]首先,我们做了一个小调查。没有多少人在使用Kubernetes,也没有多少人听说过它,所以我们要给你一点Kubernetes的味道。我们将给你一个简单的概述。然后我们会进入一些实际的工作代码,向你们展示它是如何工作的,然后我们会,带你们看一遍,带你们参观一下。
[Kit]那么,开始吧。想想以前的部署方式。我想大多数人都能理解。对吧?当你部署到虚拟机或裸机时,所有东西都在一起运行。这是事物被包装的方式。你有你的可执行文件,你的配置,你要确保这些东西之间没有版本冲突。你把它们都放在一张图片的一个地方。你可以部署它。管理这种状态是很棘手的。 You can have conflicts or changes you don’t know the exact state of the system. You can move into what we call, you know, an immutable deployment with VM images, but the downside is they’re kind of heavyweight, they take a long time to boot up.
[基特]大家都很喜欢的新方式是容器。这个想法是因为你有了这个更小的包,它带来了自己的依赖关系,可以在同一个vm上共存,它为你提供了一种更可移植,更可靠的方式来部署代码。您可以在同一物理主机甚至同一虚拟机主机上并排放置具有冲突二进制文件的文件。这是一个非常重要的功能,可以让开发人员更快地开发。让我们来看看。是的。好的。
[基特]所以,这可能-我不知道这是否让你们感到惊讶,只是谈论谷歌,对。在谷歌内部,我们有一个叫做Borg的系统。我要多讲一点。它运行容器。已经有10年了。谷歌实际上在Linux中贡献了c组,使现代容器成为可能。这就是你在Twitter和Facebook等大型互联网公司中看到的基础设施。他们采用了类似的方法。但在谷歌,我们在相同的基于容器的系统中运行所有内容。每周真的有20亿美元。 Right. It’s the […] number. But we — you know, whether it’s Gmail, search, YouTube, all of it is running on top of our container infrastructure inside the company.
[Kit]它让我们把写代码的工程师和建数据中心的工程师分离开来。我认为最简单的思考方法是建立数据中心需要很长时间。从,你知道,房地产,到混凝土,一切都涉及其中。写特性是一个非常快速的过程。如果你把两者放在一起,你最终会让构建数据中心的人非常沮丧,或者让开发人员非常沮丧。我们要解耦它。这就是容器编排平台发挥作用的地方。
Kit:作为开发者,我该怎么做?首先,这是建造博格人的方法。这就是谷歌内部的开发人员为他们的Borg工作所做的。我定义了这个hello world作业。然后我放入一个单元格。IC是一个单元格的名字。cell是数据中心内部的1万台机器。我不知道是哪些机器,我不知道机器的名字,我有一个非常简短的两个字母的缩写来描述我想要的机器。我告诉它我的二进制文件,它在源代码中的位置。正确的。 Say, hey run this. I’ll tell it, you know, maybe I got some arguments I need to define like the port number so I can give it some environment variables. And then I define my resource requirements for that job. What does it need to actually execute. So I’m going to define my CPU, my ram, my disk, whatever I need for this thing to run successfully. Right? And then I’m also going to tell it a number of replicas. Right? But since we’re Google we do more than five replicas, we’ll probably do something more like 10 thousand replicas. There you go, that’s more like it. And that’s what you do, right. As a developer, that’s my entire job config that puts it out into the world.
[基特]在幕后,真实的情况是这样的。这是Borg的基本架构。我给你们看一下花车。首先,你有你的二进制文件,你把它插入一个二进制存储库。正确的。然后我们在博格大师中设置了配置。博格人首领和调度人员谈话。使——启动调度已定义运行的工作的进程。然后它去找一台机器自己运行。博格人实际上把这些二进制文件放到机器上,并从工件库中取出。 Okay. Pretty simple flow. But that what that little description is doing. And behind the scenes, there’s a lot of optimizations that are going to run and schedule this sort of the magic there. And so the result is you get a bunch of hello apps — hello world apps running in your database center. Right?
[Kit]现在看下一张幻灯片。让我来谈谈Kubernetes。所以Kubernetes。我们总是被问到的第一个问题是这个名字到底是怎么回事。谁给它起的名字?Kubernetes,意思是船的舵手。你知道,我们在Docker身上看到的航海主题有点融入其中。但这是,就是这样。我们简称它为K8S。所以你可能会看到,k8s, 8代表Kubernetes中K和S之间缺失的8个字符。
[基特]但这是——这是对博格人的重新想象。正确的。我们在谷歌内部构建的系统,它运行我们所有的应用程序基础设施。Kubernetes是它的重新想象,用Go重写,100%开源,并且增长非常快。充满活力的社区。我们已经看到很多公司在Kubernetes上进行战略投资,我们去年成立了云数据计算基金会,以采用Kubernetes和其他云数据技术,并确保它们不受供应商的影响,专注于适合开发者的事情。所以我很自豪能成为Kubernetes项目的一员,这是一个了不起的社区,我希望你们都能尝试一下。
[基特]但这对你来说可能很眼熟。因为这是Kubernetes。如果你还记得之前的幻灯片,我们基本上只是改变了一些东西的名字。非常相似。但我要指出的另一件事是,就在今天,在这张幻灯片上,我们实际上在旁边也有Artifactory。对吧?所以我们用Artifactory替换了二进制存储。我马上就会向你们展示它是如何工作的。同样的道理,你把容器图像,放到容器商店里。对吧? You go and push your Kubernetes config file to the Kubernetes master. The master talks to the scheduler and starts the scheduling loop. And it goes and deploys the — pushes it out to a kubelet that’s running on an actual VM in your environment. And then pulls the binaries and deploys it to the machine and kicks it off. Okay. Simple flow. Same exact flow that we use for every engineer at Google.
[Kit]这就是所有的幻灯片了。实际上我们还有几张幻灯片,然后我们会进行演示。你要接管这里。
(雷)是的。当然。
[工具箱]好吧。
(雷)好。非常酷。
雷:我来给你们做个小演示。这可能是我开发过的最漂亮的应用程序。我不是前端开发人员。这是与bootstrap,它也是我所建立的最好的演示应用程序之一。为什么?因为它实际上有两个最好的应用。一个是hello world,另一个是留言簿。对吧?你可能都看到了,但你从来没有同时看到过。现在。 Now what this actually does you enter your name in the message. Right? And you press on the button and it’s going to say hello to you, of course, and it’s going to persist the data via another service behind the scenes into MySQL database.
[Ray]它实际上使用了微服务模式的模式,在微服务模式中,前端与hello world服务解耦,这些是幕后的留言簿服务。它通过HTTP或REST使用json来进行计算。正如你所看到的,如果你在微服务架构中部署应用程序,它会很快变得非常复杂。因为这里不是有一个单独的包来部署和管理,每个盒子实际上都是单独的组件,您必须单独管理。好吗?
[Ray]你真的需要工具来帮助你做到这一点。这里我们有三个组件但我们也有持久存储。我们有Redis,这是一个内存数据库,我们用它来进行会话复制。我们使用的是MySQL,当然,我们需要像持久化卷一样持久化数据。这就是我今天演示中要用到的应用程序如何部署到Kubernetes并在那里管理应用程序。同时也能够,你知道,创建一个持续整合的管道。因此,一旦您签入代码,您就可以在Artifactory中传播、执行构建、测试和升级,并最终通过我们所说的滚动更新部署到您的环境中。
[雷]我们来看看。这里我有一个已经建立的集群这个集群是在谷歌容器引擎上建立的。这就是我们托管的Kubernetes产品,但是,请记住,你可以在任何地方运行Kubernetes。对吧?你可以在云上运行它,也可以在prem上运行它,我个人在树莓派集群上运行Kubernetes,你肯定也可以这样做。但这是在使用云。我们有四个节点。这是四台虚拟机,在顶部用四个方框表示。我有一个容器的重复预览。我来给你们展示一下。 It’s a very simple Spring Boot application. Okay. This is the — one of them. First one is hello world. And it uses a REST controller that returns hello to you. It’s using Groovy and all that stuff. You can be — did I hear?
Groovy(观众)。
(装备)是的。Groovy。
[Ray]这对实时编码来说很好。我今天不做,但这是我通常做的。现在我可以用另一个属性文件配置这个应用程序。你可以在后面看到这些东西。好吧,我已经将应用程序构建到容器中了,但我认为当我做民意调查时,许多人以前没有真正使用过Docker。我想快速地给你们展示一下。
[Ray]了解一点是非常重要的,因为你是通过定义Docker文件来构建容器的。Docker文件非常好。这是一种自我描述。在这种情况下,它会告诉Docker,你想如何构建容器。这个很简单。它只有几行,因为我简化了很多东西。但是如果你看一下这里的一个例子。等一下。Groovy构建。让我看看Docker文件。 I just want to show this very quickly. It’s really nice because it’s self-documenting. You specify all of the steps that you need to create this container image that has not just your application but also the runtime that you need in addition to be able to run your application. Right?
[Ray]所以,我从互联网上采取了步骤,然后我把它放在Docker文件中,这将为我创建一个预安装了Java的映像,在这种情况下有Groovy和Spring Boot。
[Ray]现在,因为我已经构建了容器,现在我如何实际部署这是一个机器集群。记得Kit讲过的那张幻灯片是关于它是如何在幕后工作的这就是我要做的。给我点时间,让我找到正确的目录。Spring Boot Docker。Kubernetes -例子Kubernetes一点二。好的。很简单,如果你有一个容器你想在一群机器中运行,你可以这样做。Kubectl运行。好的。现在,kubectl是一个可以与Kubernetes集群交互的命令行应用程序。 Everything I do here is gonna be using this kubectl command line, but behind the scenes it actually makes API calls. So whatever I’m doing here right now, just remember you can actually make API calls from your tools as well, directly into Kubernetes behind the scenes.
[Ray]所以这个命令行要做的是kubecto run,应用程序的名称,我可以给它起任何名字,然后是虚线image,这是我想要部署的映像,在这种情况下,我实际上有一个预先构建的映像,它实际上是在Docker hub上,但稍后我们实际上也会使用Artifactory注册表。这里的重点是,您还可以使用来自任何注册中心的映像。这就是我的像。太长了。然后是破折号l,这很重要。这实际上为这个应用程序指定了一组标签。在Kubernetes中,标签非常非常重要。Kubernetes中的所有东西都可以被标记。标签还有什么作用?
[基特]你在问我吗?
(雷)是的。
标签-标签给你一个开放的键值对,你可以搜索。应用程序中的所有东西你都可以定义,不同的阶段,不同的环境,所有带有标签的东西。它们默认是非等级制的。它们是设计出来的。对吧?所有东西都是简单的键值对它让你很容易管理你的应用。您只需向它添加一个标签,然后您可以使用标签来引用它。Kubernetes只通过标签来引用对象。所以,无论如何。
(雷)是的。非常酷。它是键值对,你想怎么命名都行。你可以给它任何你想要的值。这完全由你来管理,你一个人来定义它。我们并不关心,Kubernetes并不关心你想要如何标记你的东西。但重要的是,Kubernetes只根据标签进行选择。正确的。这是你将来可以创造出来的东西。嘿,给我所有有标签的应用程序,就像环境分期,版本是零。 Right? You can create that later.
这就是我要做的,我要运行这个命令行。
(基特)去做吧。
(雷)是的。这真的很快。在幕后发生的事情是,它获取我的映像,发送一个配置文件,你知道,这实际上是自动为我生成的,到Kubernetes主服务器,然后内存咨询调度器,他们只是在一个节点上启动了一个应用程序。如果你仔细看下面的括号,它在tpla机器上运行。重要的是,我从来没有告诉Kubernetes在哪里运行它。我刚说在这个集群中运行。它会找出在哪里运行这个应用程序。
(装备)是的。
[雷]但是这里我们还有两个盒子。在这个屏幕上。灰色的盒子,蓝色的盒子。现在,到目前为止,我们谈论的是容器,但灰色的盒子实际上被称为豆荚。什么是豆荚,基特?
[Kit]豆荚是什么?
(雷)是的。为什么是豆荚?为什么它在一个容器里?
(装备)是的。这是一件有趣的事情。所以Kubernetes有pod的原因是因为有时候你想要有不同依赖关系的代码一起运行和工作。pod是一种构造方式,想想机器上运行的容器,你可以取多个,这些是一个单元,它们共享URL。它们可以共享本地主机,共享卷。因此它们可以被相同的IP地址引用。他们一起工作。他们也有共同的命运。如果一个容器死了,另一个也会死。如果他们安排日程,他们总是被安排到同一个虚拟机。 The reason why this is super powerful is that you get to decouple your dependencies even at runtime. Canonical example of why pods are really powerful is if you had a webserver, a static webserver and a system that can fetch static data from an external system. You put those two side by side and those two systems can iterate separately but they work together. They can be written in different languages and use different dependencies. So […].
[Ray]而且,你知道,因为我们的应用程序有前端,后端,这两个东西,你可能会想,也许我可以把前端和后端放在同一个pod中?
[工具箱]。
(雷)没有?没有?为什么不呢?
[Kit]嗯,这是错误的抽象层次。你要做的是把不同的比例放在不同的豆荚里。对吧?你可以想象这些舱将被安排在同一台机器上。如果你把前端和后端放在一起,你就不能扩展了,因为你必须在前端的同时扩展后端,而且它不能在不同的机器上运行。
(雷)是的。
(装备)是的。
[雷]真酷。为了让你能够扩展它,你需要使用Kubernetes中的复制控制器的概念,在这种情况下,我们有[…]部署的概念。就是那个蓝色的方框。对吧?这有什么用呢?
[Kit]复制控制器?
(雷)是的。
(装备)是的。因此,复制控制器是一个常量循环,它试图将系统的当前状态与您希望的状态相匹配。对吧?我们一开始就声明了,我们需要这么多副本。我想,你知道,在这种情况下,你需要一个。你要升到四个?
(雷)是的。
[基特]从一点到四点。所以现在它是匹配的。有一个在跑,他要的。现在我们要把理想状态改为4,系统会注意到,复制会在循环中注意到它不匹配。这样问题就解决了。你可以缩小它,你可以改变它。其实,现在正好可以展示一下如果我们杀了其中一个会发生什么。
[雷]哦不。真的吗?
[基特]我们就这么做吧。看看如果我们杀了其中一个会怎么样。
(雷)好。所以我要把这个缩小到4,你可以看到这有多简单。它实际上会找出哪些机器有能力运行您的作业。它只是为你展开它。现在,我要怎么做才能杀死其中一个?你想用机器杀人吗?
[Kit]不要通过Kubernetes API来做,因为我们想展示如果它通过,你知道,一些灾难性事件会发生什么。所以我们应该
(雷)灾难性的。有人进入你的机器,杀死容器。好的。
(装备)是的。没错,内存快用完了。
(雷)好。
顺便问一下,你们都用谷歌云平台控制台吗?你们看过这个吗?哦,你用了,很好。[…]使用它。这就是我们的产品,我们非常满意。hth华体会最新官方网站但是,它有一个很酷的特性——您只需使用单个SSH就可以进入这个盒子。
(雷)是的。
[基特]你可以找到豆荚的名字。
[雷]所以你可以先找出它在哪里运行?我们有四个舱在运行。对不起。
[基特]你的字体太大了。
(雷)是的。它是,不是。我不知道怎么把它变小。好了。好的,我们看这里。打开吊舱。我们有一台在wskh上运行。
[工具箱]好吧。我们去找吧。
[雷]让我们找到这个[…]。
[基特]你在现实生活中永远不会这么做。对吧?这-我们-你知道的,走到盒子前把它干掉。是的。你看到雷一键SSH。给我们一个带有SSH终端的浏览器。还有一个开发者控制台,上面有你可以在浏览器中使用的所有谷歌云工具。点击一下,你就能访问最新的API,所以有时候你只是在浏览,你手边没有你的开发箱,你可以点击进去,然后破解一些东西。这真的很方便。好了,我们现在在盒子里了。
(雷)好。
[工具箱]。
[雷]来吧。我看一下。码头工人ps。
[工具]哇。
[雷]这里有很多东西。让我看看——
[基特]你能做到吗?
[Ray] -然后找到Hello世界。你好世界它在这里运行。它在这个容器中用Java运行。让我把它关掉。
[基特]和道克杀。然后我们要杀死这个容器。好的。现在,会发生什么。我们就这么做吧。
[雷]照做就是了。好的。这是一去不复返了。
现在再做一次Docker ps。是的,让我们看看是什么在运行。
[观众][…]不明性质。
[基特]是的,是的。是的。某个愤怒的系统管理员闯进Docker,杀了它。所以- - -
[雷]你看,它刚刚重启,发生什么事了?
[套件]已经重启10秒。就是这么快,对吧。我们-它会注意到并修复问题。在这个稍微有点做作的例子中,它会在同一个盒子里重新安排时间。实际上,它会在不同的盒子上重新安排时间。但通常情况下,如果它有空间,它就会把它放回原来的位置。但这一直都在发生。对吧?它总是在运行并寻找这些重启。这是牛不是宠物的概念,如果你熟悉这个概念的话。 You let them die and you bring back new ones. You don’t care and feed and name them, and treat them specially, and give them medicine. You just kill them and get a new one. Right?
(观众)这太残忍了。
[基特]这有点无情。我很抱歉。是的。
(观众)
(雷)好。太酷了。所以Kubernetes真的试图保持你的系统正常运行。但是我们这里有一个问题,这些IP地址与每个pod相关联,或者这些应用程序的灰色盒子。它们是短暂的。好吧,这意味着他们可以来去自如。他们改变了,你不知道会发生什么。如果是这样,我该如何访问这个应用程序呢?我的意思。
就像你需要一个带有负载均衡器的服务端点一样。
[雷]负载均衡器?正确的。人们通常都是这么做的,对吧。您可以从负载均衡器负载平衡您的需求,也可以从应用程序的不同实例在幕后进行负载平衡。我们如何在Kubernetes中做到这一点,非常简单。你所需要做的就是——哇——刚刚发生了什么。
[Ray] Kubectl曝光。好的。所以我现在可以公开这个部署。给出应用程序的名称。我可以给它我想映射到的端口和你想让外部观众能够访问的端口。这里我要指定负载均衡器的类型。这是一个特殊的,因为默认情况下Kubernetes会为你提供一个内部IP的内部负载均衡器。负载均衡器是做什么的呢?
[基特]因为所有这些豆荚都可以做同样的工作,所以它去哪一个都没有关系。对吧?因此,服务所代表的是围绕pod的一种抽象,这些pod都可以满足到达它的请求。对吧?因此,Kubernetes服务附加到云环境中的负载均衡器,并将在所有可以完成任务的不同pod之间循环工作。现在,我们准备好在留言簿上签名了吗?还是别的什么?
[雷]还没有。还没有。就快到了。
[基特]快到了。
[雷]快到了。
[基特]顺便说一下,我们会要求你们拿出你们的手机或笔记本电脑,在留言簿上签名。但是请记住,我们会把这个视频放到网上。所以冷静点。
(雷)是的。但是——
(观众)
[基特]我们会把它模糊化
(观众)
雷:我跟你说,我以前跟高中生做过这样的现场聊天。他们真的很好。我只是在这里设置了条件。
(观众)
[雷]现在,在你在留言簿上签名之前。你知道,这是-这只是目前的一项服务。好的。这还不是全部。但我只想向你们展示,你可以从负载均衡器访问服务。现在,记住我的留言簿有多个组件。我有前端,后端,数据库,所有这些。
Ray:现在为了节省你们的时间,因为我们的时间有点紧,我要做的是编写一个脚本。这就是所谓的剧本。turn-up只是一系列,哦,不好意思,是一系列kubectl命令。我已经将所有应用程序部署描述符签入到Git存储库中。我有了这些文件,你可以把它们组合在一起,我把它们分开了,因为这对我来说很容易改变,混合和匹配。所以我要做的是运行这个启动脚本,它会反过来告诉Kubernetes部署很多东西。它将使用持久卷部署MySQL。它将部署Redis。它将部署留言簿服务。它会确保我的hello world服务仍然在那里。 And […] the user interface as well.
[雷]当我们在做这个的时候,从这里你可以看到整个过程。正确的。随着新服务的部署,我可以使用这个特殊的可视化工具来可视化它,它是开源的。你可以从我的GitHub上找到。突然之间,不用做很多工作,因为我在检查,我在我的所有应用程序上描述了我想要在Kubernetes规范模型中部署它的方式,我可以随时随地部署它。只要部署目标是Kubernetes集群。不管你是在云上还是在prem上运行,描述符看起来都是一样的。
雷:所以我要等一段时间,因为现在MySQL,我的留言簿服务,一切都在运行。我现在在这里等待的唯一一件事是外部负载均衡器IP,它就在那里。
[基特]在那儿。
雷:那么,有多少人认为这可行?谢谢你!是的。
[基特]哦,是的。投信任票。
谢谢你的信任。谢谢你!
[基特]记录一下,每个人都举手了。是的。
雷:对于那些正在看视频的人来说,没有人举手。我们来看看。好的。非常酷。我有我的IP地址。这是Kubernetes的负载均衡器提供给我的。如果你想的话,你可以到这里来说点好听的话。我可以自己试试。这是一个成功或失败的时刻。不管基特炒不炒我。 All depends on if it works.
[基特]要是我有权力就好了。
你好,swamamp。我们来看看。哦,来一个。好了。不坏。
[基特]哦,我们有人了。非常棒的演示。好了。
[雷]谢谢,谢谢。是的。这实际上是在后台将数据持久化到Kubernetes中。非常酷的吗?到目前为止你还挺喜欢的。是的。
[基特]好吧。他们答应我要持续整合,雷。你能不能对应用做些改动?
[雷]是的,是的。当然。让我在这里做一些改变。首先,我将不考虑连续积分。如何用Kubernetes实现这一点。好的。
[Ray]例如,如果我有两个不同版本或标签的同一个容器。一个是更新的另一个是旧的,我怎么用Kubernetes来做滚动更新。这是你最想做的最常见的任务之一。在Kubernetes中,如果你想直接使用它。我来告诉你怎么做。所以首先我要得到我的部署。这里,我要更新这里的hello world服务。好的。我要这么做。这很容易做到。 I can kubectl edit. Deployment. And the name of the application I want to edit. And what this is going to do is to show you the actual descriptor that was stored inside of Kubernetes. Now you can actually copy and paste these out. You can save this file into your Git so that you can always redeploy the same application with the same setting. And here all I have to do is to change the image I want to deploy. And watch very carefully.
雷:所以我要向下滚动。等一下。他在哪里?执行刷新。有点慢。我要进行刷新。我要在这里更新这个服务。我要把它更新到零点。我把它改成两点零。也许能行。 And, here we go. Okay. Wow. That was quick. What just happened? Did you see that? Was that too fast? It actually just performed a rolling update on my application and replaced my service, one by one, okay, one by one, one instance at a time, and replaced it with version two point zero.
(装备)是的。
现在如果我回到我的留言簿应用程序。我来刷新一下。
[Kit]顺便说一下,这就是我们所说的不可变。对吧?我们没有改变容器上运行的内容。我们所做的就是让他们再来一个。杀了那个旧的。拿出一个新的。杀了那个旧的。顺便说一下,您可以用完全相同的方式进行回滚。对吧?你把旧的带上来,把新的带下来。 And it’s the new new one. So you’re always — you’re only, always pushing a container that’s ready to run. You’re not modifying the container that’s running. You’re not installing updates to wherever. That’s where you have this immutability and repeatability in the deployment.
(雷)是的。完全正确。
[工具箱]哦。看看这个。这家伙的。好的。是的。
[雷]2.0版本。是的。
[雷]那太好了。到目前为止还不错。我希望能一直这样。
[Ray]现在让我们假设这个部署很糟糕,你不想做——你想回滚。你会怎么做?你可以做kubectl rollout。如果你愿意,你可以看到部署的历史。你好,世界服务。你可以看到发生了什么。看,我现在有三个版本。实际上,您可以看到哪个命令行导致了系统的更改。好的。如果我想回滚到任何一个修订。 I can do that. Or if I want to just go back one of these revisions. I can do kubectl rollout undo the deployment hello world service. And again what’s going to happen behind the scenes, oh look, it’s rolled back. And it’s going to do another rolling update, rolling back the application. Just like that.
(装备)是的。是的。
[Ray]现在我们还做了什么,通过使用这种结构,我们实际上创建了一个演示,我们使用Jenkins管道来做一些事情。这实际上是监视我的GitHub存储库现在。举个例子,这就是我要做的。我将检查我的不同分支,这个监控工具,这个Jenkins监控工具。我要做一个Git签出的演示。我要更新我的用户界面。市场部的人告诉我白色背景效果不太好。所以他们推荐浅蓝色。
[基特]你能把它变成绿色吗?
(雷)绿色?
(装备)是的。
[雷]格林——是的。我用绿色。
(装备)是的。
[雷]但是有没有一种特殊的绿色?
(观众)
[Kit] Green[…]
[雷]绿色没问题。
[基特]你没有把它背下来。
[观众][…]我们公司的绿色。下一个时间。
(装备)是的。下一个时间。
雷:我要承认这一点。我要用到git add。我要用到git commit,然后把后台更新为绿色。然后我要推它。这实际上是把它推到我的GitHub存储库。好的。因为我是这样设置Jenkins的我在这里用了很多插件。其中之一就是GitHub插件。实际上,为什么我的推不起作用?我的网络坏了吗?是的。 Maybe. Well, let’s see if this goes through. Oh here we go.
雷:别再看YouTube视频了。来吧。
[基特]他们正忙着在留言簿上签名呢。
[观众]他们在频道里聊天。
(雷)是的。所以我推了一把。这实际上触发了我的管道。如果我到这里。它会做几件事。哦,是的,已经开始了。正确的。它实际上触发了我的管道。它正在下载我最新的应用程序。它在建造集装箱。 And if I go back to the UI pipeline here. These are the things that it’s going to do at the high level. Build the container, test it, okay — and also, by the way, once the container is built we’re actually pushing into Artifactory. And Artifactory instance is actually running on GCP as well.
[基特]没错。如果你们听说了。现在您可以在谷歌云平台上在线运行Artifactory。我们希望你能做到。实际上有一个30天的免费试用,我稍后会给你们看,你们可以用这个。在这儿。奇迹发生的地方。GCP Artifactory。快完成了吗?
(雷)是的。我需要启用自动刷新但它也会将我的容器图像推入Artifactory。它将尝试做一些组件测试。你知道,对于我刚刚构建的这个特定组件。如果组件测试成功,那么我们可以使用Artifactory将映像提升到发布注册表中。
[Kit]顺便问一下,你在哪里运行这个Jenkins,你是如何部署的?哦,是的,这个Jenkins也在谷歌云平台上运行。这真的很酷,因为我自己没有很多时间来设置这个。我所做的就是打开控制台。这真的很酷。我去了这个云发射器。这里,非常好。您可以找到许多想要部署的其他应用程序,其中之一就是Jenkins。我所要做的就是点击它,它是一个[…]实例,机器有多大,他们就会为我张贴所有东西。然后我就可以安装运行这个管道所需的所有插件。 Okay.
(雷)酷。
[工具箱]好吧。看来这条管道已经完成了。其中一件非常酷的事情是,你知道,他们不仅在幕后调用Artifactory,并且在Docker图像准备推广时进行推广。在这个例子中,它也用kubectl命令行调用Kubernetes,还有一个Kubernetes插件,它实际上为我做了滚动更新。现在你可能已经错过了,但是希望,如果我回到这里,还是成功或失败。
[基特]哦,看看那个。绿色的。
[雷]我们有绿色。其实是谷歌的幕后人员帮我做的。不,我开玩笑的,都是通过詹金斯的渠道。很酷。很酷。
[Kit]很酷。是的。
雷:我的时间一点也不多了。我将专门研究其中的一个并展示我所做的构型。看这里。
[基特]事实上,你想去吗?我们要回答问题吗?或。
[雷]是的,如果你能先回答问题的话。是的。我们来做一下。
[基特]我们就这么做吧。是的。除非我们能把它留着,但是。实际上,快速看最后一张幻灯片。
[雷]最后一张幻灯片。是的。1秒。
[基特]好吧。是的。这里有两个要点。顺便说一句,非常感谢你们的关注。我们会回答一些很好的问题。但是,JFrog Artifactory,你可以获得免费试用,并在GCP上试用。我们希望你能尝尝。是太棒了。然后,你还可以在GCP上得到300美元的免费试用所以我鼓励你用这些免费的钱来做一些东西,并尝试一下。会很有趣的。 So, anyway, thank you very much for your attention.
(雷)是的。谢谢你!
[基特]好吧。
