Skip to content

26 | GitOps 发布实践

从发布命令到期望状态 ​

中级篇由操作人执行 kubectl apply。本课让集群内的 Argo CD 持续读取配置仓库,由 Git 中审核后的清单表达期望状态。前置条件是第 21 篇的 Kustomize 文件、环境 Secret,以及第 25 篇已经通过验证的镜像。

OpenGitOps 的四项原则是声明式、版本化且不可变、自动拉取、持续调和。将 YAML 存 Git 后由 CI 经 SSH 执行一次 Compose,是版本化的 Push CD;如果缺少自动拉取和持续调和,不能仅凭“配置在 Git”就称为完整 GitOps。

明确三类权限 ​

身份所需能力本课程边界
应用 CI构建、测试、推送镜像不持有集群管理凭据
配置修改者创建配置 PR生产分支必须评审,镜像验证后才允许合并
Argo CD读取配置仓库、调和授权目标集群管理员限制可部署仓库、namespace 与资源类型

Git 历史记录期望状态的变更,不等于完整运行审计;仍要保留控制器操作记录、集群审计和部署结果。Secret 沿用第 20 篇的预置方式,不提交明文。

准备配置仓库与控制器 ​

将第 21 篇 k8s 目录放进练习配置仓库,确认 prod overlay 已替换为真实 digest。仓库不得包含账号密码。私有仓库给 Argo CD 配只读凭据,不借用 CI 写权限。

按 Argo CD Getting Started安装控制器。下载团队选定发布版本的安装清单、审核后执行;不要把浮动 stable URL 当作长期版本锁。安装后确认 CRD 和控制器就绪,再应用下一段 Application。

bash
kubectl -n argocd get deployments
kubectl get crd applications.argoproj.io
kubectl -n argocd rollout status deployment/argocd-server --timeout=180s

这里使用独立实验集群和默认 project 简化学习;生产必须建立受限 AppProject,并限制 Argo CD 本身的集群权限。

创建 Application ​

保存 argocd-application.yaml,替换 repoURL 为真实配置仓库 URL:

yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: delivery-demo-prod
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/OWNER/delivery-config.git
    targetRevision: main
    path: k8s/overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: prod
  syncPolicy:
    automated:
      prune: false
      selfHeal: true
bash
kubectl apply -f argocd-application.yaml
kubectl -n argocd get application delivery-demo-prod -w

看到 Synced 和 Healthy 后,再检查实际首页与 digest。自动同步不是自动判定业务正确。prune: false 用于首次实验避免自动删除资源;生产是否开启 prune,需明确资源归属、删除审批与恢复策略。

main 持续跟踪新配置,合并 PR 就可能触发部署。只有在 合并之前 完成审批和制品验证,才能把它当作发布准入;合并后的 GitHub Environment 审批无法阻止已经发生的调和。

漂移与回退实验 ​

在专用实验环境手动将副本改为 1:

bash
kubectl -n prod scale deployment delivery-demo --replicas=1
kubectl -n prod get deployment delivery-demo -w

等待调和后,应恢复为 Git 声明的 2。检查 Application 状态和事件,不把“控制器在运行”当作漂移实验通过。

升级时通过 PR 修改 prod overlay 的 digest,验证后合并。回退时建立反向 PR,恢复上一已验证的 digest,再检查 Argo CD 同步和首页。不要只执行 kubectl rollout undo,否则 selfHeal 会再次恢复 Git 中的新版本。

最小验收与故障边界 ​

  • 配置 PR、镜像验证记录、合并 commit、集群实际 digest 可关联。
  • 手动漂移被修复;Git 回退后旧版恢复。
  • 无效清单应显示同步错误;错误镜像可能已同步但不 Healthy,两者需分别检查。
  • 数据库、外部文件和凭据不会因 Git 回退自动恢复。
  • 紧急手动修复时,先按应急流程暂停相应自动同步,再补齐 Git 状态并恢复调和,不能长期让两个来源竞争。

参考:OpenGitOps、Argo CD 自动同步。