Files
cs-note/hhs/MS/05-部署运维/03-CICD与GitOps.md
T
2026-05-24 11:42:38 +08:00

206 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [microservice, cicd, gitops, github-actions, argocd, kubernetes, helm]
create time: 2026-05-05 14:30
---
# CI/CD 与 GitOps — 参考手册
## 概述
微服务架构下的自动化交付体系。**一次构建,多处部署**是核心哲学——镜像不随环境重新编译,只改 K8s ConfigMap。本文档是总入口:顶层概念、决策矩阵、速查表见本页;详细教程和实操指南在子文档中。
---
## 快速导航
| 主题 | 定位 | 文档 |
|------|------|------|
| Pipeline 搭建 | **教程**:从 0 到 1 写出一个能跑的流水线 | [[03-CICD与GitOps/01-CICD基础与实践]] |
| GitOps & ArgoCD | **教程**:Push → Pull 架构迁移、Application CRD | [[03-CICD与GitOps/02-GitOps与ArgoCD]] |
| Helm 模板 | **操作手册**:values.yaml、Go 模板、多环境覆盖 | [[03-CICD与GitOps/03-Helm模板管理]] |
| 安全 & 发布策略 | **决策指南**:Secret 选型、Canary vs Blue-Green | [[03-CICD与GitOps/04-安全与发布策略]] |
---
## 架构全景
```mermaid
flowchart LR
Dev["开发者 push"] --> CI["GitHub Actions\n(CI: 测试→构建→Push镜像)"]
CI -->|"新镜像"| REG["Container Registry"]
Dev2["开发者 PR manifest"] --> MANIFEST["Git Manifest Repo"]
subgraph Cluster["K8s Cluster"]
Argo["ArgoCD"] -->|"自动同步"| WORKLOADS["Pod / Service / ..."]
end
MANIFEST -.->|Watch 变动| Argo
style CI fill:#e8f5e9
style Argo fill:#fff3e0
style WORKLOADS fill:#e3f2fd
```
**核心分工**:**CI/CD 管"怎么建"**(构建、扫描、推送镜像),**GitOps 管"怎么维持"**(Git 声明 → 集群自动同步)。
---
## 标签策略速查
| Tag | 示例 | 用途 | 安全性 |
|-----|------|------|--------|
| `latest` | `nginx:latest` | ❌ 开发调试 | ❌ 可被覆盖,不可回滚 |
| 语义版本 | `v1.2.3` | ✅ 人类阅读、快速参考 | ⚠️ 仍可被更新覆盖 |
| Commit SHA | `sha256:a1b2c3d` | ✅ 机器精确引用、精确回滚 | ✅ 全局唯一、不可变 |
| Run Number | `v123` | ✅ GitHub Actions 快速参考 | ⚠️ 单次 workflow 内唯一 |
> **推荐**:同时打 `sha256:{commit}` + `v{run_number}`。生产回滚优先用 Commit SHA。
---
## Pipeline 阶段对照
| 阶段 | 做什么 | 工具举例 | 详见 |
|------|--------|---------|------|
| 触发过滤 | 只对相关代码变更构建 | `paths`, `pull_request` | [[03-CICD与GitOps/01-CICD基础与实践]] |
| 测试 | 单元测试 + 集成测试 | Jest, pytest, go test | [[03-CICD与GitOps/01-CICD基础与实践]] |
| 安全扫描 | 镜像/依赖漏洞检测 | Trivy, Snyk | [[03-CICD与GitOps/04-安全与发布策略]] |
| 构建+推送 | Docker image 构建并推仓库 | docker build/push | [[03-CICD与GitOps/01-CICD基础与实践]] |
| Staging 验证 | 预发布环境冒烟测试 | kubectl set image | [[03-CICD与GitOps/01-CICD基础与实践]] |
| Production | 灰度放量,人工审批关卡 | Canary, Blue-Green | [[03-CICD与GitOps/04-安全与发布策略]] |
---
## 部署驱动模式对比
| 维度 | 传统 CI/CD (Push) | GitOps (Pull) |
|------|------------------|---------------|
| 部署驱动 | CI 服务器主动推送 | Git 仓库变动触发拉取 |
| 状态源 | CI pipeline 历史 | Git commit history |
| 漂移检测 | 通常无 | 持续比对,自动修复 |
| 安全边界 | CI 需直连 K8s | ArgoCD 集群内运行 |
| 回滚方式 | 回到上一次的 pipeline | `git revert` + 自动同步 |
| 代表工具 | Jenkins, GitHub Actions | ArgoCD, Flux |
> **选型建议**:团队规模 < 20 人时 Push 模式足够。≥ 50 人或多环境场景建议迁移到 GitOps。
---
## Secret 管理方案对比
| 方案 | 适用场景 | 优点 | 缺点 |
|------|---------|------|------|
| K8s 原生 Secret | 小规模内部团队 | 零成本,开箱即用 | etcd 明文存储 |
| ESO (External Secrets) | 已有 Vault / AWS SSM | Git 中无密文 | 需维护额外组件 |
| SOPS + sealed-secrets | ArgoCD 用户 | 加密文件可提交到 Git | 需管理 PKI |
| 云厂商 Secret Manager | 深度绑定单一云平台 | 审计完善 | 平台锁定 |
> **渐进路径**:K8s Secret → 接入云厂商 Secret Manager → 引入 ESO 实现多云解耦。
---
## 发布策略对比
| 维度 | Rolling Update | Canary | Blue-Green | Experiment |
|------|---------------|--------|------------|------------|
| 停机时间 | 可能有抖动 | 零 | 零 | 零 |
| 复杂度 | 低 | 中 | 中高 | 高 |
| 资源消耗 | 1x | 1.5x | 2x | 2x+ |
| 回滚速度 | 慢(完整重建) | 快(切流量) | 秒级 | 秒级 |
| 典型场景 | 内部服务 | 用户-facing | 重要版本 | A/B 测试 |
---
## 编排工具选型
| 服务规模 | 推荐方案 | 理由 |
|----------|---------|------|
| < 10 个服务 | Kustomize / 裸 YAML | 复杂度高于收益 |
| 10~50 个服务 | Helm | 模板复用价值明显 |
| > 50 个服务 | Helm + Kustomize overlays | Helm 管模板,Kustomize 管环境差异 |
---
## 关键决策流程图
### Secret 选型决策
```mermaid
flowchart TD
START["开始选型"] --> SIZE["团队 < 20人?"]
SIZE -- 是 --> K8SSECRET["✅ K8s 原生 Secret"]
SIZE -- 否 --> CLOUD["深度绑定云厂商?"]
CLOUD -- 是 --> SECRETMGR["✅ Cloud Secret Manager"]
CLOUD -- 否 --> GITOPS["使用 ArgoCD?"]
GITOPS -- 是 --> SOPS["✅ SOPS + sealed-secrets"]
GITOPS -- 否 --> ESO["✅ External Secrets Operator"]
style K8SSECRET fill:#e8f5e9
style SECRETMGR fill:#e3f2fd
style SOPS fill:#fff3e0
style ESO fill:#f3e5f5
```
### 渐进式采纳路径
```mermaid
flowchart LR
STEP1[("1. 自动化构建+Push")] --> STEP2[("2. Staging + 审批")] --> STEP3[("3. GitOps, Git 即真相源")]
style STEP1 fill:#e8f5e9
style STEP2 fill:#fff3e0
style STEP3 fill:#e3f2fd
```
---
## 附录:常用命令速查
### GitHub Actions
```bash
# 查看 workflow 运行记录
gh run list --workflow deploy.yml
# 手动触发 workflow
gh workflow run deploy.yml --ref main
```
### kubectl
```bash
# 滚动更新指定镜像
kubectl set image deployment/order-service \
order=registry.example.com/order-service:v1.2.3 -n production
# 查看 rollout 状态
kubectl rollout status deployment/order-service -n production --timeout=120s
# 回滚到上一版本
kubectl rollout undo deployment/order-service -n production
```
### ArgoCD CLI
```bash
argocd app sync order-service # 手动同步
argocd app diff order-service # Git vs 实际差异
argocd app history order-service # 同步历史
argocd app rollback order-service # 回滚
```
### Helm
```bash
helm upgrade --install order-service ./charts/order-service -n production
helm upgrade --install order-service ./charts/order-service -n staging --set image.tag=v1.2.4-dev
helm template order-service ./charts/order-service # 仅渲染,不安装
helm history order-service -n production # Release 历史
```
---
## 关联笔记
- [[01-容器化]] — Docker 镜像构建是 CI/CD 的第一步
- [[02-Kubernetes]] — K8s 是部署的目标平台
- [[04-SRE实践]] — 错误预算影响发布策略
- [[05-监控告警]] — Prometheus + Alertmanager 为 Canary 提供指标支撑