K8S实战之基于 Argo CD 实现 Preview 部署:提前捕获问题,提升交付质量

133 阅读6分钟

基于 Argo CD 实现 Preview 部署:提前捕获问题,提升交付质量

在现代软件开发中,代码在本地运行良好却在生产环境中出现问题是开发者常见的痛点。这些问题可能源于复杂的环境差异、未处理的边界情况或集成错误。这不仅增加了开发人员的压力,也可能导致生产环境停机、用户体验受损以及高昂的修复成本。

为了更高效地捕获这些问题,Preview 部署(也称为临时环境部署)成为了 DevOps 流程中的重要工具。通过为每个 Pull Request (PR) 创建一个临时的生产环境,开发者可以在代码合并前进行全面测试,从而大幅降低上线风险。

本文将详细介绍如何使用 Argo CD 的 Pull Request Generator 功能,结合 Kubernetes 和 CI/CD 工具链,构建自动化的 Preview 部署流程。


什么是 Preview 部署?

Preview 部署是一种临时环境的创建方式,它会为每个 Pull Request 或分支生成一个隔离的环境。这些环境模拟生产环境的配置,允许开发者在代码合并前测试其行为和效果。

相较于本地测试,Preview 部署能够更真实地反映代码在生产环境中的运行情况,尤其是在以下场景中表现尤为突出:

  • 捕获数据库连接问题或配置错误;
  • 发现跨浏览器或跨设备的 UI 问题;
  • 识别性能瓶颈或流量负载问题;
  • 验证第三方服务或集成接口的行为。

通过 Preview 部署,团队可以更早发现问题,从而节省时间、提升效率,并显著降低生产环境的故障风险。


基于 Argo CD 的 Preview 部署架构

Argo CD 是一款基于 Kubernetes 的声明式 GitOps 工具,其 Pull Request Generator 功能可以自动检测 Git 仓库中的 PR,并为其生成相应的 Kubernetes 部署配置。以下是 Preview 部署的工作流程:

  1. 创建 Pull Request:开发者提交代码变更并创建 PR,同时为 PR 添加特定的标签(如 "preview")。
  2. 构建镜像:CI/CD 流水线检测到 PR 后,基于代码构建一个新的 Docker 镜像,并将其推送到镜像仓库。
  3. 生成环境配置:Argo CD 的 Pull Request Generator 根据预定义的模板,为该 PR 创建 Kubernetes 部署清单。
  4. 部署到 Kubernetes 集群:Argo CD 使用生成的清单,将应用部署到指定的临时命名空间中。
  5. 环境销毁:当 PR 被关闭或标签被移除时,临时环境自动销毁,避免资源浪费。

架构图示

以下是基于 Argo CD 的 Preview 部署架构图:

Argo CD Preview Deployment Architecture


实现步骤

在开始之前,请确保具备以下前置条件:

  • 已安装并配置 Argo CD
  • 一个支持 CI/CD 的工具链(如 GitHub ActionsGitLab CI);
  • 一个容器镜像仓库(如 Docker Hub);
  • 一个可用的 Kubernetes 集群;
  • Helm 用于管理模板化的 Kubernetes 配置。

步骤 1:创建基础应用

首先,在 Argo CD 中创建一个基础应用,用于管理临时部署。该应用需指向存储 Kubernetes 配置的 Git 仓库中的特定路径(如 ephemeral_apps)。以下是配置示例:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: preview_apps
spec:
  destination:
    server: 'https://kubernetes.default.svc'
  source:
    path: ephemeral_apps
    repoURL: 'https://github.com/YourRepo/k8s-manifest.git'
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated: null
    syncOptions:
      - CreateNamespace=true

步骤 2:创建 GitHub Token

为了让 Argo CD 能够监控 GitHub 仓库中的 PR,需要创建一个包含 GitHub 个人访问令牌的 Kubernetes Secret:

kubectl create secret generic github-token \
  --from-literal=token=<YOUR_GITHUB_TOKEN>

步骤 3:定义部署模板

通过 Argo CD 的 ApplicationSet,定义一个模板,用于为每个带有 "preview" 标签的 PR 生成 Kubernetes 配置。以下是示例配置:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: preview-deployments
spec:
  generators:
    - pullRequest:
        github:
          owner: YourGitHubUser
          repo: YourRepo
          tokenRef:
            secretName: github-token
            key: token
          labels:
            - preview
        requeueAfterSeconds: 60
  template:
    metadata:
      name: 'preview-{{branch}}-{{number}}'
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: 'https://github.com/YourGitHubUser/YourRepo.git'
        targetRevision: main
        path: ./helm-chart
        helm:
          values: |
            namespace: 'preview-{{branch}}'
            image:
              repository: YourDockerRepo/YourApp
              tag: '{{head_sha}}'
            ingress:
              hosts:
                - host: preview-{{number}}.yourdomain.com
                  paths:
                    - path: /*
                      pathType: ImplementationSpecific
            createNamespace: true
      destination:
        namespace: 'preview-{{branch}}'
        server: 'https://kubernetes.default.svc'
      syncPolicy:
        automated:
          selfHeal: true
          prune: true

步骤 4:配置 CI/CD 流水线

在代码仓库中创建一个 GitHub Actions 工作流,用于在 PR 创建或标签更新时构建并推送镜像。以下是示例配置:

name: Build and Deploy Preview
on:
  pull_request:
    types: [labeled]
    branches:
      - main
      - staging

jobs:
  build:
    runs-on: ubuntu-latest
    if: github.event.label.name == 'preview'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: YourDockerRepo/YourApp:${{ github.sha }}

测试与验证

完成配置后,您可以通过以下步骤验证流程:

  1. 修改代码并提交 Pull Request;
  2. 为 PR 添加 "preview" 标签;
  3. 等待 CI/CD 流水线完成镜像构建;
  4. 在 Argo CD 界面查看生成的临时应用;
  5. 访问临时环境的 URL 进行测试。

当 PR 被关闭或标签被移除时,Argo CD 会自动删除对应的临时环境。


结语

通过 Argo CD 和 Preview 部署,开发团队可以显著提升代码测试的覆盖率和准确性。这种自动化的流程不仅减少了人为干预,还提高了交付的可靠性。对于追求高效和稳定的开发团队而言,这是不可或缺的一项实践。

希望本文能为您在实际项目中实现 Preview 部署提供指导。如有任何问题,欢迎留言探讨!


原文关注公众号“云原生SRE”

入知识星球,共同探索云原生学习之旅!