[K8s] 使用 DroneCI 與 ArgoCD 實現 K8s 自動整合部署



這個教學使用 DroneCI 與 ArgoCD 打造 cloud-native 的持續整合交付平台,讓我們在 push commit 或 merge PR 後即可自動跑完測試、打包 image 並部署到 K8s 叢集。必且藉由版控,我們也得以輕鬆 rollback 到之前的任一版本!

Source code

DroneCI 介紹

DroneCI 是一個 cloud-native 的 CI (Continuous Integration) 工具。它很好的整合了 Github、Gitlab 與 Bitbucket 等多種程式碼托管平台,讓我們可以直接同步 repository 到 Drone 上。如同 TravisCI 與其他的 CI 工具一樣,我們可以用一個 yaml 檔描述我們的 pipeline (比如 .drone.yml),而 Drone 在偵測到程式碼異動後就會觸發 webhook 去執行它。

舉例來說,以下的 .drone.yml 描述了如何跑一個 Golang 應用的測試並發布到 Dockerhub 上:

kind: pipeline

steps:
- name: test
  image: golang
  commands:
  - go test
  - go build

- name: publish
  image: plugins/docker
  settings:
    repo: octocat/hello-world
    tags: [ latest, 1.0, 1 ]

Drone 特別的是它的每個 pipeline step 都是一個 container,因此我們可以很大程度的客製化符合自身需求的 pipeline,或是可以很簡單的就啟動測試用的外部服務。而 Drone 官方也提供許多實用的 plugins 供我們使用,比如 drone-docker 可以用來打包 image,而 drone-slack 可以讓我們輕鬆結合 Slack notification。有興趣的話也可以貢獻自己的 plugins,比如這個 Drone 的 Plugin Registry 彙整了眾多社群提供的 Plugins。

ArgoCD 介紹

ArgoCD 幫助我們同步 Git 上的 manitests 與 K8s 叢集資源的狀態。也就是說,我們只需要在版控上維護系統的部署狀態 (如 image 的版本、資源限制的設定等),ArgoCD 就會自動幫我們同步到機器上,並且確認服務是否健康。另外,我們也可以善用大家最熟悉的版控來管理服務,因此 rollback 到任一版本都是非常容易的。

而這樣管理 K8s 叢集與應用程式交付的方式就叫做 GitOps。GitOps 讓我們可以維護服務部署狀態的 “source of truth”,進而提升團隊維護的效率與系統的可靠性。

Overview

  1. 使用者 push 程式碼或是 merge 新的 PR
  2. 觸發 webhook,Drone 開始執行定義在 .drone.yml 的 CI pipeline
  3. 若測試通過就發布新的 image 到 Dockerhub 上,並更新 manitests repository 上的 image 版本
  4. ArgoCD 偵測到 manifests 的變動,因此通知 K8s 更新 image 並同步部署狀態

事先準備

Source code 可以看 這裡

  1. 一個 Drone server
  2. 一個測試用 K8s 叢集
  3. 部署 ArgoCD 到叢集上
  4. 一個 Github 帳號與一個 Dockerhub 帳號

DroneCI

Setup

當你成功的在 Drone 上連動 Github 帳號後,你可以在 Drone 的 dashboard 上看到所有的 repo。接著複製這個 repo、activate 它並前往 Repositories -> cicd-demo -> settings 新增以下 secret:

最後修改 .drone.yml,把 minghsu0107 替換成你自己的 Github 與 Dockerhub 帳號。現在在 main branch 上的 push 或 pull request 都會觸發 Drone pipeline,有關 Drone 的 Github webhook 的設定可以前往 your repo -> setting -> webhook 查看。

本機開發

在本機開發時,我們會想要檢查 .drone.yml 是否撰寫正確但又不想每次都 push 到 repo。此時我們可以使用 Drone CLI。它可以讓我們在本機執行 pipeline,並且可以 include 或 exclude 某幾個 step,非常適合用在開發上。

使用 CLI 登入 Drone:

export DRONE_SERVER=<drone-server-url>
export DRONE_TOKEN=<drone-token> # check token under: dashboard -> user setting
drone info

舉例來說,我們可以僅執行 test 這個 step:

drone exec --include=<pipline-step-name>

ArgoCD

開始前請先 clone 這個 manifest repository。這個 repo 負責所有有關部署應用的 manifests,之後會用來與 ArgoCD 同步。這邊使用 Kustomize 這個模板工具維護 K8s 的 resources,而且 Kustomize 是被 ArgoCD 原生支援的,這裡就不細談 Kustomize 的使用方法了,只要知道它在這裡幫助我們區分 devprod 環境,並提高 manifests 的可讀性即可。

如果你的 repo 是 private 的,你必須要在 ArgoCD 上設定 credentials,否則就可以跳過這個步驟。

使用 Argo CD CLI:

argocd repo add <repo-url> --username=<username> --password=<password>

也可以使用 GUI:前往 Settings/Repositories、點擊 Connect Repo using HTTPS 並輸入 credentials:

你會看到如以下的畫面:

新增一個 app:

記得把 repo 替換成你自己的。

現在我們完成了所有的準備,前往 /applications 並點擊 SYNC 就可以看到 ArgoCD 自動同步了 cluster 的狀態!

也可以點進去 app 看看一些詳細資訊:

總結

DroneCI 與 ArgoCD 都是滿好上手的工具,而且功能也很強大。今後大家若要建置 CI/CD 平台,但又希望自己 host 伺服器而非使用第三方提供的服務 (可能有成本的考量等),DroneCI 與 ArgoCD 的組合是一個值得考慮的選擇。

Reference

Read More

Comments