实战分享:如何在Kubernetes集群中引入CI/CD?

本篇文章将介绍一个新的工具,用以持续地在 Kubernetes 集群上部署应用。

每一个采用DevOps 实践的企业都希望能够快速持续做每一件事情,无论是集成、部署、测试还是监控。无论小型企业还是大型企业,若想要成功做到 DevOps 式运维,CI/CD 都至关重要,可以用来缩短开发周期并快速响应变化,同时可减少部署失败的次数,并且在部署失败时能够做到安全回滚并减少平均修复时间(MTTR)。

本文,我们将讲解一种新方法,将应用程序持续集成(CI)和持续交付(CD)引入到 Kubernetes 集群中。我们将使用 Jenkins 作为 CI 工具,它将轮询 Git 仓库并且在提交代码时自动构建 Docker 镜像并将其推送到 Docker registry。同时将使用 Spinnaker 作为 CD 工具,它将轮询 Docker registry 并触发部署流水线,以此来更新 Kubernetes 集群中的应用程序。

image

如上图所示,当开发者向 GitHub 提交代码之后,Jenkins 将在某一配置好的分支上进行轮询,并针对这次代码提交触发一次应用的构建。Jenkins 会构建一个 Docker 镜像,然后将其推送到 Docker registry,并为该镜像打上标签(可以选择不同的方式为镜像做标签,比如采用 Git 提交号,或者采用递增的数字)。对于 Spinnaker,我们要提前配置好部署流水线,然后当它在 Docker registry 中发现带有新标签的 Docker 镜像时,就会自动触发部署。

什么是 Spinnaker?

Spinnaker 是由 Netflix 开发的开源、基于多重云的持续交付工具。该平台允许我们配置多种部署策略,比如:高地人部署(Highlander,意指只能有一个存在)、红/黑部署等。在部署失败时,它不仅支持回滚策略,还可以进一步触发配置升级的流水线。这意味着我们可以通过配置测试流水线来配置更复杂的流水线,并在受控的 Kubernetes 集群中简单并且安全地进入到下一阶段的流水线中或者是进行回滚。在本系列的下一篇文章中,我们将会学习到更多的部署策略和流水线配置方法。

Spinnaker 的组件

我们需要理解 Spinnaker 的可工作组件,以深入理解 Spinnaker 的安装。首先,让我们先看一下 Spinnaker 的组件及其对应的功能。

image

可以在 Spinnaker 的官方文档中查看以下组件的依赖矩阵及其默认绑定端口。

Deck: 基于浏览器的 Spinnaker UI。

Gate: API 调用者和 Spinnaker UI 通过 API 网关(这里称为 Gate )和 Spinnaker 服务器进行通信。

Orca: 是一个编排引擎,被称为 Orca,用来管理流水线和其他特定的操作。
Clouddriver: 已经部署资源的索引和缓存由 Clouddriver 进行管理。它还协助调用 AWS,GCE 和 Azure 等云供应商。
Echo: 负责发送通知,也作为传入的 web 回调(webhook)。
Igor: 用于在 Jenkins 或 Travis CI 等系统中通过持续集成的 job 触发部署流水线,并且允许在部署流水线中使用 Jenkins/Travis 的某些阶段。
Front50: 用于存储 Spinnaker 的元数据。它将持久化存储所有资源的元数据,比如:流水线、项目、应用程序和通知消息。
Rosco: 用于管理虚拟机的镜像(AWS AMIs, Azure VM 镜像, GCE 镜像)。
Rush: Spinnaker 的脚本执行引擎。

Spinnaker 的安装

前提条件:
在开始安装 Spinnaker 之前,我们要先一起完成以下前提条件。
安装 Halyard 有如下条件(在我们的例子中需要安装 Ubuntu 16.04)。

  • Ubuntu 14.04 或 16.04(Ubuntu 16.04 要求 Spinnaker 1.6.0 或者更高版本)
  • Debian 8 或 9
  • 若要在 macOS 系统的电脑本地安装,现在暂时只能在 High Sierra 版本下测试通过

我们从 Halyard 的安装开始。Halyard 被用来管理 Spinnaker 每次部署的生命周期。

下面的命令将会安装最新版本的 Halyard。

curl -O  https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh 
sudo bash InstallHalyard.sh
hal -v

Halyard 安装完成之后,接下来要设置 Spinnaker 版本。
hal version list ### 这条命令将返回所有的可用版本

hal config version edit --version $VERSION

接下来要设置 Spinnaker 用于存储数据的存储驱动。Spinnaker 支持多种类型的存储驱动,比如:S3, Minio 和 Redis等(在本例中,我们将使用 Minio)。

这将会在服务器中以容器的形式运行 Minio,并且在 Spinnaker 中添加 Minio 作为存储驱动。

docker run -p 9000:9000 --name minio1 \ -e "MINIO_ACCESS_KEY={{access_key}}" \ -e "MINIO_SECRET_KEY={{secret_key}} \ -v /mnt/data:/data \ -v /mnt/config:/root/.minio \ minio/minio server /data 
echo {{secret_key}} | hal config storage s3 edit --endpoint http://localhost:9000 \ --access-key-id {{access_key}} \ --secret-access-key 
hal config storage edit --type s3

在为 Spinnaker 设置了存储驱动之后,就要添加 Kubernetes 集群作为云供应商。

它的账户名是 Kubernetes 集群的名称。通过这种方式,我们可以在单 Spinnaker 下管理多重云供应商(K8s集群)。
Kubeconfig-file 是 Kubernetes 的配置文件,可以在 Kubernetes 主节点下的 “~/.kube/” 文件夹下获取。

hal config provider kubernetes account add {{account name}} --kubeconfig-file={{ kubeconfig-file path }}

只要我们成功添加了云供应商,它就会将所有改变部署在 Spinnaker 上。

hal deploy apply

到了这里,Spinnaker 的设置就已经完成了。在下一篇文章中,我们将一起学习如何通过 Spinnaker 流水线创建并部署应用程序。另外,如果你好奇为什么本文中缺少对 Jenkins 的介绍,那是因为在下一篇文章中,我们将会介绍 Jenkins 的安装和配置,并将 Jenkins 作为我们在下一篇文章中要用到的 Docker 镜像构建工具。

原文链接:https://dzone.com/articles/new-way-of-cicd-in-kubernetes-with-jenkins-and-spi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章