Background
- CI/CD(Continuous Integration/Continuous Deployment)是一种软件开发流程,旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成(CI)和持续部署(CD)两个主要阶段。
- 这里介绍一种开源的持续交付工具
Argo CD
。- Argo CD官方文档地址:https://argo-cd.readthedocs.io
- Argo CD源码地址:https://github.com/argoproj/argo-cd
1、关于Argo
Argo是一个开源的项目,主要是扩展Kubernetes的原生功能,更好地把应用运行在Kubernetes平台。
Github地址:https://github.com/argoproj
目前Argo包含多个子项目:
- Argo Workflows:基于容器的任务编排工具。
- Argo CD:基于GitOps声明的持续交付工具。
- Argo Events:事件驱动工具。
- Argo Rollouts:支持金丝雀以及蓝绿发布的应用渐进式发布工具。
本文主要介绍持续交付工具Argo CD的部署使用。
2、Argo CD简介
Argo CD
是一种开源的持续交付工具,用于自动化和管理应用程序的部署、更新和回滚。它是一个声明式的工具,专为在 Kubernetes 集群中进行应用程序部署而设计。- Argo CD 的主要功能包括:
– 持续交付:Argo CD 允许用户将应用程序的配置和清单文件定义为 Git 存储库中的声明式资源,从而实现持续交付。它能够自动检测 Git 存储库中的更改,并将这些更改应用于目标 Kubernetes 集群。
– 健康监测和回滚:Argo CD 能够监测应用程序的健康状态,并在检测到问题时触发回滚操作。这有助于确保应用程序在部署期间和运行时保持稳定和可靠。
– 多环境管理:Argo CD 支持多个环境(例如开发、测试、生产)的管理。它可以帮助用户在不同环境中进行应用程序的部署和配置管理,并确保这些环境之间的一致性。
– 基于 GitOps 的操作:Argo CD 采用了 GitOps 的操作模式,即将应用程序的状态和配置定义为 Git 存储库中的声明式资源。这使得团队可以使用版本控制和代码审查等软件工程实践来管理应用程序的生命周期。 - Kubernetes 清单可以通过以下几种方式指定:
– kustomize 应用程序
– helm chart
– jsonnet 文件
– YAML/json 清单的普通目录
– 配置为配置管理插件的任何自定义配置管理工具
3、Argo CD的原理
Argocd通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去。
4、Argo CD在 CI/CD 流程中的位置
具体步骤:
- 将应用的 Git 仓库分为 Application Deployment file 和 Docker file 两个库。Docker file 用于存放应用的核心代码以及 Docker build file,后续将会直接打包成 Docker image;Application Deployment file 可以 Kustomize、Helm、Ksconnet、Jsonnet 等 多种 Kubernetes 包管理工具来定义;以 Helm 为例,Chart 中所使用到的 Image 由 Docker file Code 打包完成后提供;
- 使用 Jenkins 或 Gitlab 等 CI 工具进行自动化构建打包,并将 Docker image push 到 Harbor 镜像仓库;
- 使用 Argo CD 部署应用。Argo CD 可以独立于集群之外,并且支持管理多个 Kubernetes 集群。在 Argo CD 上配置好应用部署的相关信息后 Argo CD 便可以正常工作,Argo CD 会自动和代码仓库 Application deployment file 的内容进行校验,当代码仓库中应用属性等信息发生变化时,Argo CD 会自动同步更新 Kubernetes 集群中的应用;应用启动时,会从 Harbor 镜像仓库拉取 Docker image。
5、Argo CD的安装配置
-
首先需要确定安装的版本
访问Argo CD官方文档地址:https://argo-cd.readthedocs.io,查询与你k8s版本对应的Argo CD版本。我这里k8s是v1.24.9,所以选择2.8版本的Argo CD。
-
安装部署
- 安装方式有很多种,这里直接选择官方提供资源清单文件。
- 由于需要选择k8s对应的版本,并且github访问受限,建议选择好版本下载下来对应的
install.yaml
离线安装。- 这里安装的标准版本,当然也可以选择高可用的安装方式。
# 没有kubectl的先安装kubectl
kubectl create namespace argocd
kubectl apply -n argocd -f https://github.com/argoproj/argo-cd/tree/release-2.8/manifests/install.yaml
# 或者
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.8.8/manifests/install.yaml
- 安装CLI工具
Argo CD CLI 是用于管理 Argo CD 的命令行工具。这里不做详细介绍,后面我们主要使用web ui来操作Argo CD。具体下载地址可以去github地址上去找。
- 发布 Argo CD 服务
- 默认情况下, Argo CD 服务不对外暴露服务,可以通过 LoadBalancer 或者 NodePort 类型的 Service、Ingress、Kubectl 端口转发等方式将 Argo CD 服务发布到 Kubernetes 集群外部。
- 这里使用以下命令通过 NodePort 服务的方式暴露 Argo CD 到集群外部:
# 修改 Service 类型
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
# 获取随机生成的 NodePort 端口
kubectl get svc -n argocd
- 访问Web UI
- 把名字为 argocd-server 的 Service 改成 NodePort 类型后,就可以在集群外部通过 <节点 IP>:<随机生成的 NodePort 端口> 来访问 Argo CD了;
- 浏览器输入 https://<节点 IP>:port 访问 Argo CD;
- 默认情况下 admin 帐号的初始密码是自动生成的,会以明文的形式存储在 Argo CD 安装的命名空间中名为 argocd-initial-admin-secret 的 Secret 对象下的 password 字段下,可以用下面的命令获取:
kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" -n argocd | base64 -d
登录页面
6、Argo CD的使用-Web UI 部署应用
准备git仓库测试项目 argocd-test
这里其实只需要deployment.yaml和service.yaml,Dockerfile和index.html用于构建镜像推送到harbor私服。
- 构建私服镜像(这步可选的,不是必须的,我这里是为了后面集成jenkins和harbor)
docker login --username=admin 192.168.19.234:5100
docker build -t nginx:v1 .
docker tag nginx:v1 192.168.19.234:5100/mid-base/nginx:v1
docker push 192.168.19.234:5100/mid-base/nginx:v1
docker rmi nginx:v1 192.168.19.234:5100/mid-base/nginx:v1
- Dockerfile
FROM nginx:latestCOPY index.html /usr/share/nginx/html
- index.html
hello world!
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: 192.168.19.234:5100/mid-base/nginx:v1name: nginxports:- containerPort: 80
- service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx
spec:ports:- port: 80targetPort: 80nodePort: 30001type: NodePortselector:app: nginx
Gitlab创建Access Token
配置GitLab 仓库认证信息
创建 Argo CD App
- 首先创建一个命名空间 my-apps 用于 Argo CD 部署应用
kubectl create ns my-apps
-
填写应用基本配置信息
-
仓库源配置
-
目标集群配置
-
点击左上方的
CREATE
按钮创建应用,创建完成后会自动同步如下图所示,此时处于 Syncing 的状态,如下图所示:
-
同步完成后如下图所示:
解决Argo CD自动同步延迟的问题
- ArgoCD 默认每 3 分钟会拉取仓库检查是否有新的提交,你也可以在 ArgoCD 控制台手动点击 Sync 按钮来触发同步。
- 为了消除轮询延迟,API 服务端可以配置为接收 webhook 事件,从而实时获取 Git 存储库中的变化。当然也可以通过修改argocd-server的配置
timeout.reconciliation: 180s
,然后重启这个容器 argocd-repo-server(不是很推荐,因为设置的间隔小,会一直轮训,没必要)。- Argo CD 支持来自 GitHub、GitLab、Bitbucket、Bitbucket Server 和 Gogs 的 Git webhook 事件。
- 这里我们以 GitLab 为例,配置 webhook 来实现这一功能,具体操作如下图所示:
Webhook 的地址填写 Argo CD 的 API 接口地址 https://192.168.19.42:31263/api/webhook
,IP和端口需要修改成你自己的。
这样我们的问题就解决了,每次提交代码就会触发同步,不会再等那漫长的三分钟了!