CICD Day9、Argo CD增强持续交付
1、Argo CD简介
在Jenkins CI/CD流程中的持续交付阶段,既部署到k8s集群阶段,使用kubectl工具来进行应用程序的部署和更新操作,但这种方式无法实时跟踪应用程序的状态。这将造成用户在CI/CD流程完成后需要额外操作kubernetes集群,以进一步查看应用程序的状态。为了解决这些问题,可以引入Argo CD来增强持续交付阶段,如下图所示
在上图中,Jenkins仍然负责持续集成阶段,包括拉取代码、代码编译和构建镜像等任务。
一旦完成这些任务,Jenkins就会将最新的状态更新到存储在Git代码仓库的kubernetes资源文件中。
Argo CD负责执行kubernetes资源文件的更新操作,并持续监控Git代码仓库中的kubernetes资源文件的变化,如果监测到变更,Argo CD会自动将这些变更同步到kubernetes集群中,以完成对应用程序的更新操作。同时,用户可以通过可视化界面实时观察应用程序的更新状态
这种分工和协作机制充分发挥了Jenkins和Argo CD的优势,实现饿了更可靠、自动化和可视化的持续交付流程
2、Argo CD 部署
- 将Argo CD部署到kubernetes集群中
kubectl create ns argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
- 查看Argo CD相关资源,如下
[root@h-k8s-master-181 k8s]# kubectl get pod,svc -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 50s
pod/argocd-applicationset-controller-5c787df94f-d8ql9 1/1 Running 0 50s
pod/argocd-dex-server-6bb9b5fc75-j6v5d 1/1 Running 0 50s
pod/argocd-notifications-controller-7ccbd7fb6-tcrcx 1/1 Running 0 50s
pod/argocd-redis-6d479f656c-xwgtj 1/1 Running 0 50s
pod/argocd-repo-server-799b498d8b-swwjz 1/1 Running 0 50s
pod/argocd-server-f6d4d8775-jwbdv 1/1 Running 0 50s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.97.89.138 <none> 7000/TCP,8080/TCP 51s
service/argocd-dex-server ClusterIP 10.109.209.155 <none> 5556/TCP,5557/TCP,5558/TCP 51s
service/argocd-metrics ClusterIP 10.103.133.92 <none> 8082/TCP 51s
service/argocd-notifications-controller-metrics ClusterIP 10.100.66.113 <none> 9001/TCP 51s
service/argocd-redis ClusterIP 10.109.242.126 <none> 6379/TCP 51s
service/argocd-repo-server ClusterIP 10.104.220.17 <none> 8081/TCP,8084/TCP 51s
service/argocd-server ClusterIP 10.101.120.102 <none> 80/TCP,443/TCP 51s
service/argocd-server-metrics ClusterIP 10.102.136.4 <none> 8083/TCP 50s
使用kubectl edit svc argocd-server -n argocd命令编辑Service对象,将type字段的值从ClusterIP变更为NodePort,并使用kubectl get svc -n argocd命令获取NodePort端口以进行访问。将看到Argocd的登录页面<http://192.168.31.181:30397/>
[root@h-k8s-master-181 ~]# kubectl get svc -A|grep Node
argocd argocd-server NodePort 10.101.120.102 <none> 80:30397/TCP,443:31364/TCP 46h
kubernetes-dashboard kubernetes-dashboard NodePort 10.108.148.129 <none> 443:30001/TCP 2d23h
- 默认用户名为admin,密码由系统随机生成,可以通过下面的命令获取
[root@h-k8s-master-181 k8s]# kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d ; echo
GQznYzmiT0Kglz0m
- 登录成功后,进入Argo CD首页。
3、Argo CD实践
3.1 添加代码仓库
- 在dashboard中添加Git代码仓库:Settings》Repositories》CONNECT PERO,配置如下:
- Choose your connection method: 指定连接方式。这里选择VIA HTTPS
- CONNECT REPO USING HTTPS: 配置与仓库相关的信息
- Type:类型。这里选择git
- Project:项目。这里选择default
- Repository URL:仓库URL,这里输入http://192.168.31.189:88/root/java-web-demo.git
- Username: 用户名
- Password:密码
- Force HTTP basic auth:强制使用HTTP基础认证。这里选中它
单击CONNECT按钮连接测试并添加Git代码仓库
3.2 创建应用
应用(Application)用于定义kubernetes资源的来源(Source)和目标(Destination)。来源是指kubernetes资源文件在代码仓库中的位置,而目标是指资源部署的命名空间
单击导航栏Application,接着单击CREATE APPLICATION按钮创建应用,进入应用配置页面,其中包含以下部分:
(1)GENERAL(常规)
- Application Name:应用名称,这里输入java-web-demo
- Project Name:项目名称。这里选择默认项目default。项目用于逻辑上管理不同的应用,当应用比较多时,基于项目管理应用非常方便
- SYNC POLICY:同步策略。这里选择Automatic(自动),表示Argo CD自动检测Git代码仓库中资源文件的变更,并根据变更自动同步资源状态。另一种是Manual(手动),表示Argo CD自动检测代码仓库中资源文件的变更,但不会同步资源状态,既需要手动触发同步操作
选择Automatic后,将以下两个选项选中- PRUNE RESOURCES(清理资源):如果选中该选项,当代码仓库的资源文件中的资源被删除时,kubernetes集群中的相应资源也会被删除
- SELF HEAL(自愈):如果选中该选项,当代码仓库中的资源文件与kubernetes集群中的资源状态不一致时,尝试自动修复
(2)SOURCE(源)
- Repository URL:代码仓库地址。这里选择上述添加的Git仓库
- Revision:指定仓库的版本。这里输入dev,表示只有dev分支中的资源文件更新时才会进行同步。输入HEAD表示所有分支中的资源文件更新时都会进行同步
- Path:指定资源文件在仓库中的路径(目录)。这里将路径指定为manifests,既资源文件都需要放到这个目录下。这个目录在git代码仓库中要有,否则创建会报错
(3)DESTINATION(目标)
- Cluster URL:kubernetes集群的访问地址。这里选择默认地址https://kubernetes.default.svc
- Namespace:指定资源部署的命名空间,这里输入default
完成配置后,单击CREATE按钮创建应用。将看到该应用的状态,如下图所示
Argo CD还提供了通过定义资源来创建应用的方法,这种方法更利于自动化操作。
- Application自定义资源配置示例如下:
cat application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: java-web-demo
namespace: argocd
spec:
project: default
source:
repoURL: "http://192.168.31.189:88/root/java-web-demo.git"
targetRevision: dev
path: manifests
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
- 如果Synced的Status一直显示 Unknown,可以在k8sMaster节点上执行kubectl apply -f calico-bgpfilter-rbac.yaml。等5分钟再查看是不是正常了
kubectl apply -f calico-bgpfilter-rbac.yaml
cat calico-bgpfilter-rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# 可以根据需要指定角色名称
name: calico-bgpfilter-role
rules:
- apiGroups: ["crd.projectcalico.org"]
resources: ["bgpfilters"]
verbs: ["list", "get", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: calico-bgpfilter-binding
subjects:
- kind: ServiceAccount
name: calico-apiserver
namespace: calico-apiserver
roleRef:
kind: ClusterRole
name: calico-bgpfilter-role
apiGroup: rbac.authorization.k8s.io
3.3 Git仓库中kubernetes资源文件变更
根据上述配置,将资源文件 k8s-deploy.yaml提交到代码仓库中名为manifests的目录下。提交完成后,Argo CD会检测到该目录下资源文件的变更,自动在default命名空间中创建这些资源。同时,实时呈现资源的最新状态,资源状态如下图所示
可以直观的看到,java-web-demo应用与svc、deploy和ing资源对象以及它们之间的关系相关联,这些代码与仓库中的资源文件保持一致
假设修改了代码仓库中的资源文件,例如修改deployment资源中的镜像地址,Argo CD会检测到本次的变更,自动将这些变更同步到kubernetes集群中,从而完成对应用程序的更新。在更新应用程序的过程中,这些资源对象状态会实时变化,以帮助使用者更好的了解该应用程序的最新状态
如果某个资源状态异常,可以单击资源的三个点按钮中的details来获取更多信息,如事件、日志等
3.4 应用回滚
Argo CD会记录每次的更新记录,以便进行回滚。单击 History and rollback按钮,查看应用的历史版本,如下所示
当前应用有两个历史版本,第一个是当前版本,第二个是上一个版本。例如,回滚到第一个版本,单击右上角的三个点钟的Rollback按钮执行回滚。此时,在资源对象状态页面可以实时观察到两个 ReplicaSet对象在进行扩展和缩减副本数的操作,直到当前ReplicaSet副本数缩减为0,上一个版本ReplicaSet副本数扩展为3
单击回滚按钮后,应用状态将从Synced变更为OutOfSync,并关闭自动同步Auto sync is not enabld。这是一项保护措施,因为回滚完成后kubernetes集群中的资源状态会变为与代码仓库中的资源文件不一致。如果启用自动同步,会导致回滚操作的失效或引发其他问题。因此,ArgoCD在行回滚后不再自动同步,而是等待用户手动触发同步操作,通常是在下次持续集成后执行
ArgoCD是一个强大的持续交付工具,以GitOps模式为基础,使用git仓库作为定义应用程序状态的真实来源。ArgoCD不仅支持kubernetes资源文件,还支持helm charts和kustomize,这使得用户可以根据需求灵活地管理和部署多种类型的应用程序
ArgoCD除了可以通过dashboard进行日常管理,还提供了argocd命令行管理工具,更加方便与其他系统集成。该工具可以在ArgoCD项目的GitHub Releases页面中进行下载https://github.com/argoproj/argo-cd
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!