介绍
在不断发展的科技世界中,快速构建高质量的软件至关重要。在真实环境中测试应用程序是及早发现和修复错误的关键。但是,在真实环境中设置 CI/CD 流水线进行测试可能既棘手又昂贵。
Kubernetes 是一个流行的容器编排平台,提供临时环境解决方案。在 Kubernete 的帮助下,用户能根据需求创建临时的现实环境去允许您进行测试和部署应用程序,还无需担忧管理永久基础设施的麻烦。
本文深入探讨了如何使用 Kubernetes 设置临时环境,以确保彻底的测试和顺利部署。了解一下如何使用 Kubernetes 简化 CI/CD 流水线,提高代码质量并节省成本。
CI/CD 流水线是什么
CI/CD 流水线是一种简化的软件开发方法,能够使开发人员快速将代码更改整合到他们的应用程序中。这种方法促进持续整合、测试和部署,从而能及时交付高质量的软件。
CI/CD 流水线的好处
CI/CD流水线具有众多的优势,其中包括:
高效的开发周期:CI/CD 流水线可以自动执行重复的任务,精简开发的过程并减少手动的工作量。开发者可以无缝合并代码更改,消除瓶颈并加速功能交付。
早期漏洞检测:纳入到 CI/CD 流水线中的自动化测试有助于早些识别错误和问题。这种方法最大限度地减少了错误修复的成本并提高了整体代码质量。
一致的测试覆盖率:每一次代码提交都会执行自动化测试,确保一致的测试覆盖率和软件质量的持续提升。这种积极主动的方法可以防止退化的出现,并促进产品的可靠性。
加强协作:CD/CI 流水线提供透明且可追踪的开发活动记录,培养成员们之间的协作。开发人员可以轻松的追踪更改,识别编写者并维护一致的开发流程。
临时环境:敏捷测试和无缝部署
临时环境是短暂且隔离的空间,为开发人员提供一个安全且受控的环境去测试和布置微服务,而不被中断的生产环境所打扰。鉴于优秀的管理和扩展容器化应用程序的能力,Kubernetes 被视为创建临时环境的理想工具。
通过使用 Kubernetes 中的自定义资源,开发人员可以定义这些环境的配置,包括资源需求,从而实现快速高效的创建和销毁。
这个方法有利于敏捷开发,并使团队能够可靠、自信地交付代码更改。
Kubernetes CI/CD 流水线的关键组件
Kubernetes 适用于基于容器的现代应用程序部署。因此,在使用 Kubernetes 构建有效的 CI/CD 流水线时应考虑以下关键组件:
容器:封装代码和依赖关系的独立软件单元,有助于在不同环境中快速、一致地部署应用程序。
运行集群:执行容器化应用程序的工作节点组。自动扩展功能可确保按照需求水平扩展,处理增加的流量或资源压力。
版本控制系统(VCS):便于管理源代码变更,使开发人员能够将更新无缝推送到共享源代码库中。
配置管理:追踪 VCS 中的变更,深入了解代码版本发展过程。支持跨网络部署更新,简化基础架构管理。
镜像 Registries:用于存储容器镜像的集中存储库,精简了 CI/CD 流程中的访问。
安全考虑因素:在从源代码库到生产部署,在整个 CI/CD 流水线中保护敏感数据。
持续的监测和可观测性:利用 Prometheus 等工具实时监控应用程序性能,实现问题检测和解决。
CI/CD 和 Kubernetes 的最佳实践
说到建立基于 Kubernetes 的 CI/CD 流水线,这里有一些最佳实践:
运用 GitOps
GitOps 利用 Git 版本进行控制,对所有与部署相关的操作进行适当跟踪和监控,以确保可靠的部署流程。这有助于管理配置文件和跟踪所有部署版本,从而提高可靠性。
运用 Helm 来打包应用程序
Helm 通过提供被称为 charts 的打包应用程序而简化了 Kubernetes 上的软件包管理。它使开发人员更容易创建可重复的部署,同时还允许他们定制自己的应用程序,而无需编写任何额外的代码或脚本。
遵循安全最佳实践
Kubernetes 环境中的安全问题不容忽视,因为它往往是现代企业在处理敏感数据时面临的最大威胁之一。
实施 Kubernetes 安全最佳实践,比如身份验证模型和授权策略,有助于确保集群安全,防止恶意用户对 Kubernetes 集群管理的资源进行未经授权的访问或活动。
运用 canary/blue-green 部署模式
通过使用这些模式,您可以提高生产环境的可靠性和稳定性,同时确保可以识别和解决任何潜在问题,而不会影响用户体验或功能。
- Canary 部署只允许一小部分用户访问新功能,如果更新导致不良行为,可以快速回滚。
- Blue-green 部署允许您在两个相同版本的应用程序之间切换流量,这样在测试阶段成功解决任何重大错误之前,旧版服务仍可运行。
避免在容器中硬编码机密和配置
容器镜像不应包含密码、API 密钥或令牌等机密信息。相反,您应该将这些敏感信息存储在外部秘密存储中,如 AWS Secrets Manager 或 Hashicorp Vault,并在部署过程中使用 Helm Charts 或 kubectl 等工具检索这些信息。
这将确保这些重要凭证经过加密,并与容器镜像分开保存,因为容器镜像可能会与其他服务共享,或者在容器镜像被泄露时公开暴露。
设置和实际操作
我们将展示两种方法。第一种是共享 Kubernetes 集群,其中每个临时环境都是一个单独的命名空间,但底层集群是相同的。第二种是为每个临时环境建立一个单独的集群。
第一种方法更具成本效益,而第二种方法则能在合规需要时提供不同环境之间更多的分离。
在这个演示中,我们将有一个由2个微服务和一个 Mongo 数据库组成的系统,我们将在其中一个微服务上打开一个拉取请求,通过打开这个 PR,我们将在 Kubernetes 上创建一个新环境,我们将使用 vcluster 来创建和销毁临时环境,在完成测试后,我们应该更轻松地关闭或合并拉取请求,这将触发另一个流水线来销毁临时环境。
我已经在本地的 Kubernetes 集群上部署了这些工作负载,使用 GitHub Action 工作流和 kustomize 创建了流水线,以轻松部署整个系统。
对于开发环境,我们需要创建流水线,为每个微服务自动创建临时环境,我们的流水线应包含以下步骤:
- 检验代码
- 建立 docker 镜像
- 推进新的 docker 镜像
- 更新 Kubernetes 的清单列表
- 部署新的临时环境
- 部署这个环境中的整个系统
- 提供对该环境的访问权限
请注意:这并不是开发工作流程的最终流水线,这些步骤只是为了演示。
我们将使用 vcluster 创建完全隔离的 Kubernetes 环境,请参考下面的 GitHub Action workflow 文件:
该流水线上的步骤将创建一个镜像,并将其推送到我们的 docker registry,然后用新标签更新 Github,之后将部署一个虚拟集群,并通过正常的 KUBECONFIG 文件提供对它的访问。
您可以根据自己的用户授权方式,以不同的方式处理集群访问问题。
现在运行 vcluster list 命令,我们就能看到新创建的临时集群,集群名称取决于 GitHub 上的提交 SHA 和用户 ID,以避免创建同名集群。
现在让我们检查已部署的工作负载。
现在我们已将全部的工作负载部署到新的环境并有且仅针对该环境。
由于开发环境是在开发人员需要时按需创建的,因此最好每隔几个小时就自动销毁这些开发环境,以避免主集群资源一直处于繁忙状态。
现在,我们已经完成了开发工作,准备开启拉取请求,将新变更合并到主分支,在创建 PR 时,将创建一个新环境,仅用于测试新变更,该环境应供 QA 和测试团队使用,以接受新变更/功能。
PR GitHub workflow 与开发环境几乎相同,但我们不会在 GitHub 上推送新的镜像 tag,而是直接将其部署到新创建的临时环境中。
总结
总之,临时环境为大型团队开发和测试软件提供了一种经济高效的方式。它们无需管理和维护永久环境,从而降低了基础设施成本,加快了开发周期。随着云原生技术的发展、微服务架构的普及,应用系统的服务及依赖资源的数量迅猛增长。在应用环境管理自动化程度不高的情况下,繁琐的环境部署配置工作使得大量研发测试环境即便空闲时段也处于运行状态,资源长期占用不释放,导致不必要的开销。因此,研发测试环境的资源治理是在降本增效大背景下一项艰巨的任务。
Walrus 支持对全套应用系统的统一编排,并在最新版本中提供环境随时启停的特性。用户可以在闲时停止整个应用环境,回收底层运行的服务和环境资源。在环境停止期间,Walrus 保留整个应用系统的配置数据,便于下次重启时,应用环境中的所有服务和资源可以轻松回到停止前的状态,极大降低资源消耗成本,实现研发测试环境资源的有效治理。
除此之外,利用 Walrus 0.4 中提供的服务/资源草稿(Services/Resources Draft)功能和服务/资源/环境启停和克隆功能,可以在资源有限的情况下一键启停切换多套测试环境,以快速进行测试验证工作,在增加资源利用率的同时提升部署效率并节省成本,切实助力企业降本增效。