从零到DevOps超级英雄:容器版- Jessica Deen,微软
微服务可能很难;许多容器最佳实践仍在探索中。本课程通过将DevOps最佳实践融入其中,帮助最小化容器编排(特别是Kubernetes)的学习曲线。只需选择专门为简化流程而构建的容器工具,就可以从零开始成为DevOps超级英雄。了解这些工具如何为云服务提供更好的编排,为微服务部署提供更好的抽象和封装,以及运行在何处和为什么运行的可见性。
视频记录
大家好。我们将在两分钟后开始。我想确认一下。我想我们关门了。我们可以提前两分钟开始,如果后排的人不介意的话。我做得好吗?好吧。我要在这里启动我的谷歌时钟,这样我就可以跟踪我自己。好的,欢迎。你好,每个人。 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?
太棒了!
和你好。耶!好了,这是从0到DevOps超级英雄,容器版,我已经讲过几次了。每次都是不同的,但我真的想关注的是,如果你已经采用了DevOps,你已经在做像液体软件这样的事情,你怎么能坐在这里把这些实践应用到容器中,为什么你一定要关心?也许您已经在做容器了,您正在尝试找出最佳实践,如何进一步简化它,如何对正在发生的事情具有一些可见性和可追溯性。这将是您的会话,我们将从头开始在容器和Kubernetes方面。因此,我们将按照会话描述的建议使用Kubernetes。在我们开始之前,因为我们还有47分钟因为我提前了两分钟开始,我想确保我们已经设定好了一个议程关于我们将要讨论的内容。
正如标题所暗示的那样,从零到DevOps超级英雄,我不可能在45分钟内把任何人变成漫威超级英雄漫画,真的,我没有超能力,所以我不可能在任何时间内做到这一点,但我能做的是让你思考,让你兴奋,给你一些资源,让你可以在自己的时间里玩这些东西。2022世界杯阿根廷预选赛赛程这节课是为了告诉你什么是可能的。
现在,让我们谈谈我们的行业。我们来谈谈现在的情况。我们所知道的生活是靠代码运行的。在你的生活中,没有代码你什么都做不了。我认为这张幻灯片很有趣,因为即使是一辆车,我很抱歉,我不能让这张幻灯片更大,但一辆豪华车,我很确定普锐斯或特斯拉可能是一样的,使用1.2亿行代码来操作。它实际上使用的不仅仅是一架航天飞机,我觉得这很有趣,它有40万行代码。你甚至有一个简单的交通系统,当你走出去过马路的时候,它使用了500万行代码。现在我们开始在医疗保健和开源技术方面取得更大的进步,实际上我的一个同事有一个人工胰腺,让他活了三年,他的人工胰腺是开源的,用了16万行代码。他的名字叫斯科特·汉瑟曼,一个不太知名的人,你可能听说过他,但生活确实是靠代码运行的,对斯科特来说,他的生活取决于代码。
所以对于我们这些从事技术工作的人,对于我们这些软件工程师,操作工程师,各行各业的人,我们该如何处理这个问题?我们如何从液态软件扩展?我们该如何调整我们的管道,以使用容器、服务器列表和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密钥和部件的图像。可能不是个好主意。尽可能使用多级码头。传递信息,确保你没有发布不应该发布的内容。容器层是实际发生读写操作的地方,再一次,我们回到食物,因为它很像蛋糕。考虑一下你把重要的信息放在这些层的什么地方,并确保你放在这些层中的信息是有价值的。
我们已经讨论了开发人员和运营人员面临的问题,所以请记住两者之间的优势。容器为开发人员提供了快速迭代和敏捷的交付系统,以及一些不可变和可移植的东西,然后运维人员也从这种可移植性中受益,因为它提供了更大的成本节约。由于标准化的环境,我现在有一个更有效的部署,我甚至可以做一些事情,比如[听不清00:11:56]爆发,我可以从私有云到公共云再到多云。我有很大的扩展能力,所以我相信坐在这里看着我用我的手说话和使用ppt是很有趣的,让我们开始一个演示吧。我们之后会讨论演示。我假设在座的一些人使用过容器,对kubernetes有一定的经验。如果没有,我会复习一下,但这真的是你留在房间里的点击诱饵,因为我现在要给你看一些超级棒的东西。
所以开始,我试着真诚地倾听所有的反馈我得到我所有的课程,和我读每一个反馈,但我告诉你,不管有多少次人们把它放在那里,我无法控制温度在房间里,房间的气味或任何设施控制,因此,当你把它放在那里,知道我同情你,但它不是完全有用的反馈。现在,如果你告诉我你喜欢我的鞋子,这是有帮助的,因为它鼓励我去买更多的鞋子。
然而,我在反馈中听到的一件大事是,“我们厌倦了hello world。您可以谈论kubernetes和容器,并使用所有这些工具,这很好,但这只适用于hello world。这在现实世界的应用中是行不通的。”所以我坐下来思考我能想到的最复杂的应用程序,尤其是当它不是我写的时候。我对代码没有可视性。我不知道它是如何构建的。我去找别人的Java项目,甚至不知道是什么Java版本,依赖关系,任何东西,分叉它,并试图看看我是否可以使用这些工具。让我们看看它是否有效。
你会看到,这里有一个Java项目。我没有docker文件。我没有kubernetes清单或Helm图表。对于那些不知道的人,Helm是kubernetes的包管理器。你可以想想牛轧糖,Pip, Appd, APK,我们可以继续,Maven,就是这样。我没有这些。我将使用一个叫做草稿的工具。Draft与Helm一起工作,简化我的Helm图表创建。你也可以用Scaffold做类似的事情。我个人更喜欢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文件。现在,让我们来玩一下图表。
图表中的第一件事,我通过我的值文件控制一切。我把这里缩小一点,这样我就能看到一些东西。我需要更新我的内部端口,以匹配我的docker文件,这是80-80。我需要确保我更新了我的CPU。就像我说的,这不是你好世界。我需要认识到我的资源请求和限制,所以我要把我的CPU改为256,我们将替换它,我需要把我的内存改为512。
就像这样,从当地的角度来看,这看起来很不错。如果我刚开始尝试从零到DevOps超级英雄,在我签入并在我的DV管道中让我的运维团队和每个人都帮助我之前,我需要在本地测试所有内容。我不能把运维管道当成我的沙箱环境。所以我要开始清理,我们要开始起草。这是第二稿命令。现在,它要失败了。好了。因为我没有考虑我的docker忽略文件,它实际上阻塞了目标目录,但是如果我们记得我的docker文件,第6行,我是从目标目录复制的。我们再来做一次草稿,这样就能正确地构建所有东西,不过我没有保存这个,希望能行。我们再来一次draft up,它会迭代。
当它在释放和启动时,你可以看到它释放得很快,部分原因是我在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.
现在,我所做的只是添加了图像提取秘密。我已经在名称空间中创建了secret。我设置了入口,设置了应用程序洞察,只是数据不存在于我的模板中,所以我需要转到我的模板。你开始看到Draft为你提供了开始的框架或脚手架,然后你可以进入并操纵它或者你可以与你的运营团队一起做这件事。
有些地方我需要改一下。首先,我知道我的Azure DevOps或CICD管道与BuildID一起工作的方式,我需要确保它在引号中。我来更新一下。我需要为我的图像拉秘密添加准备,所以我要继续添加,我需要确保我为我的应用程序洞察力定义了一个环境变量,所以我要继续添加我的环境变量,确保一切都对齐[听不清00:18:17]。我们快速放大一下。所以你可以看到容器下面的所有东西。我在我的值图像拉秘密存在,对于那些谁是新的掌舵,我们使用一个值文件来控制一切,你以前会硬编码。因此,如果我高亮显示,您将看到代码中值被引用了多少次。我只是管理我在这里定义的东西,然后这些只是变量。Helm运行在模板引擎上。 It’s just a template that’s going to parse everything and convert it over into a kubernetes manifest.
所以我将保存我的部署。看起来不错。现在我需要对入口做同样的事情,只是如果我把它拖下来放大,你会注意到入口其实很简单,对吧?如果使能了入接口,则设置元数据。我不具备添加注释的能力,如果我要使用任何入口,我都需要添加注释。我没有能力真正定义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 pods。K是kube控制二进制文件的别名。你可以看到它已经运行了3分43秒,你可以看到如果你可以放大,但我将为你放大它。您也可以对k个get服务做同样的事情,我可以看到服务已经启动并运行了。我可以像对任何其他kubernetes集群一样与它交互,但是它在我的系统上本地运行,就像桌面的docker的一部分。因此,我可以像使用其他kube控制命令一样执行一些操作。我可以转发并连接到服务或连接到部署,或者我可以使用Draft。我告诉过你,Draft将帮助你开始使用两个命令,但它会给你一个免费的东西,那就是Draft Connect。它实际上会为您处理代理隧道。
我可以直接进入,我可以看到日志,当你放大到第一行,它连接到本地主机地址上的聊天应用,我高亮它,切换到Chrome,粘贴进去,希望我的聊天机器人能正常工作,我能看到。我们将继续登录,确保看起来不错,开始聊天,JLD加入,但我想与其他人分享。我想给每个人传递价值,或者传递我喋喋不休的华夫饼。
因此,我在DevOps实践中做的一件事是,我已经建立了一个管道,只是为了节省时间。不过,我想给你们展示一下我是怎么做的。对于那些刚接触Azure管道或Azure DevOps的人来说,以前被称为VSTS,有点像以前被称为Prince的艺术家,只是这是技术,在5月,大约六周前,我们实际上宣布了统一管道,所以以前你可以做YAML构建,就是这样,你必须手动完成发布的所有事情。现在我们可以把所有的事情都作为一个管道的一部分,这就是这里设置的。但是,如果我不知道YAML需要什么任务,我可以只搜索一个任务,填写常规信息,然后Azure管道将为我添加YAML。
现在,我做了另一个很酷的技巧,但首先,让我们继续看看这里发生了什么。你可以看到在我的主分支上有一个触发器,并填写我的变量。我在布置舞台。这看起来与我在YAML中定义的任何其他CIDC系统都非常相似,无论是Jenkins,尽管这很好,但我仍然要定义我的阶段。重新写代码,崔维斯CI,没关系。我将把它写在代码中,因为这是DevOps实践,而且正因为我们在谈论容器,并且从头开始使用容器,所以您的DevOps实践不会改变。您仍然需要编译应用程序。您需要构建它,以某种方式打包它,然后在某个地方发布它。这些原则始终如一。
我已经为构建设置了一个舞台,我的构建步骤,你们会注意到,我将放大这里回到我得到构建步骤的地方。我把它们从可视化CI中取出来,我只是浏览并添加任务。所有CIDC管道都只是一个任务运行器,我去搜索任务。只有我想要的任务不存在,因为它们是给Artifactory, JFrog的。我甚至还绑定了Slack通知。我做了什么?保持老派作风,回到巴斯身边。
所以我只是传递信息,我正在登录docker,我正在把JFrog CLI放到我的构建服务器上。我使用私有构建服务器,因为它给了我更多的控制和可追溯性,但您也可以使用托管服务器。我们提供各种各样的产品,包括我一直希望人们看到的,我们也提供托管Mac, Mac Sierra。顺便说一下,如果你有公共项目,它是完全免费的。接下来我要做的几个任务,如果你看这个,是JFrog RT, Maven clean install。和我在本地运行的命令是一样的。到这边来,我在做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频道。沿着这些思路,让我们去看看发生了什么。看起来我们的演示坏了。还好我计划好了,不然就太尴尬了。
让我们往下滚动,看看我们的x射线触发器,在这里,发现了x射线扫描警报。我告诉过你我用的是JFrog人工x光。我还制定了一些政策,如果你违反了这一特定政策,你就不能继续进入你想去的任何地方的快乐之门。让我们继续检查我们的Slack通知。您可以看到我有一个人工通知、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。让我们看一下我们的构建工件,对吗?我将JFrog用于我的Maven工件。这意味着现在我可以直接链接到我的构建中发生的每一件事,因为我把它推送到Slack频道,你可以把它推送到仪表板或任何你想要的地方,我可以很容易地看到和访问这些信息,这将帮助我发现是否有问题,帮助我计划下一个冲刺,帮助我弄清楚我是否提供了价值。你可以把世界上所有的钱都投入到你的软件上,你可以尝试提供尽可能多的新功能。如果它没有上升,如果它不起作用,你就没有提供任何价值,你还不如把钱扔掉。
你可以看到,这里有三个不同的模块。第一个是我的jar文件,我可以看到我所有的80个依赖项。我可以回到我发布的模块。我可以看到在JFrog下,我们放大这里,你可以看到我有一个tar文件,对吧?我们可以滚动回去。我能看到那边的树。我可以去人工工厂,看看它被下载了多少次。这只是一个Helm图表,并不花哨。我想回到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集群。我可以将一个环境部署到三个不同的云上。我可以做谷歌、亚马逊和微软,因为我想包容一切。
我所要做的就是进入我的环境,点击new environment,选择kubernetes。可能需要给它一个名字,我说test,然后选择提供者。它是通用的还是Azure?Azure将帮助我创建一个表面原则,一般来说,你将创建一个服务帐户,但一旦你进入环境,我就可以看到信息。我可以深入研究,这就是可追溯性变得非常酷的地方。我能看到真正的豆荚。我能看到复制品。我可以看到选择器,标签,所有我手动运行命令的信息,我现在有了可追溯性和可见性,知道什么在运行,它在哪里运行。我有可以看到的日志。我不需要试着去看,它是否启动并运行? I can see the actual YAML of my pod.
我可以根据需要深入研究,如果这还不够,我还在这个集群上设置了Azure Monitor,这样我就可以看到我的笔记的CPU利用率。我可以把它看作一个整体,我在等待它回到平均水平。我甚至没有超过20%我的内存利用率,我可能超过了26,所以我只使用了我应该使用的四分之一。我的节点数总是3,所以我知道我的节点是在线的,健康的。我现在有41个pod,所以我能看到集群中有多少pod在运行,我还能看到服务器响应时间和实际应用的服务器请求,因为我把应用洞察嵌入到我的Helm图和部署中,它能确保,你的应用是否启动并运行?我还可以更进一步,做一些像轻度检查或准备检查之类的事情,这些都是我的头盔图表的一部分,只需要使用草稿、头盔和一些监控。你可以用Prometheus或者Grafana。它变得有点复杂,但我只是用了一些基本的东西。标准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的原因。Helm是包管理器。它实际上是kubernetes的包管理器。它是由模板引擎驱动的。我不能告诉你有多少次我把kubernetes清单搞砸了,因为我把一个标签的名字放在一个文件中,然后我把它搞砸了,我在另一个文件中记不住它,然后我复制了一些东西并粘贴进去,这把一切都搞砸了。显然,制表符是空格。我认为tab在构建中获胜,但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)具有基于容器的管道。因此,它为您提供了额外的粒度和控制,因为您有额外的隔离,而不是管理构建服务器和构建vm,但在一天结束时,它仍然将构建在相同的框架上,无论您使用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,我太不知所措了。液态软件,这个管道工具,这个,这个。”你不需要马上跑到比赛的终点。你不可能成功的。所以只要迈出一小步。咬掉有意义的部分。
这里有一些问题可以帮助你。问问你自己,我的主要目标是什么?这批货我想要达到什么目的?什么能提供价值?然后是一些指标来帮助我判断是否达到了这些目标,无论是容器,还是网络应用,还是无服务器,这些都不重要。什么表明我达到了目标,或者我与我向客户承诺的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工具都略有不同,因为它可能比另一种工具做更多的事情,并且可能更适合您的环境中需要的东西。只有你自己知道,然后你就可以进行测试了。也许你会用赛琳娜,也许你会用白源闪电,谁知道呢。然后你就会回到你的CICD。你要回归到最基本的。
无论如何,基础都是一样的。事实上,当人们开始问,“嗯,kubernetes很棒,我听说无服务器更好。难道我不应该把无服务器应用到kubernetes和web应用程序中吗?我想要这一切。”无论你选择做什么,都要确保它能带来价值,但要记住,你要设计的过程是一样的。问问你自己,这会增加价值还是会增加不必要的复杂性?因为如果它没有给你带来任何价值,只会增加额外的开销,增加额外的资源来管理,你只是在浪费钱,最重要的是,我告诉过你我会尽可能多地提到华夫饼。2022世界杯阿根廷预选赛赛程记住,在一天结束的时候,它只是一个华夫饼,我说的不仅仅是容器。甚至你的DevOps管道也只是一个华夫饼,如果你记得它只是一个交付系统,你正在交付价值,或者在华夫饼的情况下,你交付的是快乐。老实说,如果你在服务你的终端用户,你可能也在传递快乐,或者就像我们一开始说的,生活是靠代码运行的。有时你可能会传递生命和可持续性。
但说到底,它只是一个运送系统。不要让它过于复杂。现在,对于那些刚接触kubernetes的人,如果你特别想知道一些最佳实践,我在整个会议中都提到了它们。首先,构建小型容器。你们看到了我是如何把我的基础图像,从Debian切换到Alpine的,然后做了一些小补丁不仅减少了,我没有给你们看图像的大小,但一个是25兆字节,另一个是5兆字节,所以它实际上是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.
实施健康检查。我简要地提到了它,但这是我可以设置lightness和readiness探针来ping我的http端口并确保它以200代码响应的事情。这样我就可以确保,因为kubernetes是声明式的,如果这是不健康的,kubernetes将尝试自动重启它。我所做的管理要比我自己做的少。设置资源请求和限制。没有人想要任何形式的内存泄漏。没有人想要一些东西只是坐在那里使用他们所有的资源。2022世界杯阿根廷预选赛赛程它没有任何意义,它不会带来价值,最后,要注意你的服务。
所以我总是说,不要依赖负载平衡器,每次都有人问我为什么。首先,无论是从成本角度还是从管理角度来看,它们都很昂贵。您仍然可以通过http应用程序路由,nginx, Apache或Istio服务网格来路由,有很多其他方法来处理流量并最大化您的资源。2022世界杯阿根廷预选赛赛程甚至还有流量管理器,Istio,流量,集群内的其他一些东西。你可以使用流量管理器或Azure前门之类的东西,它们实际上位于第七层的集群之外,你可以使用它在多个区域的多个集群之间进行负载平衡。你可以扩展,因为它会把我引入外部服务,所以你可以利用你的资源,通过利用专门为这项任务设计的外部服务。2022世界杯阿根廷预选赛赛程它甚至会进入数据库,存储等等。
最后,我从来没有正式介绍过我自己,因为这不是杰西卡的展览,这显然是集装箱展,但非常感谢你们邀请我。我叫杰西卡·迪恩。坦率地说,我来这里是因为我喜欢技术社区,所以我之前被问到为什么我最喜欢的会议是Swamp Up,因为我可以和像你们这样优秀的工程师们一起出去玩。和詹姆斯·迪恩没有关系。我把这个写在这里是因为我的姓有两个e。你可以在Twitter、Instagram和git hub上关注我的在线账号jldeane。你也可以加我在LinkedIn上,但说实话,我不经常查看,所以我向那些查看的人道歉,但我确实有,最后,这可能是每个人都在等待的幻灯片。你可以得到所有的资源,包括deck,到YAML2022世界杯阿根廷预选赛赛程文件的链接,代码,我今天演示的所有东西。ms/ jldeaneswampu19,或者你可以拍一张二维码的照片,这样你就能明白我的意思了。
最后,非常感谢大家。
