GitOps工作流 gitops-workflow

GitOps 工作流是一种基于 Git 的声明式持续交付方法,使用 ArgoCD 和 Flux 自动化 Kubernetes 部署,适用于实施 DevOps 实践、自动化应用部署和管理云原生基础设施。关键词:GitOps, Kubernetes, ArgoCD, Flux, 自动化部署, 声明式管理, DevOps, 云原生, 持续交付

DevOps 0 次安装 0 次浏览 更新于 3/8/2026

名称: gitops-workflow 描述: 使用 ArgoCD 和 Flux 实施 GitOps 工作流,实现自动化、声明式的 Kubernetes 部署,并持续进行调和。适用于实施 GitOps 实践、自动化 Kubernetes 部署或设置声明式基础设施管理。

GitOps 工作流

🤖 智能体与 MCP 增强 (Agent & MCP Enhancements)

本 Skill 支持并推荐配合特定的智能体角色和 MCP 工具使用,以获得最佳效果。

推荐智能体角色

  • DevOps 工程师: 详见 AGENTS.md
    • 该角色专注于 IaC (基础设施即代码) 和自动化流水线。
    • 启用后,AI 将严格遵循声明式 API 原则,避免命令式操作。

推荐 MCP 工具

  • Kubectl MCP: 允许 AI 直接监控集群状态和调试 Pod。
  • Git/GitHub MCP: 用于管理 GitOps 仓库的配置变更和 PR 流程。
  • mcp-feedback-enhanced: 在配置自动同步策略 (Auto-Sync) 或处理敏感信息 (Secrets) 时,使用 ask_followup_question 确认用户的安全偏好和操作边界。

使用 ArgoCD 和 Flux 实施 GitOps 工作流的完整指南,实现自动化 Kubernetes 部署。

目的

使用 ArgoCD 或 Flux CD,遵循 OpenGitOps 原则,实施基于 Git 的声明式持续交付,用于 Kubernetes。

何时使用此技能

  • 为 Kubernetes 集群设置 GitOps
  • 从 Git 自动化应用部署
  • 实施渐进式交付策略
  • 管理多集群部署
  • 配置自动同步策略
  • 在 GitOps 中设置密钥管理

OpenGitOps 原则

  1. 声明式 - 整个系统以声明方式描述
  2. 版本化且不可变 - 期望状态存储在 Git 中
  3. 自动拉取 - 软件代理拉取期望状态
  4. 持续调和 - 代理调和实际状态与期望状态

ArgoCD 设置

1. 安装

# 创建命名空间
kubectl create namespace argocd

# 安装 ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# 获取管理员密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

参考: 详见 references/argocd-setup.md 获取详细设置

2. 仓库结构

gitops-repo/
├── apps/
│   ├── production/
│   │   ├── app1/
│   │   │   ├── kustomization.yaml
│   │   │   └── deployment.yaml
│   │   └── app2/
│   └── staging/
├── infrastructure/
│   ├── ingress-nginx/
│   ├── cert-manager/
│   └── monitoring/
└── argocd/
    ├── applications/
    └── projects/

3. 创建应用

# argocd/applications/my-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/org/gitops-repo
    targetRevision: main
    path: apps/production/my-app
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

4. 应用的应用模式

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: applications
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/org/gitops-repo
    targetRevision: main
    path: argocd/applications
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated: {}

Flux CD 设置

1. 安装

# 安装 Flux CLI
curl -s https://fluxcd.io/install.sh | sudo bash

# 引导 Flux
flux bootstrap github \
  --owner=org \
  --repository=gitops-repo \
  --branch=main \
  --path=clusters/production \
  --personal

2. 创建 GitRepository

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/org/my-app
  ref:
    branch: main

3. 创建 Kustomization

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 5m
  path: ./deploy
  prune: true
  sourceRef:
    kind: GitRepository
    name: my-app

同步策略

自动同步配置

ArgoCD:

syncPolicy:
  automated:
    prune: true # 删除不在 Git 中的资源
    selfHeal: true # 调和手动更改
    allowEmpty: false
  retry:
    limit: 5
    backoff:
      duration: 5s
      factor: 2
      maxDuration: 3m

Flux:

spec:
  interval: 1m
  prune: true
  wait: true
  timeout: 5m

参考: 详见 references/sync-policies.md

渐进式交付

使用 ArgoCD Rollouts 进行金丝雀部署

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: my-app
spec:
  replicas: 5
  strategy:
    canary:
      steps:
        - setWeight: 20
        - pause: { duration: 1m }
        - setWeight: 50
        - pause: { duration: 2m }
        - setWeight: 100

蓝绿部署

strategy:
  blueGreen:
    activeService: my-app
    previewService: my-app-preview
    autoPromotionEnabled: false

密钥管理

外部密钥操作符

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: SecretStore
  target:
    name: db-credentials
  data:
    - secretKey: password
      remoteRef:
        key: prod/db/password

密封密钥

# 加密密钥
kubeseal --format yaml < secret.yaml > sealed-secret.yaml

# 将 sealed-secret.yaml 提交到 Git

最佳实践

  1. 使用独立的仓库或分支 用于不同环境
  2. 实施 RBAC 用于 Git 仓库
  3. 启用通知 用于同步失败
  4. 使用健康检查 用于自定义资源
  5. 实施审批门 用于生产环境
  6. 避免在 Git 中存储密钥 (使用外部密钥)
  7. 使用应用的应用模式 用于组织
  8. 标记发布 以便轻松回滚
  9. 监控同步状态 并设置警报
  10. 先在暂存环境测试更改

故障排除

同步失败:

argocd app get my-app
argocd app sync my-app --prune

不同步状态:

argocd app diff my-app
argocd app sync my-app --force

相关技能

  • k8s-manifest-generator - 用于创建清单
  • helm-chart-scaffolding - 用于打包应用