软件说明:

说明文档:

==注意:如下是Dev环境的说明==
首先我使用了argocd官方推荐的App in Apps 的管理方式(下面有些套娃)
首先我用一个yaml声明文件维护了一个父App,这个父App的作用是声明Git仓库中的一个App环境(Helm)这个Helm里编写的创建一堆ArgoApp,而这些App是通过GIt仓库中另一个目录里编写的Kustomize生成的(是不是很绕,没错,是挺绕的,多读几遍)
声明式文件如下:
父APP:

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Application
  3. metadata:
  4. name: dev-nicee-as1-test
  5. namespace: argocd
  6. spec:
  7. project: ap-southeast-1-eks-test
  8. source:
  9. repoURL: https://git.xxx.xxx/devops/argocd-gitops.git
  10. targetRevision: master
  11. # 这里是Helm仓库的地址,存的是一个业务所有的argocd app 声明文件
  12. path: apps/eks-test/dev/dev-server
  13. destination:
  14. server: https://kubernetes.default.svc
  15. namespace: argocd
  16. # Sync policy
  17. syncPolicy:
  18. automated:
  19. prune: true
  20. selfHeal: true
  21. allowEmpty: false
  22. syncOptions:
  23. - Validate=false
  24. - CreateNamespace=true
  25. retry:
  26. limit: 5
  27. backoff:
  28. duration: 5s
  29. factor: 2
  30. maxDuration: 3m

子App:

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Application
  3. metadata:
  4. name: dev-server-api
  5. namespace: argocd
  6. spec:
  7. project: ap-southeast-1-eks-test
  8. source:
  9. repoURL: http://git.xxx.xxx/devops/argocd-gitops.git
  10. targetRevision: master
  11. # 这里存的是真正业务的Yaml文件我是使用Kustomize 去编写的
  12. path: eks-test/server/overlays/dev/server-1
  13. destination:
  14. server: {{ .Values.spec.destination.server }}
  15. namespace: dev-nicee
  16. # Sync policy
  17. syncPolicy: automated:
  18. prune: true selfHeal: true
  19. allowEmpty: false
  20. syncOptions:
  21. - Validate=false
  22. - CreateNamespace=true
  23. retry:
  24. limit: 5
  25. backoff:
  26. duration: 5s
  27. factor: 2
  28. maxDuration: 3m

当我们创建成功之后就会看到如下的逻辑,首先我们生成了一个父App,父App会自动创建所有的子App

使用Argocd在EKS中多集群、多环境的Gitops实践 - 图1

之后在我们定义的namespace中我们看到了另一个Namespace中就创建了一堆子App,因为是Dev环境,所以我们是自动同步的,这样就在瞬间会拉起所有的Dev环境
使用Argocd在EKS中多集群、多环境的Gitops实践 - 图2

这样我们就使用Gitops的方式维护了整套的Dev环境,当然既然是Dev环境我们肯定会有这种需求,晚上下班后关闭集群这样就可以使用一个脚本+计划任务的方式设置自动关闭,手动就使用Jenkins 操作脚本给研发提供一个页面的方式让研发可以在紧急的时候拉起Dev环境,脚本如下

  1. import os
  2. import subprocess
  3. import json
  4. def exec_shell(cmd):
  5. sub2 = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  6. stdout, stderr = sub2.communicate()
  7. ret = sub2.returncode
  8. return ret, stdout.decode('utf-8').strip()
  9. def remove_apps(apps_name):
  10. ret = exec_shell("kubectl get app %s -n argocd -o json" % apps_name)[1]
  11. app_dict = json.loads(ret)["status"]["resources"]
  12. for app_name in app_dict:
  13. app_name = app_name["name"].encode('utf-8')
  14. exec_shell("kubectl patch app %s -n argocd -p '{\"metadata\": {\"finalizers\": [\"resources-finalizer.argocd.argoproj.io\"]}}' --type merge" % app_name)
  15. exec_shell("kubectl patch app %s -n argocd -p '{\"metadata\": {\"finalizers\": [\"resources-finalizer.argocd.argoproj.io\"]}}' --type merge" % apps_name)
  16. exec_shell("kubectl delete app %s -n argocd" % apps_name)
  17. if __name__ == '__main__':
  18. remove_apps("dev-xxx-as1-test")

在多说一嘴如果你跟我一样是在AWS上使用的EKS集群,那么Dev与Test环境完全可以跑在Spot实例上,很便宜

使用Argocd在EKS中多集群、多环境的Gitops实践 - 图3