网络研讨会系列:使用CircleCI和Argo CD在Kubernetes上设置GitOps工具集

Weaverworks在2017年博客文章中提出的GitOps使用Git作为CI / CD流程的“单一事实来源”,集成了Git存储库中发生的代码更改。在本教程中,您将演示两个可用于设置自己的基于云的GitOps CI / CD系统的工具:持续集成工具CircleCI和Argo CD,一种声明性的持续交付工具。

网络研讨会系列

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

本教程包括本系列最后一个会话的概念和命令,Kubernetes上的GitOps工具集以及CircleCI和Argo CD。

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

介绍

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

有很多工具使用Git作为Kubernetes上DevOps进程的焦点,包括Hasura开发的Gitkube ,Weaveworks的Flux本系列第二次网络研讨会的主题Jenkins X. 在本教程中,您将演示两个可用于设置自己的基于云的GitOps CI / CD系统的其他工具:持续集成工具CircleCIArgo CD ,一种声明性的持续交付工具。

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

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

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

  • 设置管道触发器以使用CircleCI和GitHub自动执行应用程序测试。

  • 使用Argo CD从GitHub存储库同步和部署应用程序。

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

先决条件

要学习本教程,您需要:

  • Ubuntu 16.04服务器,内存16 GB或更高。 由于本教程仅用于演示目的,因此命令从root帐户运行。 请注意,此帐户的无限制权限不符合生产就绪的最佳做法,可能会影响您的系统。 因此,建议在测试环境(如虚拟机或DigitalOcean Droplet)中执行这些步骤。

  • Docker Hub帐户 有关Docker Hub入门的概述,请参阅这些说明

  • GitHub帐户和GitHub的基本知识。 有关如何使用GitHub的入门知识,请查看我们如何在GitHub上创建拉取请求教程。

  • 熟悉Kubernetes概念。 有关更多详细信息,请参阅文章“Kubernetes简介”

  • 带有kubectl命令行工具的Kubernetes集群。 本教程已在模拟的Kubernetes集群上进行了测试,该集群在具有Minikube的本地环境中进行设置 ,该程序允许您在自己的计算机上试用Kubernetes工具,而无需设置真正的Kubernetes集群。 要创建Minikube群集,请按照本系列中第二个网络研讨会的第1步, 使用Helm的Kubernetes包管理和使用Jenkins X的CI / CD

第1步 - 设置CircleCI工作流程

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

首先,给CircleCI访问您的GitHub帐户。 要执行此操作, https://circleci.com/在您喜欢的Web浏览器中导航到https://circleci.com/

CircleCI登陆页面

在页面的右上角,您会看到一个注册按钮。 单击此按钮,然后单击下一页上的使用GitHub注册 CircleCI网站将提示您输入GitHub凭据:

登录GitHub CircleCI页面

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

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

CircleCI的欢迎页面

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

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

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

要创建此配置文件,请单击“ 创建新文件”按钮并创建名为.circleci/config.yml的文件:

GitHub创建一个新文件页面

在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:之后列出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再次- 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中的代码。

现在您已经添加了.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标题下选择上下文 最后,单击屏幕右侧的Create Context按钮:

为CircleCI创建上下文屏幕

然后,CircleCI将询问您此上下文的名称。 输入DOCKERHUB ,然后单击“ 创建” 创建上下文后,选择DOCKERHUB上下文并单击“ 添加环境变量”按钮。 对于第一个,键入名称DOCKERHUB_USERNAME ,并在值中输入您的Docker Hub用户名。

为CircleCI添加环境变量屏幕

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

DOCKERHUB上下文创建两个环境变量时,请为测试RSVP应用程序创建一个CircleCI项目。 为此,请从左侧菜单中选择ADD PROJECTS按钮。 这将产生与您的帐户绑定的GitHub项目列表。 从列表中选择rsvpapp-webinar4 ,然后单击“ 设置项目”按钮。

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

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

为CircleCI设置项目屏幕

在屏幕的顶部,CircleCI指示您创建config.yml文件。 由于您已完成此操作,请向下滚动以查找页面右侧的“ 开始构建”按钮。 通过选择此选项,您将告诉CircleCI开始监视应用程序的更改。

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

要测试管道触发器,请访问https://github.com/ your_GitHub_username /rsvpapp-webinar4最近分叉的存储库,并仅在dev分支中进行一些更改。 由于您only: dev添加了分支过滤器only: dev.circleci/config文件,因此只有在dev分支发生更改时才会构建CI。 dev分支代码进行更改,您会发现CircleCI已在用户界面中触发了新的工作流程。 单击正在运行的工作流程,您将找到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将运行创建其Continuous Deployment工作流所需的所有服务和资源。

接下来,从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命名空间中运行的argocd

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

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

NAME            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从前面的输出kubectl port-forwardargocd-server服务的80 TCP端口:

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

输出将是:

Forwarding 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登陆页面:

登录ArgoCD的页面

现在您已经安装了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的名称:

argocd-server-b686c584b-6ktwf

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

argocd login localhost:8080

您将收到以下提示:

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

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

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

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

argocd account update-password

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

argocd relogin

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

Context 'localhost:8080' updated

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

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

kubectl config get-contexts

你会得到:

CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         minikube   minikube   minikube

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

argocd cluster add minikube

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

INFO[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应用程序页面:

Argo CD应用程序屏幕

在此处,单击左侧工具栏中的“设置”图标,单击“ 存储库” ,然后单击“ 连接REPO” Argo CD将为您提供GitHub信息的三个字段:

Argo CD连接Git Repo页面

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

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

Argo CD Review应用参数

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

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

带有rsvpapp的Argo CD应用页面

Status:之后 ,您将看到您的应用程序与您的GitHub存储库是OutOfSync 要在GitHub上部署应用程序,请单击“操作”并选择“ 同步” 片刻之后,您的应用程序状态将更改为Synced ,这意味着Argo CD已部署您的应用程序。

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

rsvpapp的Argo CD应用程序详细信息页面

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

kubectl get pod

您将收到正在运行您的应用的广告连播的输出:

NAME                      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

您可以使用前面突出显示的app_port_number数字导航到浏览器中的your_remote_server_IP_address : app_port_number ,找到已部署的RSVP应用:

RSVP申请

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

第4步 - 测试持续部署设置

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

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

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现在将使用在Continuous Integration系统中创建的开发映像来构建应用程序,而不是从Docker Hub中提取原始映像。

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

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

Argo CD的同步页面

单击此复选框将确保一旦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的更多信息,请查看我们的“开源简介”系列教程。 要探索与Git存储库集成的更多DevOps工具,请查看如何在Ubuntu 18.04上安装和配置GitLab