name: 实现-gitops description: 使用ArgoCD或Flux为Kubernetes实施GitOps持续交付。用于基于Git作为单一事实来源的自动部署、拉取式交付、漂移检测、多集群管理和渐进式发布。
GitOps工作流程
为Kubernetes实施GitOps持续交付,使用声明式、拉取式部署模型,其中Git作为基础设施和应用程序配置的单一事实来源。
何时使用
使用GitOps工作流程于:
- Kubernetes部署: 自动化应用程序和基础设施部署到Kubernetes集群
- 多集群管理: 跨开发、暂存、生产和边缘集群管理部署
- 持续交付: 实施基于拉取的CD管道,具有自动协调功能
- 漂移检测: 自动检测并纠正与期望状态的配置偏差
- 审计要求: 通过Git提交维护完整的审计跟踪以符合合规性
- 渐进式交付: 实施金丝雀、蓝绿或滚动部署策略
- 灾难恢复: 通过GitOps引导流程实现快速集群恢复
触发关键词:“部署到Kubernetes”、“ArgoCD设置”、“Flux引导”、“GitOps管道”、“环境推广”、“多集群部署”、“自动协调”
核心GitOps原则
1. Git作为单一事实来源
所有系统配置存储在Git仓库中。无需手动kubectl apply或集群修改。使用声明式清单(YAML)定义所有Kubernetes资源、环境特定覆盖、基础设施配置和应用程序部署。
2. 拉取式部署
在集群内运行的运算符从Git拉取更改并自动应用。优点包括在CI/CD管道中无需集群凭证、支持隔离环境、通过持续协调实现自我修复,以及简化CI/CD。
3. 自动协调
GitOps运算符持续比较集群实际状态与Git中的期望状态,并通过连续循环协调差异:监控Git、比较实时状态、应用差异、报告状态、重复。
4. 声明式配置
使用声明式Kubernetes清单(非命令式脚本)定义期望状态。
工具选择
ArgoCD vs Flux
| 决策因素 | 选择ArgoCD | 选择Flux |
|---|---|---|
| 团队偏好 | 通过Web UI进行可视化管理 | CLI/API优先的工作流程 |
| 学习曲线 | 通过UI更容易上手 | 更陡峭但更灵活 |
| 架构 | 单体、有状态控制器 | 模块化、无状态控制器 |
| 多租户 | 内置RBAC和项目 | 原生Kubernetes RBAC |
| 资源使用 | 较高(包含UI组件) | 较低(最小控制器) |
| 最适合 | 过渡到GitOps | 平台工程 |
混合方法: 一些团队使用Flux进行基础设施管理,使用ArgoCD进行应用程序管理。
对于ArgoCD实现模式,参见references/argocd-patterns.md 对于Flux实现模式,参见references/flux-patterns.md 对于Kustomize覆盖模式,参见references/kustomize-overlays.md
快速开始
ArgoCD安装
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
基本应用程序:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/repo.git
targetRevision: HEAD
path: k8s/overlays/prod
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
automated:
prune: true
selfHeal: true
Flux引导
flux bootstrap github \
--owner=myorg \
--repository=fleet-infra \
--branch=main \
--path=clusters/production
基本Kustomization:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: myapp
namespace: flux-system
spec:
interval: 10m
path: "./k8s/prod"
prune: true
sourceRef:
kind: GitRepository
name: myapp
对于完整示例,参见examples/argocd/和examples/flux/
环境推广
基于分支策略: 开发分支 → 暂存分支 → 主分支(生产) 基于Kustomize策略: k8s/base/ → k8s/overlays/{dev,staging,prod}/
推广流程:
- 合并代码更改到主分支
- CI构建带标签的容器镜像
- 在环境覆盖中更新镜像标签(Git提交)
- GitOps运算符检测更改并部署
- 在环境中测试
- 通过更新Git推广到下一个环境
对于多环境ApplicationSet模式,参见references/argocd-patterns.md
多集群管理
ArgoCD: 使用argocd CLI注册外部集群,使用ApplicationSets按集群生成Applications,从单个ArgoCD实例管理。
Flux: 为每个集群引导Flux,使用相同Git仓库和集群特定路径,通过kubeConfig密钥配置远程集群。
对于详细的多集群模式,参见references/multi-cluster.md
渐进式交付
金丝雀部署: 逐步将流量转移到新版本,在发布期间监控指标,失败时自动回滚。
蓝绿部署: 将新版本与旧版本并行部署,原子性地切换流量,如果检测到问题则即时回滚。
ArgoCD: 使用Argo Rollouts进行渐进式交付 Flux: 集成Flagger进行自动金丝雀分析
对于渐进式交付策略和Argo Rollouts示例,参见references/progressive-delivery.md
秘密管理
GitOps要求将配置存储在Git中,但秘密必须受到保护。
| 工具 | 方法 | 安全性 | 复杂度 |
|---|---|---|---|
| Sealed Secrets | 为Git加密秘密 | 中等 | 低 |
| SOPS | 使用KMS加密文件 | 高 | 中等 |
| External Secrets | 引用外部保险库 | 高 | 中等 |
| HashiCorp Vault | 集中秘密管理 | 非常高 | 高 |
对于秘密管理集成模式,参见references/secret-management.md
漂移检测和修复
GitOps运算符持续监控Git(期望状态)和集群(实际状态)之间的漂移。
ArgoCD自动自我修复:
syncPolicy:
automated:
prune: true # 移除Git中不存在的资源
selfHeal: true # 还原手动更改
Flux自动协调:
spec:
interval: 10m # 每10分钟检查
prune: true # 移除Git中不存在的资源
force: true # 在冲突时强制应用
手动操作:
# ArgoCD
argocd app get myapp # 查看同步状态
argocd app diff myapp # 显示差异
argocd app sync myapp # 手动触发同步
# Flux
flux get kustomizations # 查看同步状态
flux reconcile kustomization myapp # 强制立即同步
对于漂移检测策略和故障排除,参见references/drift-remediation.md
同步钩子和生命周期
使用钩子在同步前后执行操作。
PreSync钩子(数据库迁移):
apiVersion: batch/v1
kind: Job
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
PostSync钩子(冒烟测试):
apiVersion: batch/v1
kind: Job
metadata:
annotations:
argocd.argoproj.io/hook: PostSync
对于完整同步钩子示例,参见examples/argocd/sync-hooks.yaml
监控和可观察性
关键指标
- 同步状态: OutOfSync、Synced、Unknown
- 同步频率: 协调发生的频率
- 漂移检测: 检测配置漂移的时间
- 同步持续时间: 应用更改的时间
- 失败率: 失败同步的原因
ArgoCD指标: 在/metrics端点暴露(argocd_app_sync_total、argocd_app_info)
Flux指标: 来自控制器(gotk_reconcile_condition、gotk_reconcile_duration_seconds)
故障排除
常见问题
同步卡住/OutOfSync:
- 检查Git仓库可访问性
- 验证清单是有效YAML
- 查看同步日志以查找错误
- 检查资源终结器
自我修复不工作:
- 验证syncPolicy中selfHeal已启用
- 检查运算符具有写权限
- 查看资源所有权标签
秘密不解密:
- 验证SOPS/ESO控制器已安装
- 检查KMS/Vault凭证
- 查看加密密钥配置
CLI快速参考
ArgoCD命令
argocd app create <name> # 创建应用程序
argocd app get <name> # 查看状态
argocd app sync <name> # 触发同步
argocd app diff <name> # 显示漂移
argocd app list # 列出所有应用程序
Flux命令
flux create source git <name> # 创建Git源
flux create kustomization <name> # 创建kustomization
flux get all # 查看所有资源
flux reconcile <kind> <name> # 强制协调
flux logs # 查看控制器日志
Kustomize命令
kustomize build k8s/overlays/prod # 预览生成的YAML
kubectl apply -k k8s/overlays/prod # 直接应用
kubectl diff -k k8s/overlays/prod # 显示差异
安装脚本
使用提供的安装脚本进行快速设置:
# 安装ArgoCD
./scripts/install-argocd.sh
# 引导Flux
export GITHUB_TOKEN=<token>
export GITHUB_OWNER=<org>
export GITHUB_REPO=fleet-infra
./scripts/install-flux.sh
# 检查漂移
./scripts/check-drift.sh
# 推广环境
./scripts/promote-env.sh dev staging
示例文件
在examples/目录中提供完整的工作示例:
ArgoCD示例:
- examples/argocd/application.yaml - 基本Application
- examples/argocd/applicationset.yaml - 多环境ApplicationSet
- examples/argocd/progressive-rollout.yaml - 渐进式发布策略
- examples/argocd/sync-hooks.yaml - PreSync/PostSync钩子
Flux示例:
- examples/flux/gitrepository.yaml - Git源配置
- examples/flux/kustomization.yaml - Kustomization控制器
- examples/flux/helmrelease.yaml - Helm发布管理
- examples/flux/ocirepository.yaml - OCI artifact源
Kustomize示例:
- examples/kustomize/base/ - 基础配置
- examples/kustomize/overlays/{dev,staging,prod}/ - 环境覆盖
发布示例:
- examples/rollouts/canary.yaml - 使用Argo Rollouts的金丝雀部署
- examples/rollouts/blue-green.yaml - 蓝绿部署策略
相关技能
- kubernetes-operations: Kubernetes基础知识和资源管理
- infrastructure-as-code: 预配置GitOps部署到的集群
- building-ci-pipelines: CI构建镜像,GitOps部署它们
- secret-management: Vault/ESO与GitOps的集成
- deploying-applications: GitOps作为部署机制
总结
GitOps为Kubernetes提供自动化、声明式的持续交付,以Git作为单一事实来源。选择ArgoCD用于UI驱动的工作流程,或选择Flux用于CLI/API优先的方法。实施自动协调、漂移检测和渐进式交付,以实现可靠的大规模部署。集成秘密管理、多集群编排和灾难恢复,以构建生产级GitOps工作流程。