大家好!这是GitOps系列的第三期。前面我们已经探讨了GitOps的定义和应用案例。今天,我们将深入探讨其基础,深入了解支撑GitOps的4个绝对原则以及在实际工作中应用时面临的现实问题。
我们将超越单纯的理论,从实践者的角度为您提供详细指导!🚀
GitOps的工作方式与一般的CI/CD不同,其核心就在于这些“原则”。让我们逐一剖析OpenGitOps项目定义的标准原则吧!

1. 声明式状态定义 (Declarative) 📜
所有系统状态都必须是声明式(Declarative)的。
- 命令式(Imperative): “连接到服务器,安装nginx并打开80端口。”(过程导向)
- 声明式(Declarative): “该系统的最终状态应该是‘nginx已安装且80端口已打开’。”(结果导向)
- 原因: 声明式方法可重现,并允许系统自行判断需要做什么。通常以YAML或JSON文件编写。
2. 版本控制和不变性 (Versioned and Immutable) 🔄
所有声明的状态都必须存储在Git等版本控制系统中。
- 原因: 它会留下谁、何时、为何进行更改的记录。此外,“不变性”意味着一旦部署的代码不会被修改,如果需要更改,则创建新版本并重新部署。这是实现“回滚(Rollback)”(在发生故障时最可靠的解决方案)的关键。
3. 自动同步 (Pulled Automatically) 🤖
存储在Git中的“期望状态(Desired State)”必须自动反映到实际的生产环境中。
- 原因: 当人们手动输入命令进行部署时,Git内容与实际服务器状态可能会出现差异。软件(代理)代替执行此角色,从而防止人为错误。
4. 持续协调 (Continuous Reconciliation) ⚖️
系统必须实时监控“Git的状态”与“实际环境的状态”是否一致。
- 核心概念: 如果有人不小心手动更改了生产服务器的配置(Configuration Drift),GitOps工具会检测到这一点,并将其恢复到Git中记录的状态。这被称为“自愈(Self-healing)”。
🛠️ GitOps的实践:实施时需要考虑的现实问题
理论很美好,但实际应用中存在一些高山。我们整理了您在实践中必然会遇到的问题。
1. Git仓库策略 (Repository Strategy) 📂
这是关于将应用程序源代码和部署用的YAML文件放在何处的问题。
- Mono Repo: 将代码和基础设施配置放在一处。管理方便,但每次CI构建运行时,部署记录可能会混淆,使管理变得复杂。
- Separate Repo (推荐): 将代码仓库和环境配置(Config)仓库分开。安全管理和部署历史管理会更加清晰。
2. 密钥管理 (Secret Management) 🔑
Git的伟大原则是“存储所有内容”,但不能直接上传密码或API密钥。
- 解决方案: * Sealed Secrets: 以加密状态上传到Git,仅在集群内部解密。
- External Secrets Operator: 从AWS Secrets Manager或HashiCorp Vault等外部存储中获取值并连接。
3. CI与CD的分离 ✂️
GitOps倾向于严格区分CI和CD。
- CI (Build): 测试代码,构建镜像并推送到注册表。(例如GitHub Actions、Jenkins等)
- CD (Deploy): 根据更新的镜像标签的YAML文件,将其反映到生产环境。(例如Argo CD、Flux等)
- 实际流程: 开发者合并代码后,CI会创建镜像,并自动更新(提交)配置仓库中的镜像版本。然后CD工具会检测到这一点并完成部署。
📈 引入GitOps后工作流程的变化
GitOps稳定后,开发团队的一天将这样改变:
- 开发: 在本地开发功能。💻
- PR请求: 如果需要更改基础设施,修改YAML文件并提交PR。📑
- 审查和批准: 同事和运维团队通过代码审查验证更改。✅
- 合并: PR获得批准并合并到主分支。🤝
- 自动部署: Argo CD检测到此更改并实时更新生产环境。🚀
- 监控: 在仪表板上确认绿灯(Synced)亮起,然后安心下班。☕
🏁 总结:GitOps是“信任”的技术
GitOps的真正价值在于提供“生产环境与我在Git中写入的内容100%一致”的信念。这种信任建立起来后,部署的恐惧就会消失,团队可以更快地创新。
请将今天探讨的四个原则铭记于心,并尝试将其逐一融入您的项目中。
发表回复