我以前写过关于此类主题的文章,但这次略有不同,因为应用程序库不再有CI/CD相关的配置文件。它们都存储在自己的专用仓库里。之所以这样分离,是因为我们想实现正确的GitOps实践。简而言之,应用程序和配置仓库都是相互分离的。
目前的设置
我们有四个Kubernetes集群,分别是argocd 、dev 、sbox 、prod 。ArgoCD在argocd 集群上运行,并部署到其他三个集群。
部署策略
-
dev- 当一个PR被合并到 分支时,总是自动进行部署。master -
sbox- 当一个新的 "标签 "发布时,总是自动部署。 -
prod- 永远不要自动部署!
设置
准备好GitHub
我假设你已经有一个名为pacman 的应用程序仓库。
-
创建名为
GITHUB_ACTIONS的Docker访问令牌,具有读、写和删除的权限。结果。8d8937fe-753b-4f2b-96bc-b3603e4ed2b0 -
使用 "repo "作用域创建名为
ARGOCD的PAT。结果。ghp_fhjkiuUYuy456frreSgrtry2 -
使用 "repo "作用域创建名为
GITHUB_ACTIONS的PAT。结果。ghp_re543tgtu7hgaTHhyh6757 -
使用
ghp_re543tgtu7hgaTHhyh6757创建名为ACTIONS_TOKEN的 pacman 存储库秘密。 -
使用
8d8937fe-753b-4f2b-96bc-b3603e4ed2b0创建名为DOCKERHUB_TOKEN的 pacman 仓库秘密。 -
使用你的Docker用户名创建名为
DOCKERHUB_USER的pacman仓库秘密。
准备好Kubernetes
$ minikube start -p argocd --vm-driver=virtualbox --memory=2000
$ kubectl config get-contexts
准备ArgoCD
在终端安装ArgoCD
$ kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.2.4/manifests/install.yaml
获得密码
$ kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
登录到用户界面
$ kubectl port-forward svc/argd-server 8443:443
登录CLI
$ argocd --insecure login 127.0.0.1:8443
添加集群
$ argocd cluster add dev
添加资源库
这是可选的。你可以使用 "默认"。
$ argocd repo add https://github.com/you/config \
创建项目
这是可选的。你可以使用 "默认"。
$ argocd proj create --file ~/local/file/system/config/infra/argocd/project.yaml
创建应用程序
你可以使用ApplicationSet来代替。
$ argocd app create --file ~/local/file/system/config/infra/argocd/pacman/dev.yaml
应用程序库
├── .github
文件
.dockerignore
.dockerignore
main.go
package main
main_test.go
package main
Docker文件
FROM golang:1.17.5-alpine3.15 as build
pull_request.yaml
# Trigger the workflow only when:
merge.yaml
这将向配置库推送一个提交,以强制触发dev 部署。
# Trigger the workflow only when:
release.yaml
这将推送一个提交到配置仓库,强制触发sbox 部署。
# Trigger the workflow only when:
配置库
└── infra
文件
argocd/dev.yaml
apiVersion: argoproj.io/v1alpha1
argocd/sbox.yaml
apiVersion: argoproj.io/v1alpha1
argocd/prod.yaml
apiVersion: argoproj.io/v1alpha1
argocd/project.yaml
apiVersion: argoproj.io/v1alpha1
helm/hash
专门用于dev 部署。该文件由 "合并 "GitHub Actions工作流自动更新。
helm/tag
专用于sbox 和prod 部署。该文件由 "发布 "GitHub Actions工作流自动更新。
helm/Chart.yaml
apiVersion: v2
helm/dev.yaml
env:
helm/sbox.yaml
env:
helm/prod.yaml
env:
helm/configmap.yaml
apiVersion: v1
helm/service.yaml
apiVersion: v1
helm/deployment.yaml
apiVersion: apps/v1
CI/CD截图
簇
集群
存储库
项目
应用程序
合并
在配置资源库中提交!
发布
在配置库中提交!