Gartner《Container发布与生命周期管理最佳实践》学习心得
近日,Gartner发布了《Best Practices for Container Release and Life Cycle Management》,
报告为技术专业人士提供了关于容器发布和生命周期管理的深入指导。这份报告强调了容器在现代应用开发和部署中的核心地位,并提供了一系列最佳实践,以帮助组织实现容器的自动化、可靠和安全治理。以下是报告的核心观点和建议的整理:
核心观点:
容器技术已经成为现代应用开发和部署的基石,特别是对于云原生应用而言。容器提供了标准化的软件打包方式,使得应用程序及其依赖项可以被打包成轻量级、便携式镜像。然而,随着容器的广泛采用,组织在容器生命周期管理方面面临着诸多挑战,包括构建实践的不一致性、安全控制的不足、手动管理的低效、供应链安全的风险以及测试和质量保证的无效性。这些问题的存在,凸显了实施全面生命周期管理策略的必要性。
Problem Statement(问题陈述)
容器作为一种自我包含的标准软件单元,将代码及其所有依赖项打包成轻量级、便携式镜像,自 Docker 推出以来,其概念已成为标准化的软件打包方法。然而,随着容器的广泛采用,组织面临着容器生命周期管理方面的诸多挑战:
-
构建实践不一致 :构建容器镜像的过程相对简单,但在大规模构建容器时,需要全面的工作流和工具包来确保一致性。缺乏通用的容器构建工作流会阻碍标准实施、跨团队协作和集中治理。
-
安全控制不足 :随意引入第三方软件可能会使组织面临风险。若没有验收指南来确保来源和安全检查,将危及企业整体安全。
-
手动管理 :现代容器技术最初是为帮助软件从业者方便地打包应用和依赖项而出现的,开发者可以使用专门工具自主构建、测试和推送容器,但这种手动方法不适合大规模场景,会限制统一和协作实践的采用。
-
供应链安全问题 :现代应用程序通常依赖外部资源,这些资源可能存在安全或可靠性缺陷。因此,所有内部构建或外部获取的容器工件,在作为基础镜像或被部署之前,都必须经过严格的验证和筛选过程。
-
测试和质量保证无效 :缺乏自动化测试会削弱敏捷性和安全性,因为它会减慢重新部署容器以引入新功能和修复安全漏洞的速度。
此外,随着容器的流行,实践者在寻求在自主性和治理之间找到最佳平衡,以实现产品的快速发布,同时解决供应链安全问题。容器生命周期管理需要软件工程(SWE)、基础设施和运营(I&O)、站点可靠性工程(SRE)和安全团队之间的紧密协作,但通常缺乏透明的共享责任模型,导致操作中出现差距。
解决方案建议
Gartner 建议实施过程在容器化应用程序的生命周期管理中实现统一、可靠和安全的过程。以下是其核心要点:
推荐实践
-
实施全面的生命周期管理策略 :确保构建、测试、发布、更新和销毁软件工件的可重复、可重现和合规的流程。
-
标准化容器构建、测试和发布实践 :将这些实践作为自动化管道的组成部分,并确保策略包含不同团队的贡献,作为协作努力的一部分。
-
通过自动化确保可预测和可靠的工作流 :在预生产阶段观察和证明工作负载执行情况,以减少更新过程造成的影响,确保平稳的发布过程需要应用的就绪。
-
采用自动化例程来“再水化”和清除容器化应用程序 :基于诸如依赖项跟踪、关联的常见漏洞和暴露(CVE)以及过时等独立标准。
关键认知
-
容器的标准化与云原生应用的推动 :随着容器的流行,OCI 镜像已成为打包和分发云原生软件的标准,包括业务应用程序及其依赖项、虚拟磁盘、基础设施定义和其他工件。软件供应商也在采用容器商业现成(COTS)方法发布产品,加速上市时间并实施更高效的生命周期管理策略。但容器的广泛采用也引发了对发布和管理容器生命周期的正式流程的担忧。
-
实践者面临的挑战 :实践者需要找到自主性和治理之间的平衡,以实现产品的快速发布,同时解决供应链安全问题。要实现可靠、无缝的推出过程,需要应用和平台的就绪,这只有通过不同实践之间的共同努力才能实现,缺乏协作会阻碍可靠、持续部署工作流的实施。
指导框架
Gartner 推荐实践者采用一个五步方法来实施容器的全面发布和生命周期管理,这些步骤与持续集成(CI)和持续部署(CD)工作流的典型阶段相关联,包括预备工作、构建容器、测试和验证容器、部署容器、观察容器执行、容器的再水化和清除等阶段,以确保容器化应用程序的整个生命周期得到有效管理。
预工作:评估软件的适应性
在开始实施容器生命周期管理策略之前,实践者需要评估其应用程序是否适合采用容器化。容器化应用不一定会自动成为云原生的组件,也不会立即从现代实践如持续集成(CI)和持续交付(CD)中获益。因此,实践者需要考虑以下几个因素来评估软件的适应性:
-
工作负载的性质 :容器特别适合支持基于微服务的、无状态的和云原生应用,这些应用能够利用云平台的可扩展性、弹性和分布式特性。
-
云原生架构原则 :遵循 LIFESPAR 和十二因素应用等框架的应用程序是容器化的理想候选者。这些框架为设计云原生应用或现代化现有应用以迁移到云提供了架构原则。
-
平台能力 :选择合适的执行环境需要考虑平台是否提供了云原生应用所需的能力。虽然 Kubernetes 等基于容器的技术主导了云原生平台市场,但实践者也应考虑其他能够抽象和优化开发人员和操作人员体验的替代方案和扩展。
构建容器
构建容器阶段涵盖实践者在将工件打包到 OCI 镜像时需要考虑的问题,包括工具和实践选择。以下是构建容器时的关键要点:
-
构建工具 :实践者可以利用多种工具,如 Docker Build、BuildKit、Buildah、kaniko 等来构建容器镜像。这些工具各有特点,例如 BuildKit 因其并行化构建步骤的能力和高级层缓存功能而比 Docker 的原始构建引擎更快。
-
基础镜像选择 :基础镜像包含容器的基本文件系统,是构建自定义镜像的起点。实践者应选择来自可信来源的轻量级基础镜像,如 Alpine Linux、Distroless 等,以减少攻击面并提高性能。
-
镜像标签策略 :使用语义化版本号或唯一标签(如 Git SHA、拉取请求 ID 或时间戳)来标记镜像,而不是默认的 “latest” 标签,以便于跟踪镜像版本和回滚操作。
-
镜像精简和加固 :通过分析和识别应用需求,移除所有不必要的组件,减少攻击面并优化镜像大小。例如,可以使用 Slimtoolkit、Mint、Rapidfort 等工具来精简镜像。
-
镜像签名 :为容器镜像添加数字签名,确保其真实性和完整性。实践者可以使用 Cosign、Notary Project 等工具来签名和验证镜像。
测试和验证容器
测试和验证容器阶段描述了实践者必须采用的测试和验证技术,以确保镜像符合规范并遵循安全最佳实践。以下是测试和验证容器时的关键要点:
-
测试自动化 :容器可以帮助软件从业者在隔离且可重复的环境中执行测试,可靠地重现生产环境设置。现代 DevOps 平台支持容器基础的管道执行,确保在整个软件开发生命周期中创建一致的开发工具包。
-
漏洞分析 :使用专门的工具来检查容器镜像并识别已知的漏洞(CVE),例如 Trivy、Project Quay、Anchore Grype、Docker Scout 等。
-
合规性 :确保容器镜像和执行环境符合法规和标准,基于知名的安全框架进行评估和检查,如 CIS 基准、NIST SP 800-190、MITRE ATT&CK 容器矩阵、PCI 安全标准委员会的信息补充等。
-
政策执行 :采用政策即代码(PaC)的实践,通过自动化方法强制执行治理和合规规则。工具如 Kyverno、OPA Conftest、dockerfile-audit、Docker Scout、Anchore Enterprise 等可以帮助实现这一目标。
部署容器
部署容器阶段涉及采用一致的持续部署策略来支持应用发布要求。以下是部署容器时的关键要点:
-
声明式与命令式方法 :部署容器时,实践者可以选择声明式或命令式方法。声明式方法通过声明资源的期望状态来管理 Kubernetes 资源,而命令式方法则直接通过命令行管理资源。通常推荐使用声明式方法,因为它允许更一致和可预测的管理。
-
滚动更新策略 :Kubernetes 原生支持重新创建和滚动部署策略。滚动更新以受控的方式更新容器,减少对用户的影响。
-
高级部署技术 :对于业务关键场景,可能需要更高级的部署技术,如金丝雀部署、蓝绿部署、A/B 测试、影子部署、服务网格和渐进式交付等,以提供更精细的流量控制和分发方式。
-
观察容器执行
观察容器执行阶段强调了获取容器工作负载信号以了解应用执行情况的重要性。以下是观察容器执行时的关键要点:
-
探测器 :Kubernetes 提供了启动探测器、存活探测器和就绪探测器等自我修复能力,用于监控容器的健康状况。
-
现代可观测性方法 :OpenTelemetry 和 eBPF 是两个影响云原生应用的可观测性方法。OpenTelemetry 标准化了遥测数据的生成、收集和管理,而 eBPF 使应用程序能够在操作系统内核空间中安全地运行程序,以实现非侵入式的高级可观测性。
-
可观测性堆栈 :可观测性堆栈提供了目标平台的全面实时状态,包括数据收集器、聚合器、分析引擎、可视化和警报组件。例如,Prometheus Stack、Grafana Stack、Elastic Stack 等。
容器的rebuild
容器的rebuild阶段涉及根据预设标准自动检测和替换已过时或存在漏洞的容器化应用程序,并清除过时的工件。以下是容器的再水化和清除时的关键要点:
-
触发标准 :实践者需要定义触发重建工作流的标准,如安全公告、依赖项变更、计划的生命周期等。
-
执行方法 :选择工具来监督触发信号、评估是否符合要求,并在必要时触发重建。例如,使用漏洞扫描器、依赖项管理工具等。
-
收敛策略 :描述在完成构建过程后,用更新后的镜像安全替换正在运行的容器的步骤。
-
清除策略 :实践者需要理解管理保留和控制过期的机制,包括保留策略和垃圾回收。现代注册表通常提供机制来定义镜像应保留的时长,并根据过时、不活动、保留的版本数量等标准自动丢弃镜像。垃圾回收可以定期删除未引用的层并回收被滥用的存储空间。
小结:
建议的方法强调了在容器生命周期管理中实施自动化、标准化和协作的重要性,以确保容器化应用程序的可靠、安全和高效管理。通过遵循这些最佳实践,组织可以更好地利用容器技术的优势,同时降低相关风险。