网络研讨会系列:Kubernetes上的GitOps工具集与CircleCI和ArgoCD

来自菜鸟教程
跳转至:导航、​搜索

网络研讨会系列

本文补充了 使用 Kubernetes 进行 CI/CD 的网络研讨会系列。 该系列讨论了如何采用云原生方法来构建、测试和部署应用程序,涵盖发布管理、云原生工具、服务网格和可与 Kubernetes 一起使用的 CI/CD 工具。 它旨在帮助有兴趣将 CI/CD 最佳实践与 Kubernetes 集成到他们的工作流程中的开发人员和企业。

本教程包括本系列最后一节课中的概念和命令,即带有 CircleCI 和 Argo CD 的 Kubernetes 上的 GitOps 工具集。


警告: 本教程中的过程仅用于演示目的。 因此,他们没有遵循生产就绪部署所需的最佳实践和安全措施。


观看 YouTube 视频

介绍

使用 Kubernetes 部署应用程序可以提供显着的基础设施优势,例如灵活的扩展、分布式组件的管理以及对应用程序不同版本的控制。 然而,随着控制的增加,复杂性也会增加,这会使协作代码开发、版本控制、更改日志记录以及自动部署和回滚的 CI/CD 系统特别难以手动管理。 为了解决这些困难,DevOps 工程师开发了几种 Kubernetes CI/CD 自动化方法,包括称为 GitOps 的工具系统和最佳实践。 GitOps 由 Weaveworks2017 博客文章 中提出,使用 Git 作为 CI/CD 流程的“单一事实来源”,将代码更改集成到每个项目有一个单一的共享存储库,并使用拉取请求来管理基础架构和部署。

有许多工具使用 Git 作为 Kubernetes 上 DevOps 流程的焦点,包括由 Hasura 开发的 Gitkube、Weaveworks 的 FluxJenkins X,本系列第二次网络研讨会的主题。 在本教程中,您将运行两个附加工具的演示,您可以使用它们来设置您自己的基于云的 GitOps CI/CD 系统:持续集成工具 CircleCI 和 Argo CD[ X213X],一种声明式持续交付工具。

CircleCI 使用 GitHubBitbucket 存储库来组织应用程序开发并在 Kubernetes 上自动构建和测试。 通过与 Git 存储库集成,CircleCI 项目可以检测应用程序代码何时发生更改并自动对其进行测试,通过电子邮件或其他通信工具(如 Slack)发送更改通知和测试结果。 CircleCI 保留所有这些更改和测试结果的日志,基于浏览器的界面允许用户实时监控测试,以便团队始终了解他们的项目状态。

作为 Kubernetes 的 Argo 工作流管理引擎的子项目,Argo CD 提供了持续交付工具,可在您的 GitHub 存储库发生更改时自动同步和部署您的应用程序。 通过管理应用程序的部署和生命周期,它为 Kubernetes 环境中的版本控制、配置和应用程序定义提供解决方案,通过易于理解的用户界面组织复杂的数据。 它可以处理多种类型的 Kubernetes 清单,包括 ksonnet 应用程序、Kustomize 应用程序、Helm 图表和 YAML/json 文件,并支持来自 GitHub 的 webhook 通知, GitLab 和 Bitbucket。

CI/CD with Kubernetes 系列 的最后一篇文章中,您将通过以下方式试用这些 GitOps 工具:

  • 使用 CircleCI 和 GitHub 设置管道触发器以自动化应用程序测试。
  • 使用 Argo CD 从 GitHub 存储库同步和部署应用程序。

在本教程结束时,您将基本了解如何使用 GitOps 工具集在 Kubernetes 上构建 CI/CD 管道。

先决条件

要遵循本教程,您将需要:

  • 具有 16 GB RAM 或以上的 Ubuntu 16.04 服务器。 由于本教程仅用于演示目的,因此命令从 root 帐户运行。 请注意,此帐户的无限制权限不符合生产就绪的最佳实践,可能会影响您的系统。因此,建议在虚拟机或虚拟机等测试环境中执行这些步骤DigitalOcean Droplet
  • 一个 Docker Hub 帐户。 有关 Docker Hub 入门的概述,请参阅 这些说明
  • 一个GitHub账号和GitHub基础知识。 有关如何使用 GitHub 的入门知识,请查看我们的 如何在 GitHub 上创建拉取请求教程。
  • 熟悉 Kubernetes 概念。 详情请参考文章【X28X】Kubernetes简介【X61X】。
  • 带有 kubectl 命令行工具的 Kubernetes 集群。 本教程已在模拟 Kubernetes 集群上进行了测试,在本地环境中使用 Minikube 进行设置,该程序允许您在自己的机器上试用 Kubernetes 工具,而无需设置真正的 Kubernetes 集群。 要创建 Minikube 集群,请遵循本系列第二场网络研讨会的第 1 步,Kubernetes 包管理与 Helm 和 CI/CD 与 Jenkins X

第 1 步 — 设置您的 CircleCI 工作流程

在这一步中,您将整理一个标准的 CircleCI 工作流程,其中涉及三个工作:测试代码、构建映像以及将该映像推送到 Docker Hub。 在测试阶段,CircleCI 将使用 pytest 来测试示例 RSVP 应用程序的代码。 然后,它将构建应用程序代码的镜像并将镜像推送到 DockerHub。

首先,让 CircleCI 访问您的 GitHub 帐户。 为此,请在您喜欢的网络浏览器中导航到 https://circleci.com/:

在页面的右上角,您会找到一个注册按钮。 点击这个按钮,然后点击下一页的Sign Up with GitHub。 CircleCI 网站将提示您输入 GitHub 凭据:

在此处输入您的用户名和密码,CircleCI 有权读取您的 GitHub 电子邮件地址、部署密钥并将服务挂钩添加到您的存储库、创建存储库列表以及将 SSH 密钥添加到您的 GitHub 帐户。 这些权限对于 CircleCI 监控和响应 Git 存储库中的更改是必需的。 如果您想在向 CircleCI 提供您的帐户信息之前详细了解请求的权限,请参阅 CircleCI 文档

查看这些权限后,输入您的 GitHub 凭据并单击 登录 。 然后,CircleCI 将与您的 GitHub 帐户集成,并将您的浏览器重定向到 CircleCI 欢迎页面:

现在您可以访问您的 CircleCI 仪表板,打开另一个浏览器窗口并导航到此网络研讨会的 GitHub 存储库,https://github.com/do-community/rsvpapp-webinar4。 如果提示登录 GitHub,请输入您的用户名和密码。 在此存储库中,您将找到由 CloudYuga 团队创建的示例 RSVP 应用程序。 出于本教程的目的,您将使用此应用程序来演示 GitOps 工作流程。 通过单击屏幕右上角的 Fork 按钮将此存储库分叉到您的 GitHub 帐户。

当你 fork 存储库时,GitHub 会将你重定向到 https://github.com/your_GitHub_username/rsvpapp-webinar4。 在屏幕左侧,您将看到一个 Branch: master 按钮。 单击此按钮可显示该项目的分支列表。 这里的 master 分支指的是应用程序的当前正式版本。 另一方面,dev 分支是一个开发沙箱,您可以在其中测试更改,然后在 master 分支中将其升级为正式版本。 选择 dev 分支。

现在您处于此演示存储库的开发部分,您可以开始设置管道。 CircleCI 需要存储库中的 YAML 配置文件,该文件描述了测试应用程序所需的步骤。 您 fork 的存储库已经在 .circleci/config.yml 处包含此文件; 为了练习设置 CircleCI,请删除此文件并自己创建。

要创建此配置文件,请单击 Create new file 按钮并创建一个名为 .circleci/config.yml 的文件:

在 GitHub 中打开此文件后,您可以配置 CircleCI 的工作流程。 要了解此文件的内容,您将逐个添加部分。 首先,添加以下内容:

.circleci/config.yml

version: 2
jobs:
  test:
    machine:
      image: circleci/classic:201808-01
      docker_layer_caching: true
    working_directory: ~/repo
          
. . .

在上述代码中,version 是指您将使用的 CircleCI 版本。 jobs:test: 表示您正在为您的应用程序设置测试,machine:image: 表示 CircleCI 将在哪里进行测试,在本例中是基于 circleci/classic:201808-01 映像的虚拟机。

接下来,添加您希望 CircleCI 在测试期间采取的步骤:

.circleci/config.yml

. . .
    steps:
      - checkout
      - run:
          name: install dependencies
          command: |
            sudo rm /var/lib/dpkg/lock
            sudo dpkg --configure -a
            sudo apt-get install software-properties-common
            sudo add-apt-repository ppa:fkrull/deadsnakes
            sudo apt-get update
            sleep 5
            sudo rm /var/lib/dpkg/lock
            sudo dpkg --configure -a
            sudo apt-get install python3.5
            sleep 5
            python -m pip install -r requirements.txt
        
      # run tests!
      # this example uses Django's built-in test-runner
      # other common Python testing frameworks include pytest and nose
      # https://pytest.org
      # https://nose.readthedocs.io
      
      - run:
          name: run tests
          command: |
            python -m pytest tests/test_rsvpapp.py  

. . .

测试的步骤列在steps:之后,以- checkout开头,这将检查你的项目的源代码并将其复制到作业空间中。 接下来,- run: name: install dependencies 步骤运行列出的命令来安装测试所需的依赖项。 在这种情况下,您将使用 Django Web 框架的 内置测试运行器和测试工具 pytest。 CircleCI 下载这些依赖项后,-run: name: run tests 步骤将指示 CircleCI 在您的应用程序上运行测试。

完成 test 作业后,添加以下内容来描述 build 作业:

.circleci/config.yml

. . .
  build:
  
    machine:
      image: circleci/classic:201808-01
      docker_layer_caching: true
    working_directory: ~/repo
          
    steps:
      - checkout 
      - run:
          name: build image
          command: |
            docker build -t $DOCKERHUB_USERNAME/rsvpapp:$CIRCLE_SHA1 .
 
  push:
    machine:
      image: circleci/classic:201808-01
      docker_layer_caching: true
    working_directory: ~/repo
    steps:
      - checkout 
      - run:
          name: Push image
          command: |
            docker build -t $DOCKERHUB_USERNAME/rsvpapp:$CIRCLE_SHA1 .
            echo $DOCKERHUB_PASSWORD | docker login --username $DOCKERHUB_USERNAME --password-stdin
            docker push $DOCKERHUB_USERNAME/rsvpapp:$CIRCLE_SHA1    

. . .

和之前一样,machine:image: 表示 CircleCI 将根据指定的镜像在虚拟机中构建应用程序。 在 steps: 下,您会再次找到 - checkout,然后是 - run: name: build image。 这意味着 CircleCi 将从 Docker Hub 存储库中的 rsvpapp 映像构建 Docker 容器。 您将在 CircleCI 界面中设置 $DOCKERHUB_USERNAME 环境变量,本教程将在此 YAML 文件完成后介绍该环境变量。

build 作业完成后,push 作业会将生成的图像推送到您的 Docker Hub 帐户。

最后,添加以下行以确定协调您之前定义的作业的 workflows

.circleci/config.yml

. . .
workflows:
  version: 2
  build-deploy:
    jobs:
      - test:
          context: DOCKERHUB
          filters:
            branches:
              only: dev        
      - build:
          context: DOCKERHUB 
          requires:
            - test
          filters:
            branches:
              only: dev
      - push:
          context: DOCKERHUB
          requires:
            - build
          filters:
            branches:
              only: dev

这些行确保 CircleCI 以正确的顺序执行 testbuildpush 作业。 context: DOCKERHUB 指的是测试将发生的上下文。 在完成此 YAML 文件后,您将创建此上下文。 only: dev 行限制工作流仅在存储库的 dev 分支发生更改时触发,并确保 CircleCI 将构建和测试来自 dev[X195X 的代码]。

现在您已经添加了 .circleci/config.yml 文件的所有代码,其内容应如下所示:

.circleci/config.yml

version: 2
jobs:
  test:
    machine:
      image: circleci/classic:201808-01
      docker_layer_caching: true
    working_directory: ~/repo
          
    steps:
      - checkout
      - run:
          name: install dependencies
          command: |
            sudo rm /var/lib/dpkg/lock
            sudo dpkg --configure -a
            sudo apt-get install software-properties-common
            sudo add-apt-repository ppa:fkrull/deadsnakes
            sudo apt-get update
            sleep 5
            sudo rm /var/lib/dpkg/lock
            sudo dpkg --configure -a
            sudo apt-get install python3.5
            sleep 5
            python -m pip install -r requirements.txt
        
      # run tests!
      # this example uses Django's built-in test-runner
      # other common Python testing frameworks include pytest and nose
      # https://pytest.org
      # https://nose.readthedocs.io
      
      - run:
          name: run tests
          command: |
            python -m pytest tests/test_rsvpapp.py  

  build:
  
    machine:
      image: circleci/classic:201808-01
      docker_layer_caching: true
    working_directory: ~/repo
          
    steps:
      - checkout 
      - run:
          name: build image
          command: |
            docker build -t $DOCKERHUB_USERNAME/rsvpapp:$CIRCLE_SHA1 .
 
  push:
    machine:
      image: circleci/classic:201808-01
      docker_layer_caching: true
    working_directory: ~/repo
    steps:
      - checkout 
      - run:
          name: Push image
          command: |
            docker build -t $DOCKERHUB_USERNAME/rsvpapp:$CIRCLE_SHA1 .
            echo $DOCKERHUB_PASSWORD | docker login --username $DOCKERHUB_USERNAME --password-stdin
            docker push $DOCKERHUB_USERNAME/rsvpapp:$CIRCLE_SHA1    

workflows:
  version: 2
  build-deploy:
    jobs:
      - test:
          context: DOCKERHUB
          filters:
            branches:
              only: dev        
      - build:
          context: DOCKERHUB 
          requires:
            - test
          filters:
            branches:
              only: dev
      - push:
          context: DOCKERHUB
          requires:
            - build
          filters:
            branches:
              only: dev

将此文件添加到存储库的 dev 分支后,返回到 CircleCI 仪表板。

接下来,您将创建一个 CircleCI 上下文来容纳您在前面的 YAML 文件中概述的工作流所需的环境变量。 在屏幕左侧,您会找到一个 SETTINGS 按钮。 单击此按钮,然后选择 ORGANIZATION 标题下的 Contexts。 最后,点击屏幕右侧的【X19X】Create Context【X37X】按钮:

然后,CircleCI 会询问您此上下文的名称。 输入DOCKERHUB,然后点击创建。 创建上下文后,选择 DOCKERHUB 上下文并单击 Add Environment Variable 按钮。 首先,输入名称 DOCKERHUB_USERNAME,然后在 Value 中输入您的 Docker Hub 用户名。

然后添加另一个环境变量,但这一次,将其命名为 DOCKERHUB_PASSWORD 并使用您的 Docker Hub 密码填写 Value 字段。

DOCKERHUB 上下文创建两个环境变量后,为测试 RSVP 应用程序创建一个 CircleCI 项目。 为此,请从左侧菜单中选择 ADD PROJECTS 按钮。 这将生成与您的帐户相关联的 GitHub 项目列表。 从列表中选择 rsvpapp-webinar4,然后单击 Set Up Project 按钮。

注意: 如果 rsvpapp-webinar4 没有出现在列表中,请重新加载 CircleCI 页面。 有时,GitHub 项目可能需要一些时间才能显示在 CircleCI 界面中。


您现在将在 设置项目 页面上找到自己:

在屏幕顶部,CircleCI 指示您创建一个 config.yml 文件。 既然你已经这样做了,向下滚动找到页面右侧的开始建造按钮。 通过选择此项,您将告诉 CircleCI 开始监视您的应用程序的更改。

单击开始构建按钮。 CircleCI 会将您重定向到构建进度/状态页面,该页面尚未构建。

要测试管道触发器,请转到最近在 https://github.com/your_GitHub_username/rsvpapp-webinar4 分叉的存储库,并仅在 dev 分支中进行一些更改。 由于您已将分支过滤器 only: dev 添加到您的 .circleci/config 文件中,因此 CI 将仅在 dev 分支发生更改时构建。 修改dev分支代码,你会发现CircleCI在用户界面触发了一个新的工作流。 点击正在运行的工作流,你会发现 CircleCI 正在做什么的细节:

通过 CircleCI 工作流程处理 GitOps CI/CD 系统的持续集成方面,您可以在 Kubernetes 集群上安装和配置 Argo CD 以解决持续部署问题。

第 2 步 — 在 Kubernetes 集群上安装和配置 Argo CD

就像 CircleCI 使用 GitHub 触发对源代码更改的自动化测试一样,Argo CD 将您的 Kubernetes 集群连接到您的 GitHub 存储库以侦听更改并自动部署更新的应用程序。 要进行此设置,您必须首先将 Argo CD 安装到您的集群中。

首先,创建一个名为 argocd命名空间

kubectl create namespace argocd

在这个命名空间中,Argo CD 将运行创建其持续部署工作流所需的所有服务和资源。

接下来,从 Argo 的官方 GitHub 存储库下载 Argo CD 清单

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v0.9.2/manifests/install.yaml

在此命令中,-n 标志指示 kubectl 将清单应用到命名空间 argocd,并且 -f 指定清单的文件名,它将应用,在这种情况下是从 Argo 存储库下载的。

通过使用 kubectl get 命令,您可以找到现在在 argocd 命名空间中运行的 pod:

kubectl get pod -n argocd

使用此命令将产生类似于以下内容的输出:

NAME                                      READY     STATUS    RESTARTS   AGE
application-controller-6d68475cd4-j4jtj   1/1       Running   0          1m
argocd-repo-server-78f556f55b-tmkvj       1/1       Running   0          1m
argocd-server-78f47bf789-trrbw            1/1       Running   0          1m
dex-server-74dc6c5ff4-fbr5g               1/1       Running   0          1m

现在 Argo CD 正在您的集群上运行,请下载 Argo CD CLI 工具,以便您可以从命令行控制程序:

curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v0.9.2/argocd-linux-amd64

下载文件后,使用 chmod 使其可执行:

chmod +x /usr/local/bin/argocd

要查找 Argo CD 服务,请在命名空间 argocd 中运行 kubectl get 命令:

kubectl get svc -n argocd argocd-server

您将获得类似于以下内容的输出:

OutputNAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
argocd-server   ClusterIP   10.109.189.243   <none>        80/TCP,443/TCP   8m

现在,访问 Argo CD API 服务器。 此服务器不会自动拥有外部 IP,因此您必须首先公开 API,以便您可以从本地工作站的浏览器访问它。 为此,请使用 kubectl port-forward 将本地工作站上的端口 8080 转发到上述输出中 argocd-server 服务的 80 TCP 端口:

kubectl port-forward svc/argocd-server -n argocd 8080:80

输出将是:

OutputForwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

运行 port-forward 命令后,您的命令提示符将从终端中消失。 要为您的 Kubernetes 集群输入更多命令,请打开一个新的终端窗口并登录到您的远程服务器。

要完成连接,请使用 ssh 从本地机器转发 8080 端口。 首先,打开一个额外的终端窗口,然后从本地工作站输入以下命令,将 remote_server_IP_address 替换为运行 Kubernetes 集群的远程服务器的 IP 地址:

ssh -L 8080:localhost:8080 root@remote_server_IP_address

要确保 Argo CD 服务器对您的本地工作站公开,请打开浏览器并导航到 URL localhost:8080。 您将看到 Argo CD 登录页面:

现在您已经安装了 Argo CD 并将其服务器暴露给本地工作站,您可以继续下一步,将 GitHub 连接到您的 Argo CD 服务。

第 3 步 — 将 Argo CD 连接到 GitHub

要允许 Argo CD 收听 GitHub 并将部署同步到您的存储库,您首先必须将 Argo CD 连接到 GitHub。 为此,请登录 Argo。

默认情况下,您的 Argo CD 帐户的密码是 Argo CD API 服务器的 pod 名称。 切换回登录到远程服务器但不处理端口转发的终端窗口。 使用以下命令检索密码:

kubectl get pods -n argocd -l app=argocd-server -o name | cut -d'/' -f 2

您将获得运行 Argo API 服务器的 pod 的名称:

Outputargocd-server-b686c584b-6ktwf

输入以下命令以从 CLI 登录:

argocd login localhost:8080

您将收到以下提示:

[secondary_label Output]
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)?

出于本演示的目的,键入 y 以在没有安全连接的情况下继续。 Argo CD 将提示您输入用户名和密码。 输入 admin 作为用户名,输入完整的 argocd-server pod 名称作为您的密码。 输入凭据后,您将收到以下消息:

Output'admin' logged in successfully
Context 'localhost:8080' updated

现在您已登录,请使用以下命令更改密码:

argocd account update-password

Argo CD 将询问您当前的密码以及您想要更改的密码。 选择一个安全密码并在提示时输入。 完成此操作后,使用新密码重新登录:

argocd relogin

再次输入密码,您将获得:

OutputContext 'localhost:8080' updated

如果您在 Argo CD 集群外部的集群上部署应用程序,则需要向 Argo CD 注册应用程序集群的凭证。 如果像本教程一样,Argo CD 和您的应用程序位于同一个集群上,那么在将 Argo CD 连接到您的应用程序时,您将使用 https://kubernetes.default.svc 作为 Kubernetes API 服务器。

为了演示如何注册外部集群,首先获取 Kubernetes 上下文列表:

kubectl config get-contexts

你会得到:

OutputCURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         minikube   minikube   minikube

要添加集群,请输入以下命令,使用集群名称代替突出显示的名称:

argocd cluster add minikube

在这种情况下,前面的命令会产生:

OutputINFO[0000] ServiceAccount "argocd-manager" created
INFO[0000] ClusterRole "argocd-manager-role" created
INFO[0000] ClusterRoleBinding "argocd-manager-role-binding" created, bound "argocd-manager" to "argocd-manager-role"
Cluster 'minikube' added

现在您已经为 Argo CD 设置了登录凭据并测试了如何添加外部集群,请转到 Argo CD 登录页面并从本地工作站登录。 Argo CD 将引导您到 Argo CD 应用程序页面:

在此处,单击左侧工具栏中的 Settings 图标,单击 Repositories,然后单击 CONNECT REPO。 Argo CD 将为您提供 GitHub 信息的三个字段:

Repository URL 字段中,输入 https://github.com/your_GitHub_username/rsvpapp-webinar4,然后输入您的 GitHub 用户名和密码。 输入凭据后,单击屏幕顶部的 CONNECT 按钮。

将包含演示 RSVP 应用程序的存储库连接到 Argo CD 后,从左侧工具栏中选择 Apps 图标,单击右上角的 + 按钮屏幕,然后选择新建应用程序。 在 Select Repository 页面中,为 RSVP 应用程序选择您的 GitHub 存储库,然后单击下一步。 然后选择 CREATE APP FROM DIRECTORY 转到要求您查看应用程序参数的页面:

Path 字段指定应用程序的 YAML 文件在 GitHub 存储库中的位置。 对于此项目,键入 k8s。 对于 Application Name,输入 rsvpapp,对于 Cluster URL,从下拉菜单中选择 https://kubernetes.default.svc,因为 Argo CD 和您的应用程序位于相同的 Kubernetes 集群。 最后,为 Namespace 输入 default

填写应用程序参数后,单击屏幕顶部的 CREATE。 将出现一个框,代表您的应用程序:

Status: 之后,您将看到您的应用程序是 OutOfSync 与您的 GitHub 存储库。 要在 GitHub 上按原样部署应用程序,请单击 ACTIONS 并选择 Sync。 片刻之后,您的应用程序状态将变为 Synced,这意味着 Argo CD 已经部署了您的应用程序。

部署应用程序后,单击应用程序框以查找应用程序的详细图表:

要在 Kubernetes 集群上找到此部署,请切换回远程服务器的终端窗口并输入:

kubectl get pod

您将收到运行应用程序的 pod 的输出:

OutputNAME                      READY     STATUS    RESTARTS   AGE
rsvp-755d87f66b-hgfb5     1/1       Running   0          12m
rsvp-755d87f66b-p2bsh     1/1       Running   0          12m
rsvp-db-54996bf89-gljjz   1/1       Running   0          12m

接下来,检查服务:

kubectl get svc

除了运行应用程序的端口号外,您还将找到 RSVP 应用程序和 MongoDB 数据库的服务,如下所示:

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        2h
mongodb      ClusterIP   10.102.150.54   <none>        27017/TCP      25m
rsvp         NodePort    10.106.91.108   <none>        80:31350/TCP   25m

您可以通过在浏览器中导航到 your_remote_server_IP_address:app_port_number 找到已部署的 RSVP 应用程序,使用前面突出显示的 app_port_number 编号:

现在您已经使用 Argo CD 部署了应用程序,您可以测试您的持续部署系统并将其调整为自动与 GitHub 同步。

第 4 步 — 测试您的持续部署设置

设置 Argo CD 后,通过更改项目并触发新的应用程序构建来测试您的持续部署系统。

在您的浏览器中,导航到 https://github.com/your_GitHub_username/rsvpapp-webinar4,单击进入 master 分支,然后更新 k8s/rsvp.yaml 文件以使用 CircleCI 构建的映像作为基础部署您的应用程序。 在image: nkhare/rsvpapp:后面加上dev,如下图:

rsvpapp-webinar2/k8s/rsvp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rsvp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: rsvp
  template:
    metadata:
      labels:
        app: rsvp
    spec:
      containers:
      - name: rsvp-app
        image: nkhare/rsvpapp: dev
        imagePullPolicy: Always
        livenessProbe:
          httpGet:
            path: /
            port: 5000
          periodSeconds: 30
          timeoutSeconds: 1
          initialDelaySeconds: 50
        env:
        - name: MONGODB_HOST
          value: mongodb
        ports:
        - containerPort: 5000
          name: web-port
. . .

Argo CD 现在将使用在持续集成系统中创建的 dev 映像来构建应用程序,而不是从 Docker Hub 中提取原始映像。

提交更改,然后返回 ArgoCD UI。 你会注意到什么都没有改变; 这是因为您尚未激活自动同步,必须手动同步应用程序。

要手动同步应用程序,请单击屏幕右上角的蓝色圆圈,然后单击 Sync。 将出现一个新菜单,其中包含一个用于命名新版本的字段和一个标有 PRUNE 的复选框:

单击此复选框将确保一旦 Argo CD 启动您的新应用程序,它将销毁过时的版本。 单击 PRUNE 框,然后单击屏幕顶部的 SYNCHRONIZE。 你会看到你的应用程序的旧元素在旋转,而新元素随着你的 CircleCI 制作的图像旋转。 如果新图像包含任何更改,您会发现这些新更改反映在 URL your_remote_server_IP_address:app_port_number 的应用程序中。

如前所述,Argo CD 还有一个自动同步选项,可以在您制作时将更改合并到您的应用程序中。 要启用此功能,请打开远程服务器的终端并使用以下命令:

argocd app set rsvpapp --sync-policy automated 

为确保不会意外删除修订,自动同步的默认设置已关闭。 要打开自动修剪,只需在前面命令的末尾添加 --auto-prune 标志。

现在您已经为 Kubernetes 集群添加了持续部署功能,您已经使用 CircleCI 和 Argo CD 完成了演示 GitOps CI/CD 系统。

结论

在本教程中,您使用 CircleCI 创建了一个管道,当您更改 GitHub 存储库中的代码时,该管道会触发测试并构建更新的图像。 您还使用 Argo CD 部署应用程序,自动合并由 CircleCI 集成的更改。 您现在可以使用这些工具来创建您自己的 GitOps CI/CD 系统,该系统使用 Git 作为其组织主题。

如果您想了解更多关于 Git 的信息,请查看我们的 An Introduction to Open Source 系列教程。 要探索与 Git 存储库集成的更多 DevOps 工具,请查看 如何在 Ubuntu 18.04 上安装和配置 GitLab。