Tsofia Tsuriel
DevOps工程师

在过去的两年中,JFrog开始在Kubernetes中部署和管理JFrog SaaS应用程序,并将其部署到三大公共云(AWS、GCP和Azure)上。在此期间,我们获得了很多有用的和重要的教训。在这节课中,Tsofia将和大家分享一些JFrog的故事,以及从中学到的(有时是艰难的)教训。

视频记录

大家好,感谢你们今天来到SwampUP,我很高兴你们和我在一起。首先,让我自我介绍一下。我是JFrog的Tsofia Tsuriel,我已经在JFrog工作了3年多了。我的职业生涯是从配置管理工程师开始的,也就是我们今天所说的DevOps工程师的前身。之后,我做了几年的C实时软件开发人员,然后加入了JFrog。从我在JFrog的第一天起,我就一直在从事Kubernetes项目,2018年我们开始为JFrog SaaS应用程序开发基于Kubernetes的解决方案。

我非常自豪地说,我是公司这个项目的一部分,我认为它将JFrog SaaS解决方案提升到了一个全新的水平,它是基于Kubernetes平台的新一代SaaS解决方案的一个很好的例子。今天,我要和大家谈谈我们在Kubernetes世界中的历程,让Kubernetes成为JFrog SaaS的基础设施平台的历程。我将向您介绍我们必须解决的问题,我们如何使用Kubernetes解决这些问题,以及我们在整个过程中学到了什么,因此您也可以从我们的经验中学习。
我相信不同的公司和不同的团队可能会有不同的体验,但基本上我认为我们想要解决的问题对很多公司来说都是共同的,使用Kubernetes来解决这些问题可能是一个非常好的解决方案,如果不是最好的解决方案的话。在这一节课中,我会尽量给出真实的例子,在这一节课中,我将能够在聊天窗口中回答你的问题,所以请随意问任何你想问的问题。首先,我们要讨论为什么要使用Kubernetes ?Kubernetes解决了实际问题。最近Stack Overflow上的一篇博文提到了Kubernetes如此受欢迎的几个原因。首先,基础设施就是数据。所需的资源在K2022世界杯阿根廷预选赛赛程ubernetes中以一种非常简单的方式表示,使用YAML文件。将所有内容定义在YAML文件中,就可以在版本控制(比如Git)下管理它们,而且从可伸缩性的角度来看,这也非常容易,因为所有内容都可以在YAML文件中轻松更改和更新。年代
兴起,可扩展性。有大量的现有资源,如有状态集、配置映射、秘密、cron作业等,2022世界杯阿根廷预选赛赛程用户可以根据自己的需要添加更多类型。第三,创新。在过去的几年里,每年都有3到4个主要版本,其中包含许多新功能和变化,而且看起来这个速度不会减慢。第四,社区。Kubernetes以其强大的社区和CNCF的支持而闻名。KubeCon是世界上最大的开源活动。从2019年开始的年度GitHub调查显示,Kubernetes是贡献者最受欢迎的十大开源项目之一,而Kubernetes包管理器Helm是贡献者增长最快的十大开源项目之一。在过去的两年里,在stack overflow的年度调查中,Kubernetes与Linux和Docker一起成为开发人员最喜欢的三个平台之一。在JFrog中,我们找到了使用Kubernetes的一些原因。 First, I need a running environment. NOW! Developers as well as production need high velocity of creating environments for their daily work. This is something that can be easily reached using Kubernetes. Second, branch integration environment with other products’ branches. For example, Artifactory developer wants to set up an environment to test his branch with other applications’ versions. In the past, they had to set up a VM, install an OS, set network configuration, etc. This takes a lot of time.
同样,使用Kubernetes可以很容易地做到这一点。三是提高资源利用水平,促进发2022世界杯阿根廷预选赛赛程展和生产。在Kubernetes中,应用程序可以以较低的CPU和内存启动,并根据消耗增加到特定的限制。它使管理员可以轻松地管理他们的资源并节省成本。2022世界杯阿根廷预选赛赛程稍后我会在演讲中谈到这个。第四,支持JFrog产品的新发行版。hth华体会最新官方网站如前所述,Kubernetes是一个非常流行的平台,所以JFrog必须为我们的客户和社区提供Kubernetes上的产品安装。hth华体会最新官方网站
第五,将我们的集装箱产品投入生产。hth华体会最新官方网站或者换句话说,开发环境必须尽可能地类似于生产环境。在Docker中拥有一个应用程序是很好的,但我们需要的远不止这些,这就是Kubernetes这样的完整解决方案平台所提供的。第六,尽可能与供应商无关。因为我们必须能够在主要的云供应商上部署我们所有的产品,所以我们最好有一个API,hth华体会最新官方网站而Kubernetes提供了一个基于供应商的抽象概念。七、自动缩放和自动修复应用程序。这些是Kubernetes的亮点,这些特性使得几乎每个人都想使用Kubernetes。事实上,它们是提高应用程序可靠性的重要特性。为了方便地管理应用程序在Kubernetes上的部署,我们决定使用Helm。Helm是一个管理Kubernetes包的工具,叫做charts。 Like RPM or Centos or Red Hat. Helm charts helping, defining, installing, and upgrading Kubernetes applications.
JFrog在Helm应用程序中发布并维护其所有产品的官方Helm图表,供我们的客户,社区以及我们的SaaS解决方案使用。hth华体会最新官方网站那么我们如何在内部环境中使用Kubernetes呢?出于开发目的,我们有一个在Kubernetes上安装JFrog产品的CI/CD过程。hth华体会最新官方网站根据需要,开发人员可以启动此过程并指定要安装的分支版本,而不需要我们的应用程序的主版本或分支版本。
部署过程使用JFrog官方Helm图表,结果是一个独立的Kubernetes名称空间,其中安装了所有应用程序。在这里,您可以看到Jenkin的管道作业的输出,以及各种安装步骤,最后,开发人员运行了专用的JFrog平台。为了准备和预生产的目的,我们有几个管理集群,每个云供应商至少有一个,我们正在运行JFrog产品安装的完整CI/CD过程以及Kubernetes基础设施和工具,以便在升级我们的生产环境之前运行测试并发现错误。三年前,我们研究了在AWS、GCP和Azure中自我管理Kubernetes集群的几种选择。我们发现,对我们来说,最简单、最直接的方法是使用云供应商EKS、GKE和AKS提供的托管Kubernetes解决方案。我们明白,自己管理集群需要很多我们没有的资源和技能,我们最好专注于我们擅长的事情。2022世界杯阿根廷预选赛赛程
在过去的10年里,我们在不同地区使用相同的API运行EKS、GKE和AKS的生产环境。我们仍然需要处理云供应商的特定服务,如日志平衡器、数据库等。改用Kubernetes减少了我们需要管理的特定于供应商的api的数量。一个新的客户部署,现在是一个自助服务和完全自动化的过程。不需要DevOps工程师介入。该环境几分钟内就可以在任何受支持的云区域上使用。免提自动化。谈论在生产系统中使用Kubernetes对某些人来说可能听起来很浪漫,您只需运行一两个命令,所有东西都在其位置上运行。你有应用程序自动愈合和自动缩放,所以现在你可以自由地航行到日落更好的一杯红酒在你的手中。很快,你就会发现事实并非如此。 You find your ship in the middle of the storming sea, struggling big waves, breathing to drowning. And find yourself helpless and terrified. I know this sounds a little bit dramatic but this is not far from the feeling you have the first time you’re facing a service downtime with your new Kubernetes system. Once you pull yourself together, you’re starting to understand there is work to do to stabilize your ship and make it stronger and resistant. So next time, and of course there will be some of them, it faces high waves and big storms the shock will be smaller and the durability will be better. Let’s now discuss the things we learned and found as important during our process to stabilize our Kubernetes production ship. Visibility.
我们了解到的第一件事是,由于Kubernetes作为一个平台的复杂性,我们需要了解系统中正在发生的事情。无论是供开发人员、团队、DevOps还是其他任何人使用。不再SSH到服务器并“获取日志”。开发人员不应该需要_访问来调试他们的应用程序,并且在Docker镜像上没有基本的Linux _。因此,我们知道我们需要详细的日志记录和监控工具来连续地在集群上运行,收集矩阵中的所有日志,并为我们提供系统状态的可靠可见性,以及开发人员和支持团队调试应用程序所需的所有信息,无论是实时的还是历史的。起初,我们从本地ELK和Prometheus开始设置,但很快,随着规模的增长,我们发现就像管理Kubernetes集群一样,我们应该使用专业的管理解决方案来进行日志记录和监控。这消除了管理监控和记录系统的规模的需要,这对我们来说是非常耗时和消耗资源的。开发=登台=生产。我们注意到,很多时候,当我们部署某个产品的新版本时,各种功能和性能问题只会在生产环境中发现。hth华体会最新官方网站
这总是导致匆忙发布修复版本,就像之前提到的,我们有3个环境,我们知道我们必须尽可能地减少这些环境之间的差异。在类似生产环境的环境中进行测试的能力提供了在开发时运行测试和检查的选项,并且可以最小化我们的发布时间、风险和_。今天,开发人员可以部署分支来评估与生产环境相同的环境,以便使用它执行专业和非专业测试。了解自己的极限。我们学到的一件重要的事情是我们必须知道我们的应用。这意味着你需要学习和理解你的应用程序是如何在资源使用、内存、CPU、数据库、永久存储(如果需要的话)以及任何你的应用程序需要的方面工作的,以便以最小的力量高效地执行和2022世界杯阿根廷预选赛赛程运行。在高利用率和高性能之间总是存在平衡。你可以给你的应用程序大量的资源,所以它会运行得非常快,没有_,但这些资源可能是闲置的,有时,可2022世界杯阿根廷预选赛赛程以花费你很多钱,你需要找到一个平衡,正确的比例,为你的应用程序正确和有效地运行。
这也适用于类关闭,它定义了大小和特定CPU内存量的代码。还有Kubernetes调度器,它确保有足够的资源来处理_本身的所有错误。2022世界杯阿根廷预选赛赛程但是你必须快速计算并理解你要运行多少_,它们需要什么资源,基于这个计划,集群大小和节点大小。2022世界杯阿根廷预选赛赛程不要忘记,系统和组件,如Kubelet、Kube代理、容器引擎和所有进程也需要资源。2022世界杯阿根廷预选赛赛程每个供应商都有自己的系统服务定义,在您的计划和计算中必须考虑到这一点。
豆荚优先和豆荚服务质量。关于pod驱逐的有趣故事是,有一天,一开始我们发现几十个相同应用程序的pod处于驱逐模式,我们很恐慌,因为很难看到有一个pod,它可能会运行错误。那是我们了解到豆荚驱逐状态存在的时候。由于自动修复和自动扩展,客户没有经历停机时间。关于上一张幻灯片提到的资源限制,应用程序2022世界杯阿根廷预选赛赛程的一个主要问题是它们使用的资源,Kubernetes的调度程序是一个组件,它负责根据资源需求(如果有定义的话)为pod找到运行的最佳注释。Kubernetes中有3个服务质量类。第一个,保证。所有pod容器都为CPU请求和限制以及内存请求和限制指定了相同的值。这个选项是最安全的,因为Kubernetes承诺在一个包含所有所需资源的笔记中调度它,并且它保护笔记在内存耗尽时不会被驱逐。2022世界杯阿根廷预选赛赛程另一方面,如果在没有进行初步调优的情况下设置请求和限制,则在节点资源方面可能存在风险。2022世界杯阿根廷预选赛赛程
第二种是可爆发的。pod不能保证,但至少有一个容器指定了内存或CPU请求。Burstable对大多数pod都很好,但它不是完全安全的,因为在某些情况下,您的pod可能会被Kubernetes驱逐。最后的努力是最好的努力。Pod没有指定任何CPU和内存请求和限制。应该避免使用这种pod,因为它是第一个被驱逐的pod,并且可能非常危险,因为CPU和内存可以无限制地增长。我们发现在最早期的设置阶段,当你想稳定你的系统,然后你了解你的应用程序和它的需求时,保证选项是最好的,但它是最昂贵的选项。过了一段时间,当您调整应用程序,进行优化并重置资源时,您就可以开始使用最高优先级机制,该机制定义了在存在退出过程时对您最重要的应用程序。2022世界杯阿根廷预选赛赛程例如,当我们开始加载许多应用程序时,它们都没有定义pod优先级,我们发现Artifactory是许多pod所依赖的所有服务的核心,应该具有比日志收集器pod更高的优先级,因为日志收集器pod可以在_之后从同一位置停止和启动。通过使用pod优先级来提高服务可用性的另一个好例子是RabbitMQ。 When RabbitMQ runs on a cluster in Kubernetes there’s some interesting faults that happen as a result of RabbitMQ leaving and joining the cluster frequently.
一旦我们将pod优先级添加到RabbitMQ中,它就会变得更加稳定,并显著减少与RabbitMQ集群相关的故障。零停机升级。作为SaaS,我们的目标应该是最小化服务的停机时间。应用程序版本升级是我们应该能够随时运行的东西。例如,Artifactory的紧急安全补丁必须安装到客户的生产环境中,我们不能拖延或等待维护会议。让应用程序在几个低平衡pod中以高可用性模式运行,可以在升级环境时消除停机风险。在Kubernetes中,您可以选择滚动更新。所以,在特定的时间,只有一个豆荚会被升级,其他的豆荚还能正常工作,轮到他们时,他们会被升级。需要提到的重要一点是,您的应用程序必须具有HA能力——能够平稳地添加或删除服务pod而不会出现问题的选项,因此,您必须了解您的应用程序并相应地更改所需的内容以支持它。
此外,还有Kubernetes版本升级、云供应商升级或工具升级,它们必须在不中断应用程序可用性的情况下运行。Kubernetes中一个很好的机制是探测器,它可以帮助您确保应用程序确实可以正常工作,如果不能,则重新启动它。就绪探测是一种自动机制,用于了解容器何时准备好开始接受流量。活动探测以知道何时重新启动容器。而对于升级过程,例如,如果您正在升级RDS,并且需要重新连接到数据库,那么活动探测将识别应用程序的错误状态,并将重新启动它,以便自动重新连接。安全。在JFrog,我们喜欢吃自己的狗粮,在日常的工作和加工中使用我们的产品。hth华体会最新官方网站
话虽如此,很明显,管理Docker映像和Helm图表的最佳方式是使用Artifactory。我们使用内部Artifactory服务器作为Docker和Helm的仓库,在部署过程中,部署所需的一切都是从Artifactory获取的。因此,我们可以完全控制和查看Kubernetes开发和生产集群中运行的内容。最重要的是,Xray运行并扫描存储在Artifactory中的所有第三方Docker映像,因此只有扫描和批准的映像才能找到Kubernetes集群的方式。这可以确保没有未经批准的代码在我们的集群上运行。持续学习。这是我想让你们从这次演讲中得到的主要信息之一。Kubernetes本身和系统的学习过程永远不会结束。Kubernetes作为一种新技术,几乎对每个人来说都是新的,开发人员和运维团队必须学习它是如何工作的,如何使用它,学习网上可用的最佳实践和建议。了解如何在指标中查找循环,以及如何获得调试应用程序所需的信息,您应该始终继续调优基础设施和应用程序及其行为。 Reviewing metrics from the past is very important you must check how your application behaves over periods of time. Take a specific process of behavior that hurts your system, such as bad performance process or high-network perception process and investigate it over a day, a week two weeks, a month, etc.
例如,在我们的一次主动检查中,我们发现CPU在几周内不断增加,这揭示了它导致CPU日志问题和内存错误的_。这是你在一天或一周的复习中找不到的。要知道,今天也有很棒的机器学习和APM工具可以帮助您发现这类问题,甚至更好,根据预定义的规则提醒您。不要把过去的任何选择视为理所当然。考虑到你做决定的时候,你不知道你现在知道的事情,你甚至经历了一两件事,现在你在一个需要处理的系统下有了更好的知识和信心。不断问自己是否有意义,如果需要的话,不要害怕改变。最后,我想回顾一下我在这次演讲中提到的要点。如果这对你来说是最好的,使用manage Kubernetes,并始终专注于你擅长的事情。能见度,能见度,能见度。调试和控制系统的关键。 Don’t be afraid to use manage solutions. All environments should be similar as much as possible to reduce risks and potential bugs in production.
了解自己的极限。了解您的应用程序,并相应地设置资源和优先级。2022世界杯阿根廷预选赛赛程采取措施实现零停机升级。将应用程序更改为真正的HA。运行滚动升级并使用Kubernetes探测。考虑安全性,并尽量减少可能来自Docker映像的潜在风险。预期的失败。为他们做好心理准备,尽可能地积极主动。不要忘记,您必须不断了解您的系统,调整您的配置和指标,并重新验证您的选择。我希望你们每一个人都能从中找到一两个与你的组织相关的经验教训,并把它们带回去改善你的Kubernetes生产体验。 The Kubernetes journey probably never ends. but I hope that this talk convinced you that Kubernetes in production is actually not that hard. It is possible, it is fun and as we always say in the Swamp once you leap forward, you can’t go back.

免费试用JFrog !