CICD Day9、Argo CD增强持续交付

1、Argo CD简介

  在Jenkins CI/CD流程中的持续交付阶段,既部署到k8s集群阶段,使用kubectl工具来进行应用程序的部署和更新操作,但这种方式无法实时跟踪应用程序的状态。这将造成用户在CI/CD流程完成后需要额外操作kubernetes集群,以进一步查看应用程序的状态。为了解决这些问题,可以引入Argo CD来增强持续交付阶段,如下图所示

image

    在上图中,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首页。
    image

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代码仓库

image

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按钮创建应用。将看到该应用的状态,如下图所示
image

 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分钟再查看是不是正常了
    image
    image
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命名空间中创建这些资源。同时,实时呈现资源的最新状态,资源状态如下图所示

image

  可以直观的看到,java-web-demo应用与svc、deploy和ing资源对象以及它们之间的关系相关联,这些代码与仓库中的资源文件保持一致
  假设修改了代码仓库中的资源文件,例如修改deployment资源中的镜像地址,Argo CD会检测到本次的变更,自动将这些变更同步到kubernetes集群中,从而完成对应用程序的更新。在更新应用程序的过程中,这些资源对象状态会实时变化,以帮助使用者更好的了解该应用程序的最新状态
  如果某个资源状态异常,可以单击资源的三个点按钮中的details来获取更多信息,如事件、日志等

3.4 应用回滚

  Argo CD会记录每次的更新记录,以便进行回滚。单击 History and rollback按钮,查看应用的历史版本,如下所示

image
image

  当前应用有两个历史版本,第一个是当前版本,第二个是上一个版本。例如,回滚到第一个版本,单击右上角的三个点钟的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
posted @   Hello_worlds  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示