这是一个按环境拆分应用清单的 GitOps 仓库。
如果你是第一次接手这个仓库,建议先用 kind 跑通一遍完整流程,确认 Argo CD、ApplicationSet、应用渲染都正常,再去看目录结构和维护方式。
# 创建集群命令
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
# 查看集群节点
sudo kubectl get nodes
# 查看集群全部的pod
sudo kubectl get pods -A -owide
# 删除集群
sudo kind delete cluster --name huari-test# 更新helm repo
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
# 部署argocd
helm 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如果代码仓库或 values 仓库是私有仓库,需要先在 Argo CD 配置仓库 Secret。
示例:
apiVersion: v1
kind: Secret
metadata:
name: repo-gitlab-values
namespace: argo
labels:
argocd.argoproj.io/secret-type: repository
stringData:
type: git
url: https://gitlab.com/<group>/<repo>.git
username: <gitlab-username-or-token-name>
password: <gitlab-token-with-read_repository>kubectl apply -f repo-gitlab-values.yaml请至少替换以下文件中的占位符仓库地址:
deploy/kind.yamldeploy/prod.yamlenvironments/kind.yamlenvironments/prod.yaml
然后将变更推送到 Git 仓库!!!
helm template gitops-bootstrap chart \
-f deploy/kind.yaml | kubectl apply -f -先看 Argo CD 是否已经生成应用:
kubectl get applications -n argo
kubectl get applicationsets -n argo
kubectl get appprojects -n argo再看关键命名空间资源:
kubectl get pods -n argo
kubectl get pods -n ingress-nginx
kubectl get pods -n harbor说明:
kind默认关闭了gitlab,所以本地验证时看不到gitlab相关资源是正常的- 默认情况下会先验证整套 GitOps 链路是否打通,而不是追求一次性把所有重型组件都跑起来
当 kind 跑通以后,再看 prod 示例会更容易理解:
helm template gitops-bootstrap chart \
-f deploy/prod.yaml | kubectl apply -f -kind create cluster --config ./kind-config.yamlhelm template gitops-bootstrap chart \
-f deploy/kind.yaml | kubectl apply -f -helm template gitops-bootstrap chart \
-f deploy/prod.yaml | kubectl apply -f -kubectl get applications -n argo.
├── chart/
├── deploy/
│ ├── kind.yaml
│ └── prod.yaml
├── apps/
│ ├── kind/
│ └── prod/
├── environments/
│ ├── kind.yaml
│ └── prod.yaml
├── values/
│ ├── kind/
│ └── prod/
├── kind-config.yaml
└── README.md
deploy/ 是正式部署入口。
这里存放的是 bootstrap chart 的环境级部署配置,例如:
project.nameappSet.nameenvironment.fileappSet.appsFilegeneratorRepo
也就是说,真正执行部署时,优先使用:
deploy/kind.yamldeploy/prod.yaml
而不是直接把正式部署配置放进 chart/ 目录里。
控制这个环境下:
- 部署哪些应用
enabledversionsyncWavedestinationNamespace- chart 来源
示例:apps/kind/gitlab.yaml
name: gitlab
enabled: "false"
repoURL: https://charts.gitlab.io
chart: gitlab
version: 8.8.1
destinationNamespace: gitlab
syncWave: "4"控制应用自身参数,也就是子 chart 的 values。
示例:values/kind/harbor-values.yaml
expose:
type: ingress
tls:
enabled: false控制环境公共信息。
示例:environments/kind.yaml
env: kind
valuesRepoURL: https://github.com/hua-ri/gitops-environment-setup.git
valuesRevision: main
valuesDir: kind
clusterServer: https://kubernetes.default.svcchart/ 只保留 Helm Chart 本身:
Chart.yamlvalues.yamltemplates/
这里的 chart/values.yaml 是 chart 默认值,不是正式环境部署入口。
执行:
helm template gitops-bootstrap chart -f deploy/kind.yaml会生成:
AppProjectApplicationSet
ApplicationSet 会:
- 读取
environment.file - 读取
appSet.appsFile - 过滤
enabled == true的应用 - 生成最终的
Application - 加载
values/<env>/<app>-values.yaml
deploy/kind.yaml指向:environment.file=environments/kind.yamlappSet.appsFile=apps/kind/*.yaml
deploy/prod.yaml指向:environment.file=environments/prod.yamlappSet.appsFile=apps/prod/*.yaml
| 项目 | kind | prod |
|---|---|---|
| 部署入口 | deploy/kind.yaml |
deploy/prod.yaml |
| 环境文件 | environments/kind.yaml |
environments/prod.yaml |
| 应用目录 | apps/kind/ |
apps/prod/ |
| Harbor values 文件 | values/kind/harbor-values.yaml |
values/prod/harbor-values.yaml |
| GitLab 默认状态 | false |
true |
通常要新增 4 个文件:
apps/kind/<app>.yamlapps/prod/<app>.yamlvalues/kind/<app>-values.yamlvalues/prod/<app>-values.yaml
直接改对应环境的 app 文件:
apps/kind/harbor.yamlapps/prod/harbor.yaml
直接改对应环境 app 文件里的 enabled。
直接改对应环境的 values 文件:
values/kind/<app>-values.yamlvalues/prod/<app>-values.yaml
新增环境时补齐这 4 类文件:
deploy/<env>.yamlenvironments/<env>.yamlapps/<env>/*.yamlvalues/<env>/*-values.yaml
kubectl get applications -n argo
kubectl get appprojects -n argo
kubectl get applicationsets -n argokubectl get pods -n argo
kubectl get svc -n argokubectl get pods -n ingress-nginx
kubectl get pods -n harbor
kubectl get pods -n gitlabkubectl describe application kind-harbor -n argo
kubectl describe application prod-harbor -n argokubectl logs -n argo deploy/argocd-application-controller
kubectl logs -n argo deploy/argocd-server- 目标集群由
environments/<env>.yaml的clusterServer决定 https://kubernetes.default.svc表示 Argo CD 所在集群- 如果要发到其它集群:
- 在 Argo CD 注册目标集群
- 修改
environments/<env>.yaml的clusterServer - 确保
project.destinations放行该集群