用途
本技能用于在 Kubernetes 上实现声明式持续交付(GitOps),通过 ArgoCD 将 Git 仓库中的清单作为期望状态,自动同步到集群。适用于以下场景:
- 为 Kubernetes 实现 GitOps 工作流
- 从 Git 仓库自动化部署
- 以声明式方式管理多个环境
- 实现渐进式交付策略
- 使集群状态与 Git 保持同步
前置条件
- 已安装 ArgoCD 的 Kubernetes 集群
- 已配置 kubectl
- 用于存放清单的 Git 仓库
- ArgoCD CLI(可选)
安装
# 创建命名空间
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
# 端口转发以访问 UI
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 使用 CLI 登录
argocd login localhost:8080
主要能力
Application 定义
支持三种来源类型:
- 基础 Application:直接引用 Git 仓库中的清单路径,配置目标集群与命名空间,并设置自动同步策略(prune、selfHeal、CreateNamespace)。
- Helm Application:在 source 中指定 helm 字段,可引用多个 valueFiles 并通过 parameters 覆盖副本数、镜像标签等。
- Kustomize Application:在 source 中指定 kustomize 字段,可通过 images 覆盖镜像。
Projects(AppProject)
用于隔离应用,可限制 sourceRepos、destinations、clusterResourceWhitelist、namespaceResourceWhitelist,并定义基于角色的访问策略(roles),支持按组授权。
ApplicationSets
用于批量生成 Application,支持多种生成器:
- Git 生成器:根据仓库目录结构生成,如 environments/*。
- List 生成器:根据列表元素(集群、环境等)生成。
- Matrix 生成器:组合多个生成器,如 Git 目录 × 环境列表。
同步策略
- 自动同步:可配置 prune(删除 Git 中不存在的资源)、selfHeal(回滚手动更改)、allowEmpty、syncOptions(如 CreateNamespace、PrunePropagationPolicy、PruneLast)以及重试策略(limit、backoff)。
- Sync Waves:通过注解 argocd.argoproj.io/sync-wave 控制资源同步顺序。
- Sync Hooks:通过注解 argocd.argoproj.io/hook 定义 PreSync 等钩子,并可设置 hook-delete-policy。
CLI 命令
常用命令包括:app list、app get、app sync(支持 --force)、app diff、app rollback、app delete、app logs、app get --hard-refresh。
仓库配置
通过 Secret 配置私有仓库,支持用户名密码或 SSH 私钥,需打上标签 argocd.argoproj.io/secret-type: repository。
通知
通过 ConfigMap argocd-notifications-cm 配置 Slack 等服务、消息模板和触发器。
使用方式
- 安装 ArgoCD 并获取管理员密码。
- 准备 Git 仓库存放 Kubernetes 清单(原生、Helm 或 Kustomize)。
- 创建 Application 或 ApplicationSet 资源,指定 source、destination 和 syncPolicy。
- 通过 UI 或 CLI 查看、同步、回滚应用。
- 按需配置项目隔离、通知和私有仓库凭据。
适用场景
- 多环境(staging、production)的声明式部署管理
- 需要从 Git 自动同步集群状态的团队
- 使用 Helm 或 Kustomize 管理清单的项目
- 需要按顺序部署(sync waves)或执行迁移钩子(sync hooks)的场景
- 需要 RBAC 隔离和部署通知的团队
限制与常见问题
- 同步因差异失败:资源显示差异但实际正确时,可通过 ignoreDifferences 忽略特定字段(如 /spec/replicas)。
- 仓库不可访问:检查仓库 Secret,验证 URL 和凭据。
- 应用卡在 OutOfSync:检查资源状态、事件和清单。
- 健康检查失败:检查自定义健康检查与探针配置。
最佳实践
- 使用 ApplicationSets 进行多环境部署
- 使用 sync waves 实现有序部署
- 使用 projects 隔离应用
- 为部署事件配置通知
- 通过 projects 实现适当的 RBAC
- 使用健康检查验证部署
- 启用自动修剪以删除已删除的资源
- 将清单保存在专用仓库中
相关技能
- kubernetes-ops:K8s 基础
- helm-charts:Helm 部署
- kustomize:Kustomize 覆盖