GitOps 环境搭建最终部署方案
1. 方案概述
仓库地址:https://github.com/hua-ri/gitops-environment-setup
本方案用于统一管理多环境下的基础组件部署,基于以下技术栈实现:
GitLab:作为 GitOps 配置仓库Helm:用于渲染 bootstrap chart 和各业务 Helm ChartArgo CD:作为 GitOps 控制面,持续拉取并同步配置ApplicationSet:根据环境与应用清单动态生成Applicationkind:用于本地快速验证完整部署链路
方案核心目标:
- 用统一结构管理多个环境的部署配置
- 让不同环境的应用开关、版本、参数彼此独立
- 让所有配置变更可追踪、可审计、可回滚
- 保持结构简单,便于团队理解和长期维护
当前最终方案采用的是:按环境拆分应用清单。
核心设计如下:
deploy/<env>.yaml:定义 bootstrap chart 在某个环境下如何部署apps/<env>/:定义某个环境要部署哪些应用,以及应用元数据environments/<env>.yaml:定义环境公共信息,例如目标集群、values 仓库、values 目录values/<env>/:定义各应用 Helm Chart 自身参数chart/:只保留 Helm Chart 本体,不承载正式环境部署配置
2. 组件清单
当前仓库已纳管的核心组件包括:
ingress-nginxArgo WorkflowsArgo EventsArgo RolloutsArgo CD Image UpdaterHarborGitLab
不同环境下,这些组件的启用状态、版本和参数可以分别控制。
例如:
kind环境默认关闭GitLabprod环境默认保留全部示例组件
3. 最终目录结构
.├── chart/├── deploy/│ ├── kind.yaml│ └── prod.yaml├── apps/│ ├── kind/│ └── prod/├── environments/│ ├── kind.yaml│ └── prod.yaml├── values/│ ├── kind/│ └── prod/├── kind-config.yaml└── README.md3.1 chart/
chart/ 是 bootstrap Helm Chart,只负责生成:
AppProjectApplicationSet
这里的 chart/values.yaml 仅作为 Chart 默认值与字段结构定义使用,不作为正式部署入口。
3.2 deploy/
deploy/ 是正式部署入口。
例如:
deploy/kind.yamldeploy/prod.yaml
这里定义 bootstrap chart 的环境级参数,例如:
generatorRepo.urlgeneratorRepo.revisionproject.nameappSet.nameenvironment.fileappSet.appsFile
实际部署时,应该显式指定:
helm template gitops-bootstrap chart -f deploy/kind.yaml3.3 apps/<env>/
apps/<env>/ 用于定义某个环境下的应用清单和应用元数据。
这里主要管理:
enabledversionsyncWavedestinationNamespacerepoURLchart
示例:
name: gitlabenabled: "false"repoURL: https://charts.gitlab.iochart: gitlabversion: 8.8.1destinationNamespace: gitlabsyncWave: "4"这意味着:
- 在
kind环境中,gitlab默认不部署 - 如果需要启用,直接把
enabled改成"true"
3.4 environments/<env>.yaml
环境文件定义公共环境信息。
示例:
env: kindvaluesRepoURL: https://github.com/hua-ri/gitops-environment-setup.gitvaluesRevision: mainvaluesDir: kindclusterServer: https://kubernetes.default.svc字段含义:
env:环境名,用于生成Application名称valuesRepoURL:values 所在 Git 仓库地址valuesRevision:values 仓库分支或标签valuesDir:values 子目录,例如kind或prodclusterServer:Argo CD 目标集群地址
3.5 values/<env>/
values/<env>/<app>-values.yaml 用于保存子 chart 自身参数。
这里通常放:
- 副本数
- ingress
- TLS
- 资源限制
- Helm Chart 业务参数
示例:
expose: type: ingress tls: enabled: false这里不放:
enabledversionsyncWave
这些字段属于应用元数据,应该维护在 apps/<env>/ 中。
3.6 kind-config.yaml
用于创建本地 kind 集群,是本地验证完整 GitOps 链路的入口配置文件。
4. 工作原理
整个方案分为两个阶段。
4.1 第一阶段:渲染 bootstrap chart
执行:
helm template gitops-bootstrap chart -f deploy/kind.yaml | kubectl apply -f -这一阶段只会创建:
AppProjectApplicationSet
此时还没有直接把 Harbor、Ingress Nginx、Argo Workflows 等业务组件展开成 Kubernetes manifests。
4.2 第二阶段:ApplicationSet 生成 Application
当 ApplicationSet 创建成功后,ApplicationSet Controller 会继续执行:
- 读取
environment.file - 读取
appSet.appsFile - 过滤
enabled == true的应用 - 根据环境上下文和应用清单生成最终的
Application - 每个
Application再去拉取:- Helm Chart Source
- Values Git Source
- 最终由 Argo CD 完成 Helm 渲染和同步
4.3 整体架构图
4.4 方案特点
这套方案的优势在于:
- 环境差异直接落在
apps/<env>/和values/<env>/ deploy/作为正式部署入口,职责明确chart/只保留 Chart 本体,不混入正式环境配置- 不需要额外 merge 层,维护成本低
- 心智模型简单,排障路径清晰
可以概括为:
- 想改应用开关、版本:改
apps/<env>/ - 想改应用参数:改
values/<env>/ - 想改目标集群:改
environments/<env>.yaml - 想改 bootstrap 入口:改
deploy/<env>.yaml
5. 端到端部署实战
下面以当前 Github 仓库为基准,说明完整部署流程。
5.1 从 Github clone 仓库
当前仓库托管于 Github,操作前需要先 clone:
git clone https://github.com/hua-ri/gitops-environment-setup.gitcd gitops-environment-setup如果仓库是私有仓库,需要使用有效的账号、Token 或 SSH 凭据。
5.2 确认正式部署入口
当前正式部署入口为:
deploy/kind.yamldeploy/prod.yaml
其中:
deploy/kind.yaml用于本地或测试环境deploy/prod.yaml用于生产示例环境
5.3 创建本地 kind 集群
本地验证时,可直接使用顶层 kind-config.yaml:
kind create cluster --config ./kind-config.yaml如果需要指定名称或节点镜像,可使用:
sudo kind create cluster --config=kind-config.yaml --name huari-test --image kindest/node:v1.34.0 --retain切换 kubectl 上下文:
sudo kubectl cluster-info --context kind-huari-test查看集群:
kubectl get nodeskubectl get pods -A -owide删除集群:
kind delete cluster --name huari-test5.4 安装 Argo CD
helm repo add argo https://argoproj.github.io/argo-helmhelm repo updatehelm upgrade --install argocd argo/argo-cd \ --version 7.3.5 \ --namespace argo \ --create-namespace访问 UI:
kubectl port-forward svc/argocd-server -n argo 8080:443 --address 0.0.0.0获取初始管理员密码:
kubectl -n argo get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo5.5 配置 GitLab 仓库凭据
如果 GitLab 仓库是私有的,必须先在 Argo CD 中注册仓库凭据,否则 ApplicationSet 和 Application 在拉取 Git 内容时会失败。
示例:
apiVersion: v1kind: Secretmetadata: name: repo-gitlab-values namespace: argo labels: argocd.argoproj.io/secret-type: repositorystringData: type: git url: https://github.com/hua-ri/gitops-environment-setup.git username: <gitlab-username-or-token-name> password: <gitlab-token-with-read_repository>应用:
kubectl apply -f repo-gitlab-values.yaml注意:
- YAML 第一行必须是
apiVersion - 不要把真实 Token 提交到 Git 仓库
- 如果 Token 已经暴露,应立即在 GitLab 侧撤销并重新生成
5.6 替换仓库地址并推送到 GitLab
正式部署前,需要确认以下文件中的仓库地址已经替换为真实 GitLab 地址:
deploy/kind.yamldeploy/prod.yamlenvironments/kind.yamlenvironments/prod.yaml
修改后必须提交并推送:
git add deploy/*.yaml environments/*.yamlgit commit -m "fix: update gitlab repo url"git push origin main关键原则:
- Argo CD 最终读取的是 GitLab 远端仓库内容
- 不是你本地 clone 工作区里未提交的文件
5.7 部署 kind 环境
helm template gitops-bootstrap chart \ -f deploy/kind.yaml | kubectl apply -f -5.8 验证 kind 环境
先检查 GitOps 控制面:
kubectl get appprojects -n argokubectl get applicationsets -n argokubectl get applications -n argo再检查关键业务命名空间:
kubectl get pods -n argokubectl get pods -n ingress-nginxkubectl get pods -n harbor说明:
kind默认关闭gitlab- 因此本地验证时看不到
gitlab相关资源是正常的
5.9 部署 prod 示例
helm template gitops-bootstrap chart \ -f deploy/prod.yaml | kubectl apply -f -本质上这里切换的是:
environment.file=environments/prod.yamlappSet.appsFile=apps/prod/*.yaml
6. 当前默认策略
6.1 kind
- 使用
deploy/kind.yaml - 使用
apps/kind/*.yaml - 使用
values/kind/ - 默认关闭
gitlab
6.2 prod
- 使用
deploy/prod.yaml - 使用
apps/prod/*.yaml - 使用
values/prod/ - 默认保留示例应用开启
6.3 kind 与 prod 差异一览
| 项目 | kind | prod |
|---|---|---|
| 部署入口 | deploy/kind.yaml | deploy/prod.yaml |
| 环境文件 | environments/kind.yaml | environments/prod.yaml |
| 应用目录 | apps/kind/ | apps/prod/ |
| values 目录 | values/kind/ | values/prod/ |
| GitLab 默认状态 | false | true |
7. 日常维护
7.1 新增应用
通常需要新增 4 个文件:
apps/kind/<app>.yamlapps/prod/<app>.yamlvalues/kind/<app>-values.yamlvalues/prod/<app>-values.yaml
如果某个环境不需要该应用,可以:
- 不创建该环境下的 app 文件,或
- 创建后将
enabled设为"false"
7.2 修改版本
直接修改对应环境的 app 文件,例如:
apps/kind/harbor.yamlapps/prod/harbor.yaml
7.3 开关应用
直接修改对应环境 app 文件里的 enabled。
7.4 调整应用参数
直接修改对应环境的 values 文件,例如:
values/kind/harbor-values.yamlvalues/prod/harbor-values.yaml
7.5 新增环境
新增环境时,通常需要补齐 4 类文件:
deploy/<env>.yamlenvironments/<env>.yamlapps/<env>/*.yamlvalues/<env>/*-values.yaml
8. 常见排查方法
8.1 查看 Argo CD 资源
kubectl get applications -n argokubectl get appprojects -n argokubectl get applicationsets -n argo8.2 查看 Argo CD 组件状态
kubectl get pods -n argokubectl get svc -n argo8.3 查看目标命名空间资源
kubectl get pods -n ingress-nginxkubectl get pods -n harborkubectl get pods -n gitlab8.4 查看应用详情与事件
kubectl describe application kind-harbor -n argokubectl describe application prod-harbor -n argo8.5 查看控制器日志
kubectl logs -n argo deploy/argocd-application-controllerkubectl logs -n argo deploy/argocd-serverkubectl logs -n argo deploy/argocd-applicationset-controller8.6 判断配置修改是否真的生效
这是最容易踩坑的一点。
建议分别从三层判断:
检查本地 Helm 渲染结果:
helm template gitops-bootstrap chart -f deploy/kind.yaml | grep -n 'gitlab.papegames.com'检查集群对象:
kubectl get applicationsets,applications -n argo -o yaml | grep -n 'gitlab.papegames.com'检查 GitLab 远端 main 分支:
git fetch origingit show origin/main:deploy/kind.yaml | grep urlgit show origin/main:environments/kind.yaml | grep valuesRepoURL判断逻辑:
- 本地 Helm 输出正确,但集群对象还是旧值:说明旧对象未刷新
- 集群对象正确,但 Argo 仍报旧地址:需要检查是否仍有旧
Application - 本地工作区正确,但
origin/main还是旧值:说明还没有 push 到远端
9. 多集群说明
- 目标集群由
environments/<env>.yaml中的clusterServer决定 https://kubernetes.default.svc表示 Argo CD 所在集群- 如果需要发往其它集群:
- 先在 Argo CD 中注册目标集群
- 修改
environments/<env>.yaml中的clusterServer - 确保
project.destinations放行该目标集群
10. 总结
当前最终方案可以概括为三句话:
deploy/决定 bootstrap 如何渲染apps/<env>/决定某个环境部署什么、版本是多少、是否启用values/<env>/决定某个环境里的应用怎么配
这套方案优先追求:
- 容易落地
- 容易排查
- 容易维护
- 适合团队长期协作与扩展
对于当前仓库来说,这已经是一套清晰、稳定、适合持续演进的最终部署方案。
部分信息可能已经过时









