JFrog的Kubernetes之旅:将容器一直带到生产环境的最佳实践
白皮书执行摘要
莎拉·威尔斯,技术总监。《运营与可靠性》,《金融时报》
Kubernetes已经成为市场上事实上领先的编排工具,不仅适用于技术公司,而且适用于所有公司,因为它允许您快速和可预测地部署应用程序,动态扩展应用程序,无缝地推出新功能,同时有效地利用硬件资源。2022世界杯阿根廷预选赛赛程
JFrog与Kubernetes的旅程始于我们寻找一个合适的容器编排解决方案,为内部目的启动一个功能齐全的环境。我们的开发人员需要测试非常复杂的环境,包括JFrog Artifactory和其他产品。hth华体会最新官方网站与此同时,我们需要为程序和产品经理提供一个功能齐全的演示环境JFrog企业+平台致我们的客户。
为了满足我们的需求,每个产品都需要一个独立的CI/CD开发环境,以便在测试分支之间的交互时测试与其他分支隔离的单个分支。
随着我们对Kubernetes的信心增强,我们认识到将JFrog产品分发到Kubernetes的价值,同时能够在不同的阶段、开发和生产环境中运行应用程序。hth华体会最新官方网站Kubernetes还允许我们更好地利用我们的资源,因为我们不再需要启动单个VM来单独部署每个产品2022世界杯阿根廷预选赛赛程。在本白皮书中,我们将分享使用Kubernetes将您的容器化应用程序一直带到生产环境的最佳实践、技巧和经验教训。
介绍
Kubernetes允许您创建容器化应用程序并并排部署它们,而无需担心各种服务和组件之间的兼容性。容器化应用程序并在Kubernetes中运行它的好处是,您可以在一个充满活力的社区中开发您的产品更容易创建可扩展的微服务应用。这样做的缺点是,当你的整个团队都在处理不同的组件时,它很快就会变得相当复杂。除此之外,您的容器化应用程序还可以包含多种组件类型,具体取决于您正在使用的操作系统、语言和框架。
让我们从使用Kubernetes运行应用程序所需的三个基本组件开始:
Kubernetes集群
Kubernetes集群是容器化应用程序运行的编排基础设施。您需要决定是否要自己管理它,以及是否要使用云提供商来托管它。该组件不在本文范围内讨论。
CI / CD管道
CI/CD管道在Kubernetes中运行,并自动化这个过程,从源代码和外部包开始,到在Kubernetes集群中部署应用程序。Kubernetes管道是“应用感知的”,这意味着它们本身就能够动态地提供一个完整的容器化应用程序堆栈(通常由多个服务、部署、副本集、秘密、configmap等组成)。对应用程序上下文的每一次更改,无论是代码、基础层、映像还是配置更改,都将依次触发管道。
Kubernetes注册表
您的生产集群应该使用单一的、可管理的和可信的事实来源它存储和跟踪使我们成为您的应用程序和依赖的所有部分。使用Kubernetes注册表,您可以在一个pod中并排运行多个应用程序堆栈,而不会发生冲突,也不会关心每个应用程序的内部依赖关系。这将维护运行的集群、上下扩展应用程序、开发新版本和调试应用程序特定问题之间的关注点分开。
1.让您的应用程序为K8S做好准备
应用程序是服务/解决方案的核心。你需要计划和准备你的申请然后才能在Kubernetes中运行它。
问卷检查表:准备您的应用程序为K8S
下表显示了在为Kubernetes准备应用程序之前必须询问的与应用程序相关的任务和问题。
| 任务 | 问题 | K8S大师推荐 |
| 日志记录 |
|
考虑通过设置/dev/stdout或/dev/stderr将日志转换为链接,从而确保所有日志都是容器日志的一部分。 |
| 数据持久性 |
|
不要将所有数据存储在持久存储中。只存储持久数据。 |
| 终止信号 |
|
在容器bash入口点中使用trap来捕获终止信号并正确处理它们。 |
| 应用程序重新启动 |
|
测试应用程序恢复的一个好方法是终止pod,或者终止节点,然后看看会发生什么? |
| 高可用性 |
|
在执行集群扩展(向下)和计划的节点维护时,计划零服务不可用性,允许pod调度。 |
| 探针 |
|
正确使用探针可以帮助您为应用程序实现一个伟大的“自动修复”过程,并将为您的工程师节省许多不眠之夜。 |
有关将软件构建为服务的基础知识的更多信息,请参见十二因素应用程序。
2.在Kubernetes中获得灵活性和通用性
多语言编程和多种不同的工具和技术提供了多种可能性。您可以挑选最能满足业务需求的技术,但是每种技术可能有不同的接口、REST API和自己的包格式。支持这些工具的唯一方法是从创建到部署管理工件生命周期的通用方法。
将Artifactory部署为Kubernetes注册表
通过使用Artifactory作为“Kubernetes Registry”,您可以获得灵活性和通用性,因为它可以让您深入了解代码到集群的过程,同时与每个应用程序的每个层相关,并充当可信事实的单一来源。Artifactory支持25种以上不同的技术在一个具有一个元数据模型、一个提升流和强构件间关系的系统中。
Artifactory允许您将容器化的微服务部署到Kubernetes集群作为通用存储库管理器满足您的所有CI/CD需求,而不管它们在您的组织中的哪个位置运行。一旦你签入了App包,你就可以继续传播并执行构建、测试、推广和最终部署到Kubernetes。要轻松地将Artifactory(和其他JFrog产品)部署到Kubernetes,请参阅我hth华体会最新官方网站们的官方JFrog helm图表领导中心。

3.自动部署到Kubernetes
在CI/CD管道的每个阶段都不需要人工干预的情况下,以可靠的规模促进应用程序的部署是编排的主要原因。但是,如何以一种可重复的、可靠的方式将代码放到集群中呢?你如何确保只有正确版本的应用才能投入生产?
要做到这一点,我们建议部署Artifactory作为您的存储库管理器,在你的生活中起着至关重要的作用CI / CD管道通过弥合开发和运营之间的差距。
将Artifactory部署为您的Helm图表存储库
Artifac托利党本地支持执掌存储库,让您完全控制Kubernetes的部署过程。它提供了安全的、私有的、本地的Helm存储库,通过细粒度的访问控制在整个组织中共享Helm图表。代理和缓存带有远程存储库的公共Helm资源,并在单个虚拟Hel2022世界杯阿根廷预选赛赛程m存储库下聚合本地和远程资源从一个URL访问所有的Helm图表。

K8S大师提示:
当使用Artifactory作为Helm存储库时,我们建议:
- 分离稳定库和孵化器库。
- 在图表中使用SemVer版本2。
- 定期重新计算索引。在Artifactory中从头开始创建。
在CI/CD管道中部署应用程序的最佳实践
在CI/CD管道中部署应用程序时,我们建议:
- 使用相同的Helm图表用于本地、登台、测试和生产,同时使用单独的值。每个环境的Yaml文件。每个yaml需要包含特定的环境配置值。例如:values-stg。山药,value-prod.yaml。
- 在VCS中管理自定义值。
- 设置为默认值。Yaml应该用于开发或本地,因此开发人员可以在本地使用它而不会有麻烦。
- 为依赖关系使用外部图表。使用社区已经完成的工作!
- 出于安全目的:将您的秘密从图表中分离出来,并将其作为外部图表引用。
4.在Kubernetes中构建可靠和可扩展的环境
在Kubernetes集群中并行运行多个应用程序需要建立对工件的连续访问,同时支持零停机的高负载突发。
在Kubernetes中部署人工HA
通过在Kubernetes集群中部署Artifactory HA,当涉及到集群扩展时,如果pod被驱逐或崩溃,或者在节点意外停机的情况下,您将不会遇到由于任何类型的pod调度而导致的服务不可用。
在Kubernetes中部署人工HA的好处是:
- 适应更大的负载突发而不影响性能。
- 提供水平服务器可伸缩性,允许您随着组织的增长轻松地增加容量以满足任何负载需求。
- 支持执行大多数维护任务,没有系统停机时间。
- 支持滚动升级,因为可以通过零停机时间替换应用程序的单个实例来在实例上安装新版本。
在下面的示例中,使用三个节点部署Artifactory HA集群:一个主节点和两个成员节点。因为负载均衡只在成员节点上执行。这使得主节点可以自由地处理作业和任务,而不会被入站流量中断。

您可以使用预定义的人工高可用性舵图来创建您自己的人工高可用性环境。
Kubernetes集群的存储和可扩展性
人工HA允许您在Kubernetes中突破应用程序的限制,因为它支持广泛的存储替代方案。有关更多信息,请参见配置文件存储。
5.可见性和安全性:在Kubernetes中保护你的应用
云原生技术Docker和Kubernetes提供更大的攻击面,为恶意加密挖掘,勒索软件和数据盗窃提供更多潜在入口点。运行在Kubernetes集群中的服务并不是完全隔离的,它们可以访问集群中的其他区域。
正是出于这个原因,对集群的可见性至关重要,尤其是从安全角度来看。您需要知道在您的容器中运行的是什么,因为您的应用程序很少包含单个组件,而是包含外部依赖项,例如OS包、OSS库和第三方进程。这就引出了一个不可避免的问题——它们安全吗?它们含有吗?安全漏洞?他们是否遵守自由/开源软件许可?
在K8S中获得容器的可见性
Artifactory通过提供可审计性,让您深入了解CI/CD过程,因为它捕获了整个CI/CD过程中产生的大量有价值的元数据。您可以跟踪负责生成应用层的CI作业,它是Docker映像层的一部分。它还可以通过比较两个构建来显示构建差异,从而很容易跟踪Docker映像的哪个层是为哪个构建生成的,这样您就可以跟踪到提交。
K8S大师提示:
推荐阅读:每个人都必须遵循的9个Kubernetes安全最佳实践。
扫描和检测容器中的漏洞
JFrog Xray与Artifactory合作,在应用程序生命周期的任何阶段执行二进制软件工件的通用分析。它对容器中的所有层运行递归扫描,并通过扫描和识别所有层中的漏洞分析工件以及它们的元数据,递归地遍历任何级别的依赖项。可以在x射线中设置策略根据x射线扫描发现的风险级别,限制或阻止容器映像部署到Kubernetes。通过这种方式,可以阻止易受攻击或不兼容的应用程序运行,或者限制它们在启动时允许执行的操作。
在K8S中保护您的开源项目
大多数应用程序严重依赖于包管理器和开源存储库,因此很容易受到来自这些来源的恶意或不安全代码的攻击。作为我们对开源社区的支持和贡献,JFrog开发了KubeXray这是一个开源项目,它将Xray的安全性扩展到在Kubernetes pod中运行(或即将运行)的应用程序。使用Xray通过扫描容器映像生成的元数据,KubeXray可以在已经部署的内容上执行策略。
KubeXray监控你所有的活动Kubernetes pod来帮助你:
- 捕获当前在所有Kubernetes pod中运行的应用程序中新报告的风险或漏洞。
- 对正在运行的应用程序执行当前的策略,即使在更改了这些策略之后也是如此。
- 对运行未被x射线扫描且风险未知的应用程序强制执行策略。
在掌舵2中使用无舵防止未经授权的访问
Helm 2包含一个名为“Tiller”的服务器端组件。。Tiller是一个集群内服务器,它与Helm客户端交互,并与Kubernetes API服务器接口。
Tiller确实很酷,但重要的是要意识到在《掌舵2》中存在与Tiller相关的安全问题。这是因为Helm客户端负责管理图表,服务器负责管理发布。这带来了很大的风险,因为Tiller以root访问权限运行,并且有人可以未经授权访问您的服务器。
Rimas Mocevicius是JFrog的kuberaut和Helm的联合创始人,他提出了一种解决这种情况的创新方法,即在您的工作站或CI/CD管道中运行Helm和Tiller,而无需将Tiller安装到Kubernetes集群中。要使您启动并运行,您可以下载并安装无舵v2插件。
使用RBAC设置Kubernetes
将RBAC(基于角色的访问控制)设置为Kubernetes的管理功能是必须的,因为它允许您定义哪个用户可以管理集群及其粒度。除了定义可以列出哪些用户和应用程序之外,还可以获取、创建或删除pod和其他Kubernetes对象。一个好的做法是通过在为应用程序创建的服务帐户中设置“automountServiceAccountToken: false”来禁用对API的访问。
如果您没有指定服务帐户,它会自动将其分配给pod,作为同一命名空间中的“默认”服务帐户。我们建议不要使用名称空间附带的默认值。始终为应用程序创建一个服务帐户,因为它允许您设置应用程序限制,包括名称空间或集群范围的操作,以及完全禁用对Kubernetes API的访问。
6.记录,监控和调试您的应用程序在K8S
微服务的数量随着复杂性的增加而增长,问题是如何跟踪和监控它们,以及应该监控什么。当涉及到微服务时,你需要收集微服务的数据:
- 意外事件:例如,在数据库容器中执行的所有权变更
- 打字错误导致微服务宕机。
- 在生产中选择不正确的文件导致混乱。
- 不允许使用特定的基本操作系统版本。
在Kubernetes中记录应用程序的最佳实践
应用程序和系统日志记录对于排除Kubernetes集群活动的故障至关重要。
在Kubernetes中记录应用程序时,请遵循以下最佳实践:
- 限制对日志的直接访问。
- 当使用Kubernetes Dashboard(不推荐用于生产)时,将Dashboard设置为具有访问权限的只读。您可以允许其他成员执行故障排除,但不要提供对仪表板的完全访问权限,因为这会对Kubernetes集群造成损害。
- 确保您的日志可以实时访问,并可在以后的阶段进行分析。
- 使用日志收集工具,如ELK/EFK堆栈(ElasticSearch, Logstash/Fluentd和Kibana)来收集和索引来自系统和应用程序的所有日志。
- 考虑将日志保存在单独的集群中,以便在稍后阶段使用日志。如果集群宕机,允许您访问日志,这一点尤其有用。
在K8S中持续监控微服务
持续监视系统和应用程序运行状况的需求至关重要。
有许多免费和商业的解决方案可以实时监控Kubernetes集群和其中运行的应用程序。最流行的解决方案之一是普罗米修斯和格拉凡纳,提供可与报警工具结合使用的实时监控。
7.在K8S中将应用程序部署到生产环境
基于我们的旅程,我们建议您在开始使用Kubernetes之前阅读这些提示。
在K8S顺利开始您的生产之旅的10个提示
基于我们的旅程,我们建议您在开始使用Kubernetes之前阅读这些提示。
- 对于初学者,我们建议从阅读开始Kubernetes的艰难之路!
- 从小事做起。从示例中学习,从一个小应用程序(nginx)开始,使用现有的演示,并尝试将您的应用程序部署到皮肤Kubernetes for Docker中。
- 在进入K8S之前准备好您的应用程序。
- 为应用程序的运行设定一个最小目标。
- 使用托管k8S来解放您的工作,例如:AKS, ESK或GKE,它们为您抽象了许多复杂性。
- 每个POD有一个主容器。
- 我们建议在选择托管Kubernetes时尝试托管GKE。
- 确定在Kubernetes集群内部或外部存储数据库的位置。这是至关重要的,因为您需要计划在集群崩溃的情况下进行集群恢复。考虑以下几点:
-当K8S运行在本地时:在Kubernetes中使用现有的本地数据库作为无状态应用程序。
—在云上运行K8S时:选择一个持久数据库,如PostgreSQL或MySQL操作员,知道如何在Kubernetes节点故障时恢复。 - 在部署到云时,将集群分开以运行CI/CD管道。从外部CI/CD管道部署到Kubernetes集群。
- 与社区合作!
结论
正如本白皮书所描述的,我们展示了Kubernetes与JFrog Artifactory如何让您可靠且可预测地部署应用程序,动态扩展应用程序,无缝地推出新功能并有效地利用硬件资源。2022世界杯阿根廷预选赛赛程
本实践指南旨在回顾希望采用Kubernetes作为其容器编排工具的公司所面临的复杂性和挑战。我们希望我们分享的经验教训、最佳实践和提示将帮助您在Kubernetes的旅程中开始并运行。
