从零到DevOps超级英雄:容器版——杰西卡·迪恩,微软

微服务可能很难;许多容器最佳实践仍在被发现。本课程通过将DevOps最佳实践引入其中,帮助最小化容器编排(特别是Kubernetes)的学习曲线。只需要选择专门为简化过程而构建的容器工具,就可以从零变成DevOps超级英雄。了解这些工具如何为云服务提供更好的编排,为微服务部署提供抽象和封装,以及对在哪里运行的内容和原因的可见性。

>了解更多关于swampp 2020 <

视频记录

大家好。我们将在两分钟后开始。我想确认一下。我想我们已经关门了。如果后排的人不介意的话,我们可以提前两分钟开始。我做得好吗?好吧。我要开始我的谷歌时钟,这样我就可以跟踪自己了。好的,欢迎大家。你好,每个人。 Okay, I came all the way from East Bay, so you guys are going to have to do a little bit better than that. How is everyone doing?

太棒了!

和你好。耶!好了,这是从零到DevOps超级英雄,容器版,我已经讲过几次了。每次都是不同的,但我真正想关注的是,如果你已经采用了DevOps,你已经在做类似液体软件的事情,你如何坐在这里将这些实践应用到容器中,以及你为什么一定要关心这些实践?也许你已经在做容器,你正在尝试找出最佳实践,我如何进一步简化它,我如何对正在发生的事情有一些可见性和可追溯性。这是一节课,我们将从容器和Kubernetes方面从头开始。所以我们将按照课程描述使用Kubernetes。在我们开始之前,因为我们有47分钟因为我提前两分钟开始了,我想确保我们已经为我们将要讨论的内容制定了一个议程。

正如标题所暗示的那样,从零到DevOps超级英雄,我无法在45分钟内让任何人成为漫威超级英雄漫画,而且真的,我没有超能力,所以我不能在任何时间内做到这一点,但我能做的是让你思考,让你兴奋,并给你一些资源,让你可以在自己的时间里玩这些东西。2022世界杯阿根廷预选赛赛程这次会议的目的是向你们展示什么是可能的。

现在,让我们谈谈我们的行业。让我们谈谈现在的情况。我们所知道的生命是靠代码运行的。在你的生活中,没有代码你什么都做不了。我认为这张幻灯片很有趣,因为即使是一辆车,我很抱歉,我不能把幻灯片放大,但是一辆豪华车,我很确定普锐斯或特斯拉可能是一样的,需要1.2亿行代码来操作。它使用的代码比航天飞机还多,我觉得很有趣,有40万行代码。你甚至有一个简单的交通系统,当你走出去过马路时,它使用了500万行代码。现在我们开始在医疗保健和开源技术方面取得进一步的进展,实际上我的一个同事有一个人工胰腺,让他活了三年,他的人工胰腺是开源的,使用了16万行代码。他的名字叫Scott Hanselman,一个不知名的人,你可能听说过他,但生活确实是靠代码运行的,对Scott来说,他的生命取决于它。

对于我们这些从事技术的人,对于我们这些软件工程师,操作工程师,各行各业的人,我们该如何处理这个问题呢?我们如何从液体软件中进行扩展?我们如何调整我们的管道来交付容器,服务器列表,web应用程序,我们如何找到正确的解决方案?有适合所有人的方法吗?你现在有智能汽车了。每次你得到一辆车,都有某种智能技术。我们家里有很多设备,不管是iPad, iPhone,还是多台电脑。甚至我的灌溉系统,我刚刚更新了,因为旧的那个坏了,很难操作,现在它是智能的,可以连接wifi。我们有很多不同的食材,我们也有华夫饼,我们要讲的就是华夫饼。

我计划在今天的技术演讲中尽可能多地谈论华夫饼,我们会看到它对我们有什么影响。

请举手,有多少人认为自己是开发人员或软件工程师?太棒了。有多少人愿意把自己定位为运维工程师或系统管理员?酷。我们有一个健康的平衡,这很好,那么有多少人不管老板让他们戴什么帽子?

每个人都应该举手,否则我们就得跟你老板谈谈。我只是说说而已。因此,为了真正处理这种基于代码的生命运行,甚至开始讨论容器、DevOps以及如何以超级英雄的方式做事,我们需要确保我们与我们的同行处于同一页面。我们需要确保我们都了解对方住在哪里。对于在座的开发人员来说,也许你们以前也有过这种感觉。我们经常觉得我们需要以有竞争力的速度创建应用程序。我的老板总是说,要快一点。推得更快。不断迭代,尽可能保持敏捷。但如果IT或运营工程师挡着我的路,我就无法做到这一点。 It’s not early 2000s anymore. I can’t take a zip disk and go over to the server room and pop it in and take a hammer and make my code work. I have processes now, and when I do hand you my code to the systems administrators and ops engineers, when you tell me it doesn’t work, that’s impossible. It worked on my machine, and as a result, I feel as though my ability to innovate and my productivity then becomes suspended, because I’m waiting on IT.

别担心,对于在座的系统管理员们,我做了10年的系统管理员才来到另一边,现在我很高兴地弥合了差距,但是从服务器端,或者系统管理员端,我不能给你们未经请求的访问权限,对吧?我不得不担心服务器保护和公司合规问题。所以你尽可能快地迭代,我担心运行时间,并确保它运行起来,所以我不希望你快速迭代。结果我们开始发生冲突,对吧?

但由于我不是开发人员,我天生不知道如何将您的基础设施、软件集成到我的基础设施中,但归根结底,我无法同时关注服务器遵从性和应用程序遵从性,因此我需要与您合作,而不是与您作对。事实证明,操作工程师和系统工程师都有相互竞争的动机,但如果我们最终有一个共同的目标,我们都朝着这个目标前进,我们就不会再战斗了,比如“这是斯巴达,我要坐在这里,把它变成一部漫威电影,也许这是终局之战。”我不会再坐在这里和你对抗了。现在我要和你们一起朝着一个共同的目标前进。”

所以这就是我喜欢下一张幻灯片的原因,因为我们讨论了IT压力点,但我在与之斗争的不仅仅是IT或IT人员或系统管理员或信息技术专家。如果你接触软件,如果你写软件,如果你的生活依赖于代码,你为生活和可持续性开发代码。这是我们所有的压力点,因此,这是我们的集体责任,这真的让我们明白了为什么DevOps是重要的,为什么JFrog每年都有这个会议,为什么我们有液体软件这个话题。所以这就是微软支持的定义,我在微软的团队,一个DevOps团队,也支持这个定义。DevOps是人、流程和产品的结合,能够持续向最终用户交付价值。hth华体会最新官方网站持续交付价值。幻灯片上最重要的工作是价值。如果我们将价值作为我们的共同目标,开发人员和运营人员就不再相互争斗了。我们都有一个共同的目标,那就是为最终用户提供价值,更重要的是,如果你没有提供价值,你在做什么,为什么要做,你怎么知道你是否在提供价值?你有没有洞察,遥测,或任何形式的可追溯性来帮助你理解? Especially when you start to adopt complex situations and systems and distributive systems, like kubernetes.

Kubernetes诞生仅5年,就风靡全球。很多人在生产环境中运行它,他们不知道他们在做什么,甚至不知道如何跟踪他们的pod在哪里,他们的名称空间在哪里,如果他们有托管身份,回滚。他们对自己所实现的价值或所提供的价值毫无概念。

为什么是容器?为什么容器如此重要?为什么每个人都这么热心呢?事实证明,它实际上有很多DevOps实践与之相关。我们讨论了开发人员和运维工程师的瓶颈。容器直接解决了这个问题。对于开发人员来说,它实现了这种一次编写、随处运行的微服务架构,对于运维人员来说,它提供了可移植性。它现在在我的环境中提供了抽象和标准化。我不必担心开发中的Java版本与生产中的不同,现在这将成为一个问题。我有更高的计算密度。 I can scale. With containers and DevOps practices and setting up my pipelines in a certain way, I can automate that scale, either vertically or horizontally, and I can scale out or scale in.

现在,对于那些可能生活在岩石下或被灭霸抓了五年,不记得容器是什么的人,我只想再次设置关卡。记住,它不是一个虚拟机,事实上,它甚至不是一个真实的东西。它是一种具有简单进程隔离的应用程序交付机制,如果你有更多的Windows背景,它实际上是基于Linux内核特性构建的,所以这就是为什么像kubernetes中的名称空间这样的东西是你的进程可以看到的,而你的C组是你的进程可以使用的。比如你的中央处理器和内存。我喜欢告诉人们,容器基本上就是华夫饼,这就是为什么我说我们要尽可能多地谈论华夫饼。下面是原因。如果我真的把黄油拿掉,只有华夫饼,也就是面包,那就有点无聊和干燥了。我真的很想吃糖浆、黄油、生奶油,我的意思是,如果我要去吃华夫饼,就全力以赴。但我这样做是因为华夫饼成为了我身体快乐的传递系统。所有的集装箱都是一个为你的客户提供价值的传递系统。

容器就像华夫饼。请记住,容器化与虚拟化有很大的不同。虚拟化,你将会有虚拟机监控程序上的裸露的金属,或在一个操作系统之上,然后你还会有客人操作系统,你的依赖,单独和您的应用程序来管理,而一个容器将坐在你的码头工人引擎,放置在主机操作系统,和在你的容器,你有封装,过程孤立的环境,只有依赖和内核,您需要运行您的应用程序。

我们来复习一下容器层。我们都记得你是如何把你的层次放在中间的。这些是只读层。小心你放进去的东西。我不能告诉你我看到有多少图像有SSH密钥和拍入其中。这可能不是个好主意。如果可以的话,利用多级docker fall。传递信息,并确保你没有发布不应该发布的东西。容器层是读写操作发生的地方,再一次,我们回到食物层,因为它很像蛋糕。考虑一下你把重要信息放在这些层的什么地方,并确保你放在这些层中的东西是有价值的。

我们已经讨论了开发人员和运营人员的问题,所以请记住两者之间的优势。容器为开发人员提供了快速迭代和敏捷的交付系统,以及一些不可变和可移植的东西,然后运维人员也从这种可移植性中受益,因为它提供了更大的成本节约。我现在有一个更有效的部署,因为那个标准化的环境,我甚至可以做一些事情,像[听不清00:11:56]爆发,我可以从私有云到公共云再到多云。我有很多扩展的能力,所以我相信坐在这里看我用手说话和使用ppt是很有趣的,让我们开始看一个演示。我们稍后再讨论演示。我假设在座的一些人一直在使用容器,对kubernetes有一定的经验。如果没有,我之后会复习,但这真的是你留在房间的点击诱饵,因为我现在要给你看一些超级棒的东西。

所以开始,我试着真诚地倾听所有的反馈我得到我所有的课程,和我读每一个反馈,但我告诉你,不管有多少次人们把它放在那里,我无法控制温度在房间里,房间的气味或任何设施控制,因此,当你把它放在那里,知道我同情你,但它不是完全有用的反馈。现在,如果你告诉我你喜欢我的鞋子,这是有帮助的,因为它会鼓励我去买更多的鞋子。

然而,我在反馈中听到的一件重要事情是,“我们厌倦了‘你好世界’。你可以谈论kubernetes和容器,并使用所有这些工具,这很好,但这只适用于hello世界。它不可能在现实世界的应用中工作。”所以我坐下来思考我能想到的最复杂的应用程序,尤其是当它不是我写的时候。我无法看到代码。我不知道它是如何构成的。我去找了别人的Java项目,甚至不知道Java的版本,依赖关系,任何东西,并试图看看我是否可以使用这些工具。让我们看看它是否有效。

你们可以看到,这里有一个Java项目。我没有docker文件。我没有kubernetes舱单或Helm图表。对于那些不知道的人,Helm是kubernetes的包管理器。你可以想想Nougat, Pip, Appd, APK,我们可以继续,Maven,好了。这些我都没有。我将使用一个叫做Draft的工具。草案工作与Helm一起简化我的Helm图表创建。你也可以用脚手架做类似的事情。我个人更喜欢Draft,顺便说一下,我是在本地kubernetes集群上进行的。

我只需要起草,然后创建。关于Draft的一个很酷的地方是,我可以真正地从两个命令开始。我不需要更多了。草稿创建刚刚添加了大量的文件到我的工作空间。首先,它给我一个docker文件,你可以看到这里的docker文件实际上是一个多级docker文件,这很好。我们有一些最佳实践,我有一个辅助docker文件,它将从第一阶段复制我的jar文件。现在,因为这是一个JFrog会议,我实际上使用x射线。我有Maven依赖项。我已经设置了我的架构,使用x射线和Artifactory。我将在本地启动JFrog Maven安装,它将编译我的jar。 This is no different than what I would normally have to do in my development. Now, as as result, I don’t actually need this first stage, because everything that first stage is doing, I’m doing either manually or I’ll do in my pipeline. Now, I will have to update a few other things, for one, my application serves on port 80. I need to update the copy line to make sure I don’t have any typos. I’m going to go ahead and, nope, apparently I’m not. I have a fun little trick that I like to cheat with. I have keyboard strokes. There we go.

我要把docker文件粘贴进来。这只是更新了端口。它更新了复制行。其他的都是一样的。我要保存一下。我们已经完成了docker文件。现在,我们来看看图表。

在图表中,我首先通过values文件控制所有内容。我要缩小一点,这样我就能看到一些东西。我需要更新我的内部端口,以匹配docker文件中的内容,这是80-80。我需要确保我更新了我的CPU。就像我说的,这不是"你好"的世界。我需要认识到我的资源请求和限制,所以我将把我的CPU改为256,我们将替换它,我需要把我的内存改为512。

就像这样,从当地的角度来看,这看起来很不错。如果我开始尝试从零到DevOps超级英雄,在我签入它并让我的运维团队和每个人帮助我的DV管道中的所有东西都工作之前,我需要在本地测试所有东西。我不能使用操作管道作为我的沙盒环境。所以我将继续清除,我们将继续起草。这是第二个Draft命令。现在,它要失败了。好了。因为我没有考虑docker ignore文件,它实际上屏蔽了目标目录,但如果我们还记得docker文件,第六行,我是从目标目录复制的。我们再来做一次草稿,这样就能恰当地构建所有东西了,不过我没有保存,希望能管用。我们继续,再做一次草稿,这样它就迭代了。

当它释放并实际启动时,你可以看到它释放得非常快,部分原因是我在docker文件之外构建了所有东西。真的只是需要部署。现在我要为云设置这个。我要让吊舱启动并旋转起来。它正在运行Tomcat。它还是很慢。我用的是JFrog。我将添加一些图像拉取秘密。我们把这里放大一点。我需要添加我的入口,顺便说一下,对于那些不知道的人,在每个演示中我都有一个EngineX代理。 It has TLS set up with Let’s Encrypt, the auto-issues and auto-provision certificates. There is a video at the end that will actually walk you through that, so you can do it by yourself, and by the way, the video’s only 15 minutes long. So I’m going to save.

我所做的就是添加了image pull secrets。我已经在命名空间中创建了秘密。我设置了入口,设置了应用程序洞察,只是这些数据不存在于我的模板中,所以我需要回到我的模板。你开始看到Draft给了你一个框架或者脚手架来开始,然后你可以进入并操作它或者你可以和你的运维团队一起做这件事。

有几件事我需要改变。首先,我知道我的Azure DevOps或CICD管道与BuildID一起工作的方式,我需要确保它是带引号的。我来更新一下。我需要为我的image pull secrets添加供应,所以我要把它添加进去,我需要确保我为我的应用程序洞察力定义了一个环境变量,所以我要继续添加我的环境变量,确保所有东西都对齐了[听不清00:18:17]。我们来快速放大一下。所以你可以看到容器下面的所有东西。我在我的if值图像拉秘密存在,对于那些刚接触Helm的人,我们使用一个值文件来控制你以前硬编码的一切。如果我高亮显示,你会看到代码中引用了多少次value。我只是在管理我在这里定义的任何东西,然后这些只是变量。Helm运行在模板引擎上。 It’s just a template that’s going to parse everything and convert it over into a kubernetes manifest.

所以我将保存我的部署。看起来不错。现在我需要对ingress做同样的事情,只要我把这个拖下来放大,你会发现我的ingress其实很简单,对吧?如果入接口已启用,则需要设置元数据。我没有任何添加注释的能力,如果我要使用任何类型的入口,我都需要添加注释。我没有能力真正定义TLS。事实上,我的路由规则是错误的,因为服务外部端口不存在。我希望它到我的内部端口,因为我是通过代理路由。这个文件有很多问题,所以我要用不同的代码更新它。实际上,我所做的只是改变了注释。 I made sure that I can add in annotations. It’ll take care of the indents, because of the way you can manipulate your templates. I can sit here and change the service port to service.internalport. Every period is an indent in your YAML. That’s the tabs and spaces people joke about. And then you have your TLS. I’m saying if TLS is enabled, please define it.

现在,我们继续缩小。我要点击保存。我们会仔细检查的。看来我引用过了。我添加了我的拉秘密。我加入了环境变量。这看起来也是正确的。我要做的就是提交所有东西用一个超级棒的demo live提交信息。当然,我所有的提交消息都是这样的,我将继续推送它。

我还记得我们在这里发布了一项部署。在演示过程中,我把它推一下是为了节省时间,但我要清除,我要做k个get pod。K是kube控件二进制文件的别名。你可以看到它已经运行了3分43秒,你可以看到如果你可以放大,但我会为你放大。您还可以对k get services做同样的事情,我可以看到服务已经启动并正在运行。我可以像对待其他kubernetes集群一样与它进行交互,但它是在我的系统上本地运行的,只是作为桌面docker的一部分。所以我可以通过任何其他kube控制命令来做同样的事情。我可以向前移植并连接到服务或连接到部署,也可以使用Draft。我告诉过您,Draft将帮助您开始使用两个命令,但它为您提供了一个免费服务,即Draft Connect。这实际上会照顾你的代理隧道。

我可以直接进入它,我可以看到日志,当你放大到第一行,它连接到我的聊天应用程序在这个本地主机地址上,我要选中它,到Chrome,粘贴它,希望我的聊天机器人是工作的,它是,所以我可以看到它。我们将继续登录,确保看起来不错,开始聊天,JLD加入了,但我想与其他人分享。我想传递价值,或者传递我的聊天机器人华夫饼给每个人。

因此,为了保持一致,我在DevOps实践中做的一件事是,我已经建立了一个管道,仅仅是为了节省时间。不过,我想向你们展示一下我是如何做到的。对于那些刚接触Azure管道或Azure DevOps(以前被称为VSTS)的人来说,有点像以前被称为Prince的艺术家,只是这是技术,在5月,大约六周前,我们实际上宣布了统一的管道,所以以前你可以做YAML构建,这就是它,你必须手动为你的发布做所有事情。现在我们可以把所有事情都作为一个管道的一部分来做,这就是这里所设置的。但是如果我不知道我想为YAML添加什么任务,我可以搜索一个任务,填写常规信息,然后Azure管道将为我添加YAML。

现在,我做了另一个很酷的技巧,但首先,让我们继续,看看这里发生了什么。你可以看到在我的主分支上有一个触发器,用来填充我的变量。我在布置舞台。这开始看起来非常类似于我在YAML中定义的任何其他CIDC系统,无论是Jenkins,即使它是groovy,我仍然要定义我的阶段。科德雷什,特拉维斯·CI,都无所谓。我将把它写在代码中,因为这是一种DevOps实践,正因为我们谈论的是容器,并从容器开始,所以你的DevOps实践不会改变。您仍然需要编译应用程序。您需要构建它,以某种方式打包它,并在某个地方发布它。这些原则没有改变。

我已经为构建设置了一个舞台,我的构建步骤,你会注意到,我要缩小到这里,回到我有构建步骤的地方。我从一个可视化的CI中取出它们,我只是通过并添加任务。所有CIDC管道都只是一个任务运行器,我去搜索任务。只有我想要的任务不存在,因为它们是为Artifactory, JFrog准备的。我甚至还绑定了Slack的通知。我做了什么?保持老派作风,回去找巴斯。

我只是传递信息,我登录到docker,我把JFrog CLI放到我的构建服务器上。我正在使用一个私有的构建服务器,因为它为我提供了更多的控制和对增值的可跟踪性,但您也可以使用托管服务器。我们提供各种不同的产品,包括,我一直喜欢让人们看到的,我们也提供托管Mac, Mac Sierra。顺便说一下,如果你有公共项目,它是完全免费的。接下来我要做的几个任务,如果你看这个,是jfrogrt, Maven清洁安装。这与我在本地运行的命令相同。到这里,我在做docker构建和推送。这是我在本地运行的相同命令,确保Helm安装在我的构建服务器上,运行Helm[听不清00:24:12],这样我就可以确保我没有搞砸我的Helm图表。这是我计划的一部分。Helm包,打包并将其作为工件推送到Artifactory,然后将我所有的构建信息发布到Artifactory,因此它添加了我的构建依赖,收集了我的构建环境,推送了docker的所有信息,在一天结束时,我有了一些构建Slack触发器。 Now, I thought about overcomplicating this. In fact, I thought about it a lot. I thought about throwing it into a function, doing Lambda, doing something super cool, but why?

它能增加价值吗?你想知道我最后做了什么吗?保持老派的风格,做个爬行练习。它只是一个http网络钩子,可以直接在我的Slack频道上发布信息。沿着这些思路,我们来看看发生了什么。看起来我们的demo坏了。还好是我计划好的,不然就太尴尬了。

让我们向下滚动,看一下x射线触发器,就在这里,x射线扫描警报被找到了。我说过我用的是JFrog Artifactory x射线。我还制定了政策,如果你违反了这个政策,你就不能继续进入任何你想去的地方。所以让我们也来看看我们的Slack通知。你可以看到我有一个Artifactory通知,x射线扫描报告,和管道。第二次x光扫描失败了,我的管道失败了。我可以从x光扫描报告中钻出来,确保我已经签到,并查看我的x光信息。放大这里,我有74条违规。我有一些高度的安全顾虑。你想知道我看到的最基本的东西吗? Is my base image is Debian, number one. I don’t like using Debian-based images. It’s a larger image. It’s a wider attack surface, but most importantly, if we remember, because I started from scratch, I’m using a public image. I have no idea what’s in there. I have no control over the security or anything else. So when we start talking about from zero to DevOps superhero, the only way to become a superhero, to become really good at things, is to remember the basics. Remember security. Remember what gets baked into that cake, into those layers.

我要注释掉这一行,然后取消注释我的这一行。你会注意到我在这里有我自己的镜像,我添加了,我修补了,我切换到Alpine。它不仅是原来的四分之一大,而且更安全。我们来添加这个,x射线贴片,如果我能拼出来的话,然后按一下。现在,当这推动并触发另一个构建时,让我们回到Slack。让我们来看看我们的构建构件,对吗?我正在为Maven构件使用JFrog。这意味着现在我有了与我的构建所发生的每一件事情的直接链接,因为我把它推到了Slack频道,你可以把它推到仪表板或其他任何你想要的地方,我可以很容易地看到和访问这些信息,这将帮助我找出是否出现了问题,帮助我计划下一个冲刺,帮助我确定我是否交付了价值。你可以把世界上所有的钱都投入到你的软件上,你可以尝试交付尽可能多的新功能。如果它不起作用,如果它不起作用,你就没有提供任何价值,你还不如把钱扔出去。

你可以看到,我有三个不同的模块。第一个是我的jar文件,我可以看到所有80个依赖项。我可以回到我发布的模块。在JFrog下面,放大这里,可以看到tar文件?我们可以向后滚动。我能看到那边的树。我可以进入Artifactory,查看下载次数。这其实只是个头盔图,一点都不花哨。我想回到Slack,回到我想要的地方。我想给你们特别展示Dockerfile。 So I have a docker manifest, right? Scrolling down, I can see my manifest jsum. I can view that, and I can go over into the tree where I can see that information. So not only do I have traceability because all my notifications are in one place, I also have traceability because I have links back to everything, because these systems are integrated. I can go to X-ray and I can see this was still the high build. I’m still waiting for the next build to start, so let’s double check and make sure that is starting.

好了。所以我在等待下一次扫描。一旦它被过滤,我将能够查看是否检测到问题。我们来检查一下。好了,看起来已经结束了,让我们回到Slack。好了。现在我已经构建了工件。还是绿色的,但我的x光扫描报告现在是绿色的。我修好了警报。看看我能修复多少个警报。 I fixed all of them, by changing an image that I owned, that I patched. I still have two security alerts, but they’re low, and I can sit there and address it based on priority. But now I have that visibility, and I can get that information when I go back over to Slack and go back to artifacts, I can go back over to that manifest, go back over and link right from here. There’s my latest build, as soon as it loads. Here’s my X-ray report, and now I have no scanned issues. And if I want to see more, I could see more right here from the details in X-ray. So let’s scroll back out, looks like I did this well, so it looks like it’s deploying to the environment.

现在,我们来谈谈这个。环境在Azure DevOps中是一个相对较新的概念,但我所做的只是基于我的Azure集群设置环境,或者我可以做任何类型的kubernetes集群。我可以将一个环境部署到三个不同的云上。我可以做谷歌,亚马逊和微软,因为我想包容一切。

我要做的就是去我的环境,点击新环境,选择kubernetes。可能需要给它一个名字,我选择test,然后选择提供商。它是通用的还是Azure的?Azure将帮助我创建一个表面原理,一般你将创建一个服务帐户,但一旦你进入环境,我就可以看到信息。我可以深入研究它,这就是可追溯性非常酷的地方。我能看到真正的豆荚。我能看到复制品。我可以看到选择器,标签,所有我手动运行命令的信息,我现在有可追溯性和可见性,知道正在运行什么,在哪里运行。我有可以看到的日志。我不需要去看,这个能运行了吗? I can see the actual YAML of my pod.

我可以深入到我需要的深度,如果这还不够,我还在这个集群上设置了Azure Monitor,这样我就可以看到我的笔记的CPU利用率。我可以从整体上看,我在等待它回到平均值。我甚至没有超过20%我的内存利用率,可能超过了26,所以我只使用了四分之一。我的节点数总是3,所以我知道节点是在线的并且健康的。我现在有41个pod,所以我可以看到集群中有多少个pod在运行,我可以看到我的服务器响应时间和我的实际应用程序的服务器请求,因为我在Helm图表和部署中嵌入了应用程序洞察,所以它在那里确保,你的应用程序是否启动并运行?我还可以更进一步,做一些事情,比如亮度检查或准备就绪检查,这些都是我的Helm图表的一部分,只是使用草稿,Helm,一些监控。你可以用普罗米修斯或者格拉夫纳。它变得有点复杂,但我只是用了非常基本的东西。标准CIDC,吃水,舵。 There’s really nothing else that’s complex. Obviously I have JFrog Artifactory and X-ray, but I’m using the same CLI I would do normally.

让我们快速回到ppt。我们就要结束了。好吧,让我们来谈谈发生了什么,因为对于在座的那些可能对容器和kubernetes还不熟悉的人来说,这可能看起来令人难以置信。对于那些以前做过这个的人来说,那可能是,“啊,再给我一些,我想要更多的华夫饼。”本质上,我有来自git hub的代码,顺便说一下,如果你是新手,我做的每个演示都是开源的,都在git hub上。在结尾有链接。我甚至有各个部分的视频,很容易理解,所以你可以去学习。但是代码在git hub上。

我使用Azure DevOps作为kubernetes管道。我做过同样的演示。事实上,我在一个半星期前用Codefresh做过,与CIDC系统无关。你可以通过某些人获得更多的见解,但渠道将保持不变。我仍然需要编译我的代码。我要建立,然后我要把它推到某个地方。理想情况下,您应该将其推到高度可用的私有容器注册表中。我选择了Artifactory。我已经准备好x光了。我们用Aqua做了同样的演示,用于某种扫描。 You want to make sure you know what’s going on in your containers, in your pods, and in your code, and then I packaged up my Helm chart. Even my Helm chart is in a private repository in Artifactory, and then I deployed it out to kubernetes on Azure. I could have deployed it out to AWS, Google, doesn’t matter. The principles are going to remain the same.

现在,再一次,对于那些被灭霸影响并且已经五年没有出现的人,kubernetes是新的,你想知道它是否是糖果,记住它是一个开源的容器编排器。它是专门为自动部署、扩展和管理应用程序而设计的。有很多特性和功能,不幸的是它非常小,但是像负载平衡,秘密管理,你可以把它和密钥库联系起来。所有这些功能都是内置的。您不需要为容器的复杂世界增加额外的复杂性,只是为了理解它。利用其他公司拥有的工具来简化您的开销。

这就是我介绍赫尔姆的原因。Helm是包管理器。它是kubernetes事实上的包管理器。它由模板引擎提供支持。我无法告诉你有多少次我把kubernetes清单搞砸了,因为我把一个标签的名称放在一个文件中,然后我把它搞砸了,我不记得它在另一个文件中,然后我复制了一些东西并粘贴进去,这把一切都搞砸了。制表符显然是空格。我认为标签在构建中胜出,但kubernetes很难。YAML很难。Kubernetes很复杂。让我们简化。 Keep it simple, right? Draft was designed to simplify Helm even further, so it gives you that framework and that scaffolding to get started. It gives you a basis. It’s not going to do it for you, there’s some knowledge that you’re going to have to have on how things work, but it helps you get started.

所以下一张幻灯片我真的想谈谈,因为这可能是我最常被问到的问题。我用什么?怎样才能让这一切变得简单呢?答案是我不知道,因为你的环境和工作流程会和我的完全不同。事实上,就像你们看到的我的终端,如果你们有问题,在最后也有一个链接。我一直在上传我终端的照片。事实上,这是我非常出名的东西,所以有人在Twitter上评论说,“为什么要使用Vim?你为什么不用Emax?为什么用ZSH而不用Fish?为什么使用OMZSH或Vundle,为什么选择这个?” And giving me crap for it, and the difference is I have very specific reasons, but also, why does it matter? What works for me might not work for you, and what works for you might not work for me.

重要的是,所有这些工具都是建立在完全相同的实践基础上的,所以最终,DevOps的容器版是,你猜怎么着?这和普通的管道没什么区别。例如,某些工具(如Codefresh)具有基于容器的管道。所以它为你提供了额外的粒度和控制,因为你有额外的隔离,而不是管理构建服务器和构建虚拟机,但在一天结束的时候,它仍然是在相同的框架上构建的,无论你使用Travis或Jenkins或Octopus,你仍然要确保你有图像扫描捆绑在一起。无论你是否使用x射线,x射线与Aqua集成,现在JFrog刚刚宣布了JFrog管道。有这么多不同的工具,因为他们想确保你有一个选择,什么是最适合你的工作流程和你的环境。

最近有人提醒我,我可能会很啰嗦,我相信这只是因为我有一个非常详细的工程师大脑,但我真的试着把它缩小,我现在甚至在我的工作流程中也会想到这一点。吻。现在,你可能会想到一个不同的类比。我确保它是合适的。保持超级简单。这不是骂人。不要把这个过程复杂化。看看基本原理。这将使你成为超级英雄,这将使你的管道增压。事实上,我今天早上醒来看到这条推特,我很喜欢。 Kelsey Hightower actually retweeted it from Abby Fuller. I don’t know who needs to hear this, but not everything needs to be a kubernetes CRD. Now, for those of you in the room who have never tried to extend kubernetes, since kubernetes is extensible, I can add on custom resource definitions, which adds on additional objects, something more than deployment and namespace and replica set, PBC. I can make it as big as I want, but not every single thing needs to do that. Just like my Slack notifications didn’t need to be a function. It can be a crawl command. All it needs to do is offer value.

还记得开头吗,只要我们都朝着最终目标前进,我们就在朝着正确的方向前进,沿着同样的主题,我最近再次投入到《神盾局特工》中,我喜欢这句话。你采取的步骤不必很大。他们只需要把你带到正确的方向。很多人坐在这里想,“kubernetes, docker,我太不知所措了。液体软件,这个管道工具,这个,这个。”你不必一开始就跑到比赛的终点。你不会成功的。所以只要迈出一小步。咬掉那些有意义的碎片。

这里有一些问题可以帮助你。问问你自己,我的主要目标是什么?我想通过这次投递达到什么目的?什么能提供价值?接着是一些能帮助我判断是否达到这些目标的指标,不管是容器,还是web应用,还是无服务器,都不重要。怎样才能表明我达到了这个目标,或者我与我向客户承诺的SLA保持一致呢?然后你可以继续,我的管道会是什么样子?我构建的管道已经在git hub上。你会得到它的链接。你可以坐在那里玩它。 In fact, I have a secondary [inaudible 00:38:38] that I’ll throw up there that has a very similar pipeline for a project called Croc Hunter that works with Codefresh.

管道实际上看起来是一样的,因为它们是结构化的。我们从结构开始。我们总是要编译我们的代码。我们总是要构建和推送这些代码,或者把它放在某个地方。我们将不得不扫描,做一些构建测试,代码覆盖,某种扫描。我们将部署到我们的环境中,无论是部署到开发,还是部署到Prod QA。在此期间,当它部署到开发时,您可能会进行一些测试。你可能会做一些UI测试。你要确保它已经准备好进入下一个环境。也许你会设置门槛,这样你就不需要每个晋升都有人工审批人。 You can actually use gates where you can query a function and make sure that you are testing things in accordance. You can have a query monitor alert, make sure that if there’s a certain amount of browser exceptions, don’t let it into QA.

然后你会跟进你的晋升,但所有这些需要完成的任务,不管你使用什么工具,都将归结为相同的功能。理想情况下,如果您希望具有可追溯性和可见性,那么您将拥有一个私有包提要。你会想要有一个私有的存储库来存放这些信息,无论是你的docker图像,你的Helm图表,你的工件。你将使用某种扫描工具。您将使用某种类型的CICD工具,每个CICD工具都略有不同,因为它可能做更多的事情,而不是另一件事情,也许它更适合您的环境中需要的东西。只有你自己知道,然后你就可以进行测试了。也许你会使用Selenia,也许你会使用White Source Bolt,或者谁知道呢。然后你就会回到你的CICD。你要靠基础知识。

无论如何,基础都是一样的。事实上,当人们开始问,“嗯,kubernetes很棒,我听说无服务器更好。难道我不应该把无服务器投入到kubernetes和web应用程序中吗?我想要这一切。”无论你选择做什么,确保它能提供价值,但记住,在一天结束时,你要设计的过程是相同的。问问你自己,这会增加价值还是会增加不必要的复杂性?因为如果它没有给你增加任何价值,它只会增加额外的开销,额外的资源来管理,你只是在浪费钱,最重要的是,我告诉过你们我会尽可能多地提到华夫饼。2022世界杯阿根廷预选赛赛程记住,在一天结束的时候,它只是一个华夫饼,我不仅仅是在谈论容器。即使你的DevOps管道也只是一个华夫饼,如果你记得它只是一个传递系统,你在传递价值,或者在华夫饼的情况下,你在传递幸福。老实说,如果你为你的最终用户服务,你可能也在传递快乐,或者就像我们开始时那样,生活是靠代码运行的。有时你可能是在传递生命和可持续发展。

不过说到底,这只是一个输送系统。不要把事情复杂化。现在,对于那些刚接触kubernetes的人来说,如果你特别想知道一些最佳实践,我在整个会议中都有提及。首先,建造小型容器。你们看到了我是如何将我的基本镜像,Debian镜像切换到Alpine,然后做了一些小补丁不仅缩小了,我没有给你们看图像的大小,但一个是25mb,另一个是5mb,所以它实际上是Debian镜像大小的25%,但我有了一个更小的攻击表面积。我可以更好地保护并拥有一个性能更好的容器。尽可能利用多级docker文件。你并不总是需要这样做。无论哪种方式,我都将在docker文件中或在docker文件之外构建Maven jar文件,但首先进行构建。我在构建时并不经常需要这些相同的内核组件,因此请考虑您的体系结构。 And that leads us in to application architecture. Use namespaces. Lock them down. Use managed surface identities. Use role-based access control. Use Helm charts. Use things that simplify the process and not overcomplicate it.

执行健康检查。我简要地提到了它,但这是我可以设置亮度和就绪探测来ping我的http端口,并确保它响应一个200代码的东西。因为kubernetes是声明性的,所以我可以确保,如果这是不健康的,kubernetes将尝试自动重新启动它。这比我现在做的要少得多。设置资源请求和限制。没有人希望出现任何形式的内存泄漏。没有人想要一个东西只是坐在那里,占用他们所有的资源。2022世界杯阿根廷预选赛赛程这没有任何意义,也不会带来价值,最后,要注意你的服务。

所以我总是说,不要依赖负载平衡器,每次都有人问我为什么。首先,从成本和管理的角度来看,它们都很贵。你仍然可以通过HTP应用程序路由、nginx、Apache或Istio服务网格进行路由,还有很多其他方法来处理流量并最大化你的资源。2022世界杯阿根廷预选赛赛程集群中甚至还有流量管理器,Istio,流量,以及其他一些东西。你可以使用流量管理器或Azure前门之类的东西,它实际上位于集群的第七层之外,你可以使用它来在多个区域的多个集群之间实现负载平衡。您可以扩展,因为它将我引入外部服务,因此您实际上可以通过利用专门为该任务设计的外部服务来利用您的资源。2022世界杯阿根廷预选赛赛程它甚至会进入数据库、存储等等。

最后,我从来没有正式介绍过我自己,因为这不是杰西卡秀,这显然是容器秀,但非常感谢你们邀请我。我叫杰西卡·迪恩。坦率地说,我来这里是因为我喜欢技术社区,所以之前有人问我,为什么Swamp Up是我最喜欢的会议,因为我可以和像你这样的优秀工程师一起玩。他和詹姆斯·迪恩没有亲戚关系。我写这个是因为我的姓有两个e。你可以在Twitter, Instagram和git hub上关注我的jldeane。你也可以把我加到领英上,但说实话,我不经常看,所以我为那些经常看的人道歉,但我确实有,最后,这可能是每个人都在等待的幻灯片。你可以得到所有的资源包括deck, YAML文2022世界杯阿根廷预选赛赛程件的链接,代码,我今天演示的每一个东西,在aka。ms/jldeaneswampup19,或者你可以拍一张QR码的漂亮照片,这将带你直接了解我的要点。

最后,非常感谢大家。

在云中免费试用JFrog !