白皮书- JFrog到Kubernetes的旅程:将容器一直带到生产环境的最佳实践
执行概要
Sarah Wells,技术总监。《金融时报》运营与可靠性专栏。
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将日志转换为soflks,从而确保所有日志都是容器日志的一部分。 |
| 数据持久性 |
|
不要将所有数据都存储在持久存储器上。只存储持久数据。 |
| 终止信号 |
|
在容器bash入口点中使用trap来捕获终止信号并正确处理它们。 |
| 应用程序重新启动 |
|
测试应用程序恢复的一个好方法是关闭pod或节点,看看会发生什么? |
| 高可用性 |
|
计划零服务不可用,允许在执行集群扩展(下降)和计划的节点维护时进行pod调度。 |
| 探针 |
|
正确使用探测可以帮助您为应用程序实现一个很好的“自动修复”过程,并为您的工程师节省许多不眠之夜。 |
有关将软件构建为服务的基础知识的更多信息,请参见十二因素应用程序.
2.在Kubernetes中获得灵活性和普遍性
多语言编程和多种不同的工具和技术提供了多种可能性.您可以选择最能满足业务需求的技术,但是每种技术都可能有不同的接口、REST API和自己的包格式。支持这些工具的唯一方法是在如何管理工件生命周期(从创建到部署)方面实现通用性。
部署Artifactory作为Kubernetes注册表
通过使用Artifactory作为“Kubernetes注册表”,您可以获得灵活性和通用性,因为它可以让您深入了解代码到集群的过程,同时与每个应用程序的每一层相关,并充当您可信真相的单一来源。Artifactory支持25种以上不同的技术在一个系统中,有一个元数据模型、一个提升流程和强大的工件间关系。
Artifactory允许您将容器化的微服务部署到Kubernetes集群就是这样作为通用存储库管理器满足您的所有CI/CD需求,无论它们在组织中的哪个位置运行。一旦你签入你的App包,你就可以继续传播和执行构建、测试、推广并最终部署到Kubernetes。要轻松地将Artifactory(和其他JFrog产品)部署到Kubernetes,请参阅我hth华体会最新官方网站们的官方JFrog头盔图表领导中心.

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

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

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

