Menu

从本地快速迭代到生产级持续交付,采用 GitOps、ArgoCD/Argo Rollouts 与可观察性最佳实践构建可靠的 Kubernetes 发布流程。

概览

本文基于行业实践,讲解一套面向生产的 Kubernetes 应用开发与部署流程,涵盖:

下图为推荐的端到端架构与数据流。

```mermaid “End-to-End 发布架构” graph LR Dev[“Developer Workstation”] SC[“Source Control (Git)”] CI[“CI Runner (GitHub Actions / Tekton)”] Registry[“OCI Registry\n(e.g. GHCR/Harbor/ACR)”] ImageScan[“Image Scanning\n(Trivy/Clair)”] CD[“GitOps (ArgoCD)”] Rollouts[“Progressive Delivery\n(Argo Rollouts)”] Cluster[“Kubernetes Clusters\n(dev/stage/prod)”] Observability[“Observability\n(Prometheus/Grafana)”] Policy[“Policy Engine\n(Kyverno/OPA)”]

Dev –>|push| SC SC –> CI CI –> Registry Registry –> ImageScan ImageScan –> Registry Registry –> CD CD –> Cluster Cluster –> Rollouts Cluster –> Observability CD –> Policy Observability –> CD


![End-to-End 发布架构](/devops/deploy-applications-in-kubernetes/1327ae365d5cfdf821401583f1945658.svg)
{width=2551 height=351}

## 示例应用简介

本文示例沿用原文的两个服务,便于示范微服务通信与部署实践:

- k8s-app-monitor-test:生成模拟监控指标的服务(REST API)
- k8s-app-monitor-agent:消费并展示监控数据的前端/后端服务

示例仍可用于本地和集群验证;后续配套清单将给出常用 YAML 与 Helm 示例。

## 本地开发与快速迭代

在本地优先进行快速迭代,建议使用轻量 Kubernetes(k3d / kind)或远程 dev-cluster,并结合 Skaffold 或 Tilt 实现代码到容器的快速循环。这样可以保持与生产相近的环境并显著缩短反馈时间。

```mermaid "本地开发工作流"
graph LR
  Code["Code Edit"]
  Build["Local Build\n(Docker / Buildkit)"]
  Skaffold["Skaffold / Tilt"]
  k3d["k3d / kind Cluster"]
  Debug["Debug / Logs / Port-forward"]

  Code --> Build --> Skaffold --> k3d
  k3d --> Debug

本地开发工作流 {width=1920 height=126}

建议工具与理由:

镜像构建与安全

镜像仍是交付单元,2025 年推荐实践:

示例 GitHub Actions 构建与推送(仅示例,CI secret 与缓存按需配置):

name: Build and push image
on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: $
          password: $
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ghcr.io/myorg/myapp:$
          outputs: type=registry
      - name: Scan image
        uses: aquasecurity/trivy-action@v1
        with:
          image-ref: ghcr.io/myorg/myapp:$

同时在 CI 中生成 SBOM(CycloneDX / SPDX),并把扫描结果发送到集中告警或 Issue 流程。

配置与清单管理

建议使用 Helm 或 Kustomize 管理 Kubernetes 配置,优先将环境差异抽象到 values / overlays:

示例目录结构(推荐):

切忌直接在集群中做一次性更改;所有变更应通过 Git 提交并纳入审计。

GitOps 与持续交付

2025 年主流模式是将 Git 作为单一事实来源(Single Source of Truth),并使用 ArgoCD / Flux 进行自动同步与审计。结合 Argo Rollouts 可实现金丝雀与蓝绿等渐进式交付。

整体 GitOps 流程示意:

```mermaid “GitOps 工作流” graph LR Dev[“Developer”] Git[“Git Repository\n(manifests / helm-values)”] PR[“Pull Request\n(code + manifests)”] CI[“CI (build + scan)”] Registry[“OCI Registry”] ArgoCD[“ArgoCD”] Cluster[“Kubernetes Cluster”] Rollouts[“Argo Rollouts”]

Dev –> PR –> CI –> Registry CI –> Git Git –> ArgoCD –> Cluster Cluster –> Rollouts


![GitOps 工作流](/devops/deploy-applications-in-kubernetes/360e88e5d3d3f27c59218107322ea7af.svg)
{width=2020 height=239}

ArgoCD 优势:自动化同步、回滚、审计(历史记录)、多集群支持。实践中建议:

- 为每个环境使用独立 Git 分支或目录(GitOps 结构化)
- 将 ArgoCD Application 和 Project 进行权限隔离
- 把机密数据放到 SealedSecrets / SOPS / External Secrets 中

示例 Argo CD Application(values 存放在 Git):

```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: monitor-app-prod
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/myorg/myrepo.git'
    targetRevision: HEAD
    path: ops/overlays/prod
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: monitor
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

渐进式交付(Argo Rollouts)

对于生产流量变更,建议使用 Argo Rollouts 或 service-mesh 原生功能做金丝雀 / 蓝绿发布,并结合指标分析(Prometheus)自动决策。Argo Rollouts 可与 Istio / NGINX / APISIX 等路由器集成。

示例 Canary 步骤(节选):

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
spec:
  replicas: 3
  strategy:
    canary:
      steps:
      - setWeight: 10
      - pause: {duration: 60}
      - setWeight: 50
      - pause: {duration: 120}
  selector:
    matchLabels:
      app: rollouts-demo
  template:
    metadata:
      labels:
        app: rollouts-demo
    spec:
      containers:
      - name: app
        image: ghcr.io/myorg/myapp:TAG

与 AnalysisTemplate 集成后,可在每个步骤基于错误率、延迟等指标自动中止或回滚。

策略、合规与安全

生产集群应启用策略引擎与 Admission 控制:

同时建议把安全门(Shift-left)前移至开发与 CI 阶段,例如依赖漏洞、许可证违规与容器漏洞都在 CI 阶段阻断。

可观测性与告警

可靠发布依赖完善可观测性:

示例监控回路:在 Canary 步骤中,Argo Rollouts 调用 AnalysisRun 查询 Prometheus 指标,若超阈值则中止并回滚。

部署示例流程(精简步骤)

  1. 本地开发,使用 Skaffold 推送到 dev cluster 并验证。
  2. 提交代码到 Git,触发 CI,构建镜像并推送到 OCI registry,同时产出 SBOM 并扫描。
  3. CI 将构建产物与版本标签写入 manifests(或触发 PR 更新 Helm values)。
  4. GitOps(ArgoCD)检测 Git 变更并同步到集群,触发 Argo Rollouts 做金丝雀发布。
  5. 监控与 AnalysisRun 验证指标;异常则触发自动回滚并告警。

工具对比(简要)

常用工具对比

功能 推荐工具(示例)
本地集群 k3d / kind
开发循环 Skaffold / Tilt
CI GitHub Actions / Tekton
GitOps/CD ArgoCD / Flux
渐进式交付 Argo Rollouts
镜像扫描 Trivy / Grype
策略引擎 Kyverno / OPA Gatekeeper
可观测性 Prometheus / Grafana / OTel

迁移与兼容性注意点

总结

到 2025 年,Kubernetes 应用交付的核心原则是“可观测的渐进式交付”和“GitOps 为中心的自动化”。推荐采用本地快速迭代工具(k3d、Skaffold)、在 CI 中强化镜像与依赖扫描、使用 GitOps(ArgoCD)实现可审计部署,并用 Argo Rollouts 做渐进式发布与自动回滚。策略引擎(Kyverno / OPA)和完善的可观测性是保障可靠性的关键。

参考文献

  1. Argo CD - argoproj.io
  2. Argo Rollouts - argoproj.io
  3. Skaffold - skaffold.dev
  4. Trivy - aquasecurity.github.io/trivy/
  5. Kyverno - kyverno.io
  6. OpenTelemetry - opentelemetry.io

Menu