使用GitHub Actions、ArgoCD、Helm和Kubernetes的GitOps风格CI/CD设置

331 阅读2分钟

我以前写过关于此类主题的文章,但这次略有不同,因为应用程序库不再有CI/CD相关的配置文件。它们都存储在自己的专用仓库里。之所以这样分离,是因为我们想实现正确的GitOps实践。简而言之,应用程序和配置仓库都是相互分离的。

目前的设置

我们有四个Kubernetes集群,分别是argocddevsboxprod 。ArgoCD在argocd 集群上运行,并部署到其他三个集群。

部署策略

  • dev - 当一个PR被合并到 分支时,总是自动进行部署。master

  • sbox - 当一个新的 "标签 "发布时,总是自动部署。

  • prod - 永远不要自动部署!

设置

准备好GitHub

我假设你已经有一个名为pacman 的应用程序仓库。

  1. 创建名为GITHUB_ACTIONS 的Docker访问令牌,具有读、写和删除的权限。结果。8d8937fe-753b-4f2b-96bc-b3603e4ed2b0

  2. 使用 "repo "作用域创建名为ARGOCD 的PAT。结果。ghp_fhjkiuUYuy456frreSgrtry2

  3. 使用 "repo "作用域创建名为GITHUB_ACTIONS 的PAT。结果。ghp_re543tgtu7hgaTHhyh6757

  4. 使用ghp_re543tgtu7hgaTHhyh6757 创建名为ACTIONS_TOKEN 的 pacman 存储库秘密。

  5. 使用8d8937fe-753b-4f2b-96bc-b3603e4ed2b0 创建名为DOCKERHUB_TOKEN 的 pacman 仓库秘密。

  6. 使用你的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

专用于sboxprod 部署。该文件由 "发布 "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截图

集群

存储库

项目

应用程序

合并

在配置资源库中提交!

发布

在配置库中提交!

码头

标签