网络研讨会系列:Kubernetes上的GitOps工具集与CircleCI和ArgoCD
网络研讨会系列
本文补充了 使用 Kubernetes 进行 CI/CD 的网络研讨会系列。 该系列讨论了如何采用云原生方法来构建、测试和部署应用程序,涵盖发布管理、云原生工具、服务网格和可与 Kubernetes 一起使用的 CI/CD 工具。 它旨在帮助有兴趣将 CI/CD 最佳实践与 Kubernetes 集成到他们的工作流程中的开发人员和企业。
本教程包括本系列最后一节课中的概念和命令,即带有 CircleCI 和 Argo CD 的 Kubernetes 上的 GitOps 工具集。
警告: 本教程中的过程仅用于演示目的。 因此,他们没有遵循生产就绪部署所需的最佳实践和安全措施。
介绍
使用 Kubernetes 部署应用程序可以提供显着的基础设施优势,例如灵活的扩展、分布式组件的管理以及对应用程序不同版本的控制。 然而,随着控制的增加,复杂性也会增加,这会使协作代码开发、版本控制、更改日志记录以及自动部署和回滚的 CI/CD 系统特别难以手动管理。 为了解决这些困难,DevOps 工程师开发了几种 Kubernetes CI/CD 自动化方法,包括称为 GitOps 的工具系统和最佳实践。 GitOps 由 Weaveworks 在 2017 博客文章 中提出,使用 Git 作为 CI/CD 流程的“单一事实来源”,将代码更改集成到每个项目有一个单一的共享存储库,并使用拉取请求来管理基础架构和部署。
有许多工具使用 Git 作为 Kubernetes 上 DevOps 流程的焦点,包括由 Hasura 开发的 Gitkube、Weaveworks 的 Flux 和 Jenkins X,本系列第二次网络研讨会的主题。 在本教程中,您将运行两个附加工具的演示,您可以使用它们来设置您自己的基于云的 GitOps CI/CD 系统:持续集成工具 CircleCI 和 Argo CD[ X213X],一种声明式持续交付工具。
CircleCI 使用 GitHub 或 Bitbucket 存储库来组织应用程序开发并在 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 以正确的顺序执行 test
、build
和 push
作业。 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。