用例——使用Artifactory为Kubernetes构建、测试、部署云原生容器镜像管道
文摘:
Ray Tsang和Kit Merker,谷歌。2016年5月:Kubernetes是一个强大的、开源的容器编排/集群管理工具,可以帮助您在机器集群上管理和部署容器化的应用程序和服务。您可以使用Artifactory来存储和管理应用程序的所有容器映像并部署到Kubernetes.
加入本课程,了解如何使用Jenkins和Artifactory设置构建、测试和部署管道。一旦映像准备好推出,Artifactory就可以自动触发滚动更新部署到Kubernetes集群中,而不会停机!
讨论转录:
[基特和雷-快速交换]好吧,你来吧。然后呢?是的。
[基特]我有能力。好了。
[雷]好吧。大家早上好。感谢大家来参加这次会议。我的名字是Ray,我是Google云平台的开发者倡导者。我做两件事。一是把谷歌提供给开发者的最新、最伟大的技术带给开发者,另一件事是我喜欢听到你们的反馈,以及你们今天是如何使用这些技术的。所以联系我的最好方式是在我的推特账号saturnism上。
我是基特。我是谷歌云的产品经理。我在Kubernetes项目的早期工作过,我也做过容器引擎,容器注册表,我在容器生态系统中很活跃。现在正在开发Cloud Launcher,这是我们的应用程序市场,并与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.
[Kit]大家都很喜欢的新方式是容器,对吧?这个想法是,因为你有这个更小的包,它只带来了自己的依赖关系,可以在相同的vm上共同定位,它给你一个更可移植,更可靠的方式来部署代码。你可以让东西并排放在同一个物理主机上,甚至同一个虚拟机主机上,有冲突的二进制文件。这是一个非常重要的强大的东西,可以让开发者更快地移动。让我们来看看。是的。好吧。
[Kit]所以,这可能——我不知道这是否让你们感到惊讶,只是在谈论谷歌,对吧?在谷歌内部,我们有一个叫做博格的系统。我会再多讲一点。它运行容器。这种情况持续了大约10年。Google实际上为Linux贡献了c-groups,使现代容器成为可能。这就是你在像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]它让我们做的实际上是将编写代码的工程师与构建数据中心的人分离开来。我认为最简单的理解方式是,建立数据中心需要很长时间。从房地产,到混凝土,所有的东西都在里面。写特写是一个非常快的过程。如果你把这两者放在一起,你最终要么会让建造数据中心的人感到非常不安,要么会让开发人员感到非常不安。所以我们要解耦它。这就是容器编排平台发挥作用的地方。
那么作为开发者,我该怎么做呢?首先,这是建造博格人的方法。这是谷歌内部的开发人员为他们的Borg工作所做的事情。我定义了这个hello world job。然后放入一个单元格。IC只是一个单元格的名字。一个单元是一个数据中心内的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.
[Kit]在幕后,真正发生的事情是这样的。这是博格人的基本结构。我给你们看一下花车。首先,你有你的二进制文件,你把它放入二进制存储库。正确的。然后从那里我们在博格大师中设置了配置。博格大师在和调度谈话。make -启动对已定义要运行的工作进行调度的过程。然后它去找一台机器自己运行。博格负责实际将这些二进制文件放到机器上,并从工件存储库中将其拉入。 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项目的一部分,它是一个了不起的社区,我希望你们都能尝试一下。
[Kit]但这对你来说可能很熟悉。因为这是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来进行计算。正如你所看到的,如果你在微服务架构中部署应用程序,它会很快变得非常复杂。因为这里没有部署和管理单个包,每个盒子实际上都是必须单独管理的独立组件。好吧?
[雷]你真的需要工具来帮助你做到这一点。这里我们有三个组件,但我们也有持久存储。我们有Redis,这是一个内存数据库,我们正在使用会话复制。我们正在使用MySQL,当然,我们需要能够像持久化卷一样持久化数据。这就是我今天演示如何部署到Kubernetes并管理应用程序时要用到的应用程序。也能够,你知道,创建一个持续的集成管道。因此,一旦签入代码,就可以在Artifactory中传播并执行构建、测试和提升,并最终通过我们所说的滚动更新部署到您的环境中。
[雷]所以让我们看看。这里我有一个已经设置好的集群这个集群是在Google Container引擎上设置的。这就是我们的托管Kubernetes产品,但是,请记住,您可以在任何地方运行Kubernetes。对吧?你可以在云中运行它,也可以在本地运行它,我个人在树莓派集群上运行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,应用程序的名称,我可以给它起任何我想要的名字,然后是我想要部署的映像,在这种情况下,我实际上有一个预构建的映像,它实际上是在Docker hub上,但稍后我们也会使用Artifactory registry。这里的要点是,您也可以使用来自任何注册表的映像。这就是我的图像。太长了。然后划l,这很重要。这实际上为这个应用程序指定了一组标签。在Kubernetes中,标签是非常非常重要的。Kubernetes中的所有东西都可以被标记。标签还能做什么?
你在问我吗?
(雷)是的。
标签-标签给你一个开放式的键值对,你可以搜索。app中的所有东西你都可以定义,不同阶段,不同环境,所有东西都有标签。默认情况下,它们是非分层的。它们是设计好的。对吧?所有东西都是平面的键值对它让你很容易管理你的应用。你只需要给它添加一个标签,之后你就可以使用标签来引用它。Kubernetes只通过标签引用对象。所以,无论如何。
(雷)是的。非常酷。这是键值对,你可以随意命名。你可以给它任何你想要的值。这完全是你一个人的事,你说了算。我们并不在乎,Kubernetes并不在乎你想要如何标记你的东西。但重要的是,Kubernetes只能按标签进行选择。正确的。这是你将来可以创造的东西。嘿,给我所有的应用程序,有标签,像环境分期和版本是一点零。 Right? You can create that later.
[Ray]这就是我要做的,我要运行这个命令行。
[Kit]照做。
(雷)是的。这真的很快。在幕后发生的事情是,它获取我的图像,发送一个配置,你知道,实际上是自动为我生成的文件,到Kubernetes主服务器,然后内存咨询调度程序,它们在其中一个节点上启动一个应用程序。如果你仔细看底部,在括号里,它在机器tpla上运行。现在重要的是,我从来没有告诉Kubernetes在哪里运行它。我只是说在这个集群中运行。它会找出在哪里运行这个应用程序。
(装备)是的。
[雷]但这里我们还有两个盒子,对吧?在这个屏幕上。我们有灰色的盒子和蓝色的盒子。现在,到目前为止,我们谈论的是容器,但这个灰色的盒子实际上被称为pod。现在,什么是豆荚,基特?
[Kit]豆荚是什么?
(雷)是的。为什么是豆荚?为什么在容器里?
(装备)是的。这是一件有趣的事情。Kubernetes之所以有pod,是因为有时候你想让不同依赖关系的代码一起运行,一起工作。pod是一种构造方式,如果你想一下在机器上运行的容器,你可以取多个,这些是一个单元,它们共享URL。它们可以共享本地主机,也可以共享一个卷。所以它们可以被同一个IP地址引用。他们一起工作。他们也有共同的命运。如果其中一个容器死亡,另一个也会死亡。如果他们输入时间表,他们总是被安排在同一个VM上。 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 […].
[雷]而且,你知道,因为我们的应用程序有前端,后端,这两个东西,你可能会想,也许我可以把前端和后端放在同一个pod里?
[工具箱]。
(雷)没有?没有?为什么不呢?
[Kit]嗯,这是错误的抽象层次。你要做的是在不同的舱里有不同的比例。对吧?所以你认为这些pod将被安排在同一台机器上。如果你把你的前端和后端放在一起,你将无法扩展,因为你必须随着前端一起扩展你的后端,而且它不能在不同的机器上运行。
(雷)是的。
(装备)是的。
[雷]很酷。为了让你能够扩展它,你需要在Kubernetes中使用复制控制器的概念,或者在这种情况下,我们有部署的概念。就是这个蓝色的方框。对吧?这有什么用呢?
[套件]复制控制器?
(雷)是的。
(装备)是的。因此,复制控制器是一个常量循环,它试图将系统的当前状态与您想要的状态相匹配。对吧?所以我们一开始就声明要这么多复制品。我想,在这种情况下,你需要一个,对吧。你要升到四吗?
(雷)是的。
[Kit]从一到四。所以现在它是匹配的。有一个在跑,他要的。现在我们要把期望状态改为4系统会注意到,复制会注意到在它的循环中它不匹配。这样就能解决问题了。你可以缩小它,你可以改变它。其实,你知道,也许是时候展示一下如果我们杀了他们中的一个会发生什么。
[雷]哦,不。真的吗?
[凯特]我们就这么办吧。如果我们杀了他们中的一个,看看会发生什么。
(雷)好。所以我要把它缩小到4,你可以看到这有多简单。它实际上可以计算出哪些机器有能力运行你的工作。它会为你部署它。现在,我要怎么做才能杀死其中一个?你想从机器上杀人吗?
[Kit]不要通过Kubernetes API来做,因为我们想要展示如果发生了一些灾难性事件会发生什么。所以我们应该——
(雷)灾难性的。有人侵入了你的机器,毁掉了容器。好吧。
(装备)是的。没错,内存不足。
(雷)好。
[Kit]顺便问一下,你们都用谷歌云平台控制台吗?你们看过这个吗?哦,你用了,很好。[…]使用它。这是,这是,这是我们的产物,我们很满意。hth华体会最新官方网站但是,其中一个很酷的功能-您只需使用一个SSH就可以进入盒子。
(雷)是的。
[Kit]你可以找到豆荚的名字。
[雷]所以你可以先找出它在哪里运行?我们有四个舱在运行。对不起。
你的字体太大了。
(雷)是的。是的,不是吗?我不知道怎么把它变小。好了。好的,让我们看看这里。把豆荚弄宽。我们有一个在wskh上运行。
[工具箱]好吧。我们去找吧。
[雷]让我们找到这个[…]。
[基特]你在现实生活中绝不会这么做。对吧?这个,我们,你知道的,去盒子里杀了它。是的。你看到雷了,只需点击一下SSH。为我们提供一个带有SSH终端的浏览器。还有一个开发者控制台,它拥有所有你可以在浏览器中使用的谷歌云工具。点击一下,你就能访问最新的API,有时你只是在浏览,手边没有开发盒,你可以点击进去,胡乱摆弄。这真的很方便。好了,我们现在在盒子里了。
(雷)好。
[工具箱]。
[雷]好了。我看一下。码头工人ps。
[工具]哇。
[雷]这里有很多东西。让我看看——
[Kit]你能来吗?
[雷]-找到你好世界。你好世界它在这里运行。它在这个容器中用Java运行。所以让我来杀了它。
[Kit]还有Docker杀人。然后我们要杀死那个容器。好吧。接下来会发生什么呢?好吧,我们就这么做吧。
[雷]照做就是了。好吧。这是一去不复返了。
现在再做一次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,或应用程序的这些灰框相关联。它们是短暂的。好吧,这意味着他们可以来去自如。它们会变化,你不知道会发生什么。在这种情况下,我如何访问这个应用程序?我的意思。
[Kit]就像你需要一个带有负载平衡器的服务端点。
[雷]负载均衡器?正确的。人们通常都是这么做的,对吧?您从负载均衡器中对需求进行负载平衡,并将其从应用程序的不同实例中带到后台。我们如何在Kubernetes中做到这一点,非常简单。你所要做的就是-哇-刚刚发生了什么。
[雷]库贝克特揭露。好吧。我现在就可以公开这个部署。给出应用程序的名称。我可以给它一个我想要映射到的端口和一个你想让外部用户能够访问的端口。这里我要指定负载均衡器的类型。这是一个特殊的,因为默认情况下,Kubernetes将为您提供一个内部IP的内部负载均衡器。负载均衡器是做什么的?
[Kit]好吧,因为所有的豆荚都可以做同样的工作,所以它去哪一个都没关系。对吧?因此,服务所代表的是一个围绕pod的抽象,这些pod都可以满足向它发出的请求。对吧?所以服务,Kubernetes服务它连接到云环境中的负载平衡器,并将在所有可以完成任务的不同pod之间循环工作。现在,我们可以在留言簿上签名了吗?还是别的什么?
[雷]还没有。还没有。就快到了。
[Kit]快到了。
[雷]快到了。
[基特]顺便说一下,我们要求你们拿出手机或笔记本电脑,在留言簿上签名。但是请记住,我们要把这个视频放到网上。所以冷静点。
(雷)是的。但是……
(观众)
我们会把它弄模糊的,如果
(观众)
[雷]我告诉你,我以前就和高中生进行过实时聊天。他们真的很好。我只是在这里设定了标准。
(观众)
[雷]现在,在你能在留言簿上签名之前。你知道,这是目前仅有的一项服务。好吧。这不是全部。但我只是想告诉你,你可以从负载平衡器获得服务。现在,请记住我的留言簿有多个组件。我有前端,后端,数据库,以及所有这些。
[雷]现在为了节省你的时间,因为我们时间有点紧,我要做的是编写一个脚本。这叫做出场脚本。turn-up就是一系列——哦,不好意思——是一系列kubectl命令。我已经将所有的应用程序部署描述符签入到Git存储库中。我有这些文件,如果你愿意,你可以把这些文件组合在一起,我只是把它们分开,因为对我来说,改变和混合搭配非常容易。所以我要做的是运行这个打开脚本,它会告诉Kubernetes部署很多东西。它将使用持久卷部署MySQL。它将部署Redis。它将部署留言簿服务。它会确保我的hello world服务还在。 And […] the user interface as well.
[雷]当我们在做这个的时候,从这里你可以看到整个过程。正确的。随着新服务的部署,我可以使用这个开源的特殊可视化工具对其进行可视化。你可以从我的GitHub上得到它。突然间,没有做很多工作,因为我在检查,我描述了我所有的应用程序我想在Kubernetes规范模型中部署它的方式,我只是-我可以随时随地部署它。只要部署目标是Kubernetes集群。不管你是在云端还是在本地运行,描述符看起来都是一样的。
[雷]所以我要等一会儿,因为现在MySQL,我的留言簿服务,一切都启动并运行了。我现在唯一等待的是外部的负载均衡器IP,它就在那里。
[Kit]在那儿。
[雷]那么,有多少人认为这行得通?谢谢你!是的。
[Kit]哦,是的。投信任票。
[雷]谢谢你的信任。谢谢你!
[Kit]请记录每个人都举手了。是的。
[雷]那些正在看视频的人,没有人举手。我们来看看。好吧。太酷了。我有我的IP地址。这是Kubernetes的负载平衡器提供给我的。如果你想的话,你可以到这里说些好听的话。我可以自己试试。这是一个不成功就失败的时刻。不管基特炒不炒我。 All depends on if it works.
[基特]要是我有这个能力就好了。
[雷]你好,斯普普。我们来看看。哦,来吧。好了。不坏。
[基特]哦,我们有人了。非常棒的演示。好了。
[雷]谢谢,谢谢。是的。这实际上是在后台将数据持久化到Kubernetes中。非常酷的吗?到目前为止你还喜欢。是的。
[Kit]好吧。所以我得到了持续集成的承诺,雷。你能对应用做些改变吗?
[雷]是的,是的。确定。让我在这里做一些改变。首先,我将向您展示没有持续集成的情况。如何在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.
[雷]所以我要向下滚动。等一下。他在哪里?刷新一下。有点慢。我要做一个刷新。我要更新这里的服务。我将把它更新为点0。我把它改成点0。也许这行得通。 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.
(装备)是的。
[Ray]现在回到我的留言簿应用程序。刷新一下。
[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]绿色[…]
(雷)格林会没事的。
[基特]你没有记住。
[观众][…]我们的企业环保。下一个时间。
(装备)是的。下一个时间。
[雷]我要承认这一点。点击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秒。
[Kit]好吧。是的。给你们两个启示。对了,非常感谢你们的关注。我们会回答一些很好的问题。但是,JFrog Artifactory,您可以免费试用并在GCP上试用。我们希望你能尝试一下。是太棒了。另外,你可以在GCP上获得300美元的免费试用,所以我鼓励你拿着这些免费的钱去做一些东西并尝试一下。那会很有趣的。 So, anyway, thank you very much for your attention.
(雷)是的。谢谢你!
[Kit]好吧。
