• 云原生下的CI/CD:安装Argo CD


    1.Argo CD 能解决什么问题

    1.1 从 GitOps 说起

    GitOps 起源于 Weaveworks 公司在 2017 年发表的一篇博客, GitOps - Operations by Pull Request 。在文中,Alexis 介绍了一种以 Git 为唯一事实来源的部署方式。

    在 GitOps 实践中,我们需要将软件设施定义在 Git 仓库中进行管理。其中的软件设施,包括 IaaS、Kubernetes 这样的基础设施,也包括应用本身。每个人都可以通过提交 Pull Request 来修改软件设施,然后通过自动化的程序执行这种修改。

    这种方式使得每个人都可以专注于开发新的功能,而不用陷入繁琐的安装、变更、迁移等运维工作。同时,整个过程具有完整的操作记录和权限审批管理。

    1.2 Argo CD 能落地 GitOps

    Argo CD 是以 Kubernetes 为基础设施的 GitOps 持续部署工具。下面是来自 Argo CD 社区的原理图:
    在这里插入图片描述
    Argo CD 从 Git Repo 拉取应用的配置,部署在 Kubernetes 集群中。
    当有人新增功能时,提交一个 Pull Requests 到 Git Repo 修改应用的部署配置,等待合并。
    在 Pull Requests 合并之后,通过 Webhook 触发 Argo CD 执行更新操作。
    应用得到更新,发送通知
    理解起来很容易,将运维过程自动化,持续的部署。

    1.3 强大而易扩展的 Argo CD
    对于一般的 Kubernetes 运维场景,上面描述的功能是够用的。但是如果是复杂场景,涉及多云、多平台、多中间件,也是需要考虑的。

    在这里插入图片描述

    在 Argo CD 的处理逻辑中,定义了四个组件:

    Event Source,接入各种事件消息
    Sensor,将消息转换为触发的动作
    Eventbus,消息订阅路由系统
    Trigger,触发外部的实际动作
    
    • 1
    • 2
    • 3
    • 4

    对于运维人员,需要了解的主要是两点:

    Argo CD 可以处理什么事件?
    
    • 1

    AMQP、AWS SNS、AWS SQS、Cron Schedules、GCP PubSub、GitHub、GitLab、HDFS、File Based Events、Kafka、Minio、NATS、MQTT、K8s Resources、Slack、NetApp StorageGrid、Webhooks、Stripe、NSQ、Emitter、Redis、Azure Events Hub
    Argo CD 可以处理执行哪些动作?

    Argo Workflows、Standard K8s Objects、HTTP Requests、AWS Lambda、NATS Messages、Kafka Messages、Slack Notifications、Argo Rollouts CR、Custom / Build Your Own Triggers、Apache OpenWhisk

    2. 在 Kubernetes 上部署 Argo CD
    新建命名空间,部署 Argo CD
    这里选择当前发布的最新版本: 1.8.3

    kubectl create namespace argocdkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.8.3/manifests/install.yaml
    
    • 1

    Argo CD 社区还提供了 HA 模式的部署方式

    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.8.3/manifests/ha/install.yaml 用于生产环境。
    
    • 1

    将服务改为 NodePort 类型,方便访问

    kubectl patch svc argocd-server -p '{"spec": {"type": "NodePort"}}' -n argocd
    
    • 1

    现在我们已经将名字为 argocd-server 的 Service 改成 NodePort 类型了,可以在集群外部通过 <节点 IP>:<随机生成的 NodePort 端口> 来访问 Argo CD,我这里随机生成的 NodePort 端口是 32313。

    $ kubectl get svc -n argocd 
    NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    argocd-dex-server       ClusterIP   10.68.51.140    <none>        5556/TCP,5557/TCP,5558/TCP   5m11s
    argocd-metrics          ClusterIP   10.68.76.255    <none>        8082/TCP                     5m11s
    argocd-redis            ClusterIP   10.68.223.131   <none>        6379/TCP                     5m11s
    argocd-repo-server      ClusterIP   10.68.1.35      <none>        8081/TCP,8084/TCP            5m11s
    argocd-server           NodePort    10.68.49.24     <none>        80:30582/TCP,443:32313/TCP   5m11s
    argocd-server-metrics   ClusterIP   10.68.107.188   <none>        8083/TCP                     5m10s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查看服务

    kubectl -n argocd get svc
    NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGEargocd-dex-server       ClusterIP   10.233.34.191   <none>        5556/TCP,5557/TCP,5558/TCP   5m37sargocd-metrics          ClusterIP   10.233.54.3     <none>        8082/TCP                     5m36sargocd-redis            ClusterIP   10.233.18.86    <none>        6379/TCP                     5m36sargocd-repo-server      ClusterIP   10.233.3.171    <none>        8081/TCP,8084/TCP            5m36sargocd-server           NodePort    10.233.61.3     <none>        80:31808/TCP,443:30992/TCP   5m36sargocd-server-metrics   ClusterIP   10.233.36.228   <none>        8083/TCP                     5m36s  
    
    • 1
    • 2

    查看 admin 账户密码

    kubectl get pod -n argocd |grep argocd-server
    argocd-server-7d597d9bcd-6nzct        1/1     Running   0          22m
    
    • 1
    • 2

    这里 admin 的密码就是 Pod 的名字: argocd-server-7d597d9bcd-6nzct

    登录 Argo CD UI 页面,打开页面 http://{HOST_IP}:31808

    在这里插入图片描述

    使用账户: admin,密码: argocd-server-7d597d9bcd-6nzct 进行登录。

    在这里插入图片描述

    3. 安装 CLI 工具
    下载 CLI 命令行工具
    这里以 Linux 为例进行安装:

    curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v1.8.3/argocd-linux-amd64chmod +x /usr/local/bin/argocd
    
    • 1

    登录 Kubernetes 集群上部署的 Argo CD

    HOST_IP 替换为主机的 IP 地址,使用 CLI 登录集群。

    argocd login {HOST_IP}:31808 --username admin --password argocd-server-7d597d9bcd-6nzct
    'admin' logged in successfullyContext '{HOST_IP}:31808' updated
    
    • 1
    • 2

    更新 admin 密码, 方便下次登录

    argocd account update-password --account admin --current-password argocd-server-7d597d9bcd-6nzct --new-password password
    Password updatedContext '{HOST_IP}:31808' updated
    
    • 1
    • 2

    命令行可以使用以下方式登录。

    ❯ argocd login <节点 IP>:32313

    # 接收证书风险
    WARNING: server certificate had error: x509: cannot validate certificate for 11.8.38.43 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
    Username:  # 输入用户名
    Password: # 输入密码
    'admin:login' logged in successfully
    
    • 1
    • 2
    • 3
    • 4
    • 5

    准备 Git 仓库
    在 Gitlab 上创建项目,取名为 argocd-lab,为了方便实验将仓库设置为 public 公共仓库。在仓库中创建 quickstart 目录,在目录中创建两个 yaml 资源文件,分别是 myapp-deployment.yaml 和 myapp-service.yaml。

    在这里插入图片描述

    yaml 资源文件内容如下:

    # myapp-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v1
            name: myapp
            ports:
            - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    # myapp-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
    spec:
      ports:
      - port: 80
        targetPort: 80
        nodePort: 32060
      type: NodePort
      selector:
        app: myapp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实验所需的镜像我已经在阿里云的镜像仓库中准备好了,大家可以直接使用。

    创建 Argo CD App

    首先创建一个命名空间 devops 用于 Argo CD 部署应用。

    kubectl create ns devops
    
    • 1

    方式一:使用 UI 创建 App

    Application Name: 自定义的应用名。
    Project: 使用默认创建好的 default 项目。
    SYNC POLICY: 同步方式,可以选择自动或者手动,这里我们选择手动同步。

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    Repository URL: 项目的 Git 地址。
    Revision: 分支名。
    Path: yaml 资源文件所在的相对路径。

    在这里插入图片描述

    Cluster URL: Kubernetes API Server 的访问地址,由于 Argo CD 和下发应用的 Kubernetes 集群是同一个,因此可以直接使用 http://kubernetes.default.svc 来访问。关于 Kubernetes 中 DNS 解析规则可以查看 Pod 与 Service 的 DNS。
    Namespace: 部署应用的命名空间。

    在这里插入图片描述

    创建完成后如下图所示,此时处于 OutOfSync 的状态:

    在这里插入图片描述

    由于我设置的是手动同步,因此需要点一下下面的 SYNC 进行同步。

    在这里插入图片描述

    在弹出框点击 SYNCHRONIZE,确认同步。

    在这里插入图片描述

    等待同步完成。

    在这里插入图片描述

    在 Argo CD 上点击应用进入查看详情。

    在这里插入图片描述

    在 Kubernetes 查看部署的资源。

    root@cluster01-1:/root #kubectl get all -n devops 
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/myapp-865f9f464f-qpjbc   1/1     Running   0          2m25s
    
    NAME            TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    service/myapp   NodePort   10.68.93.5   <none>        80:32060/TCP   2m25s
    
    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/myapp   1/1     1            1           2m25s
    
    NAME                               DESIRED   CURRENT   READY   AGE
    replicaset.apps/myapp-865f9f464f   1         1         1       2m25s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在集群外部通过 <节点 IP>: 端口访问 myapp 程序,可以看到此时是 v1 版本。

    在这里插入图片描述

    方式二:使用 CLI 创建 APP

    argocd app create myapp2 \
    --repo http://11.8.36.29/root/argocd-lab.git \
    --path quickstart --dest-server \
    https://kubernetes.default.svc \
    --dest-namespace devops
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用 argocd 命令查看创建的应用。

    # 列出应用
    ❯ argocd app list
    NAME   CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                   PATH        TARGET
    myapp  https://kubernetes.default.svc  devops     default  Synced  Healthy              http://11.8.36.29/root/argocd-lab.git  quickstart  main
    
    # 查看 myapp 应用
    ❯ argocd app get myapp
    Name:               myapp
    Project:            default
    Server:             https://kubernetes.default.svc
    Namespace:          devops
    URL:                https://11.8.36.159:32313/applications/myapp
    Repo:               http://11.8.36.29/root/argocd-lab.git
    Target:             main
    Path:               quickstart
    SyncWindow:         Sync Allowed
    Sync Policy:        <none>
    Sync Status:        Synced to main (82baed1)
    Health Status:      Healthy
    
    GROUP  KIND        NAMESPACE  NAME   STATUS  HEALTH   HOOK  MESSAGE
           Service     devops     myapp  Synced  Healthy        service/myapp created
    apps   Deployment  devops     myapp  Synced  Healthy        deployment.apps/myapp created
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    方式三:使用 YAML 文件创建

    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: myapp
      namespace: argocd
    spec:
      destination:
        namespace: devops # 部署应用的命名空间
        server: https://kubernetes.default.svc # API Server 地址
      project: default # 项目名
      source:
        path: quickstart # 资源文件路径
        repoURL: http://11.8.36.29/root/argocd-lab.git # Git 仓库地址
        targetRevision: main # 分支名
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    版本升级

    这次我们将 myapp 应用从手动同步改成自动同步。点击 APP DETAILS -> SYNC POLICY,点击 ENABLE AUTO-SYNC。

    在这里插入图片描述

    编辑 myapp 资源文件,将版本从 v1 改为 v2,点击 Commit changes,提交更改。

    在这里插入图片描述

    等待一会 Argo CD 会自动更新应用,如果你等不及可以点击 Refresh,Argo CD 会去立即获取最新的资源文件。可以看到此时 myapp Deployment 会新创建 v2 版本的 Replicaset,v2 版本的 Replicaset 会创建并管理 v2 版本的 Pod。

    在这里插入图片描述

    在集群外部通过 <节点 IP>: 端口访问 myapp 程序,可以看到此时是 v2 版本。

    在这里插入图片描述

    版本回滚

    细心的同学应该会发现升级到 v2 版本以后, v1 版本的 Replicaset 并没有被删除,而是继续保留,这是为了方便我们回滚应用。在 myapp 应用中点击 HISTORY AND ROLLBACK 查看历史记录,可以看到有 2 个历史记录。

    在这里插入图片描述
    假设我们刚刚上线的 v2 版本出现了问题,需要回滚回 v1 版本,那么我们可以选中 v1 版本,然后点击 Rollback 进行回滚。

    在这里插入图片描述

    在回滚的时候需要禁用 AUTO-SYNC 自动同步,点击 OK 确认即可。

    在这里插入图片描述

    等待一会可以看到此时已经回滚成功,此时 Pod 是 v1 版本的,并且由于此时线上的版本并不是 Git 仓库中最新的版本,因此此时同步状态是 OutOfSync。

    在这里插入图片描述

    参考文章:
    https://blog.csdn.net/Jacson__/article/details/124850916
    https://blog.csdn.net/cr7258/article/details/122028096

  • 相关阅读:
    AI 绘画 | Stable Diffusion 图生图
    C++11标准模板(STL)- 算法(std::transform)
    Kotlin函数作为参数指向不同逻辑
    Windows C++ 环境下 eigen、osqp、osqp-eigen安装教程
    深入探讨Python高级技术
    JAVA版的数据结构——链表
    基于docker实现JMeter分布式压测
    探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析
    Spring: Bean的创建原理解析
    揭秘In-Context Learning(ICL):大型语言模型如何通过上下文学习实现少样本高效推理[示例设计、ICL机制详解]
  • 原文地址:https://blog.csdn.net/ichen820/article/details/126667804