實戰分享:如何在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

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