2023年3月14日 星期二

GitOps 介紹:使用 GitOps 實現 K8S 雲原生持續交付

沒有留言:
 

Figure: Pull-based architecture with GitHub Actions for CI and Argo CD for CD (ref: Microsoft Azure)

這篇文章會介紹 GitOps 這個 DevOps 的實現方式,在雲原生 (cloud native) 基礎架構即程式碼 (infrastructure as code, IaC) 的現代軟體開發方法論中,自動化可靠性是非常關鍵的一部分,GitOps 藉由 CD 中以 Git 為中心的系統狀態定義,讓我們的系統可以實現可靠、可重複的自動化部署管理,那我們就開始吧:)



GitOps 簡介



Figure: GitOps, Cloud Operating Model Maturity (ref: VMWare)

GitOps 這個概念最早是由 Kubernetes 管理公司 Weaveworks 公司在 2017 年提出,是一種基於 Git 的 DevOps 實現方式,最關鍵的概念是使用 Git repository 來管理基礎設施和應用程式組態 (一般是 K8S),基礎設施和應用配置的唯一事實來源於 Git repository,並確保更新該 Git repository 時軟體基礎架構保持同步,這保證了生產環境和開發環境的一致性,並降低佈署的風險。

 

[用心去感覺] 畫藍圖就蓋好房子,藍圖也收納得井然有序

GitOps 架構中,只有一個地方可以動到系統,就是存 Deployment config 的 repository,並且所有系統上的 狀態都描述在這些描述檔裡 (yaml/helm chart/…),管理起來非常有條理;另外藉由 Git 的版控能力,也讓各種常見的 operation 操作 (rollback/change/…) 井然有序。

 


GitOps 解決痛點

GitOps 解決的痛點:

  1. 部署的無法重複性:一般的 DevOps 方法很難確保 K8S 內運行的狀態與描述的資源檔案 (Yaml/Helm Chart) 完全一致,因為管理人員對基礎架構和應用程式的配置可能有部分是手動完成,所以很難確保每次部署都一樣。

  2. 資安風險:用 command 操作 Kubernetes Cluster 時,Kubernetes Cluster 的連線資訊 (KUBECONFIG) 是人為傳遞,一旦暴露會有很大的資安的風險。

 


GitOps 實現方式


Figure: GitOps, GitOps-in-a-nutshell (ref: VMWare)

GitOps 的實現方式可以概括為以下 6 個步驟;前 3 步是基本流程建置 (CICD, K8S, …),包含 [1]Git、[2]CICD pipeline 和 [3]K8S IaC 的一些資源文件:

  1. 建立 Git Repository:將所有的應用程式程式碼、配置部署文件放到 Git 做版本控制。

  2. 建立 CI/CD 流程:建立自動化 CI/CD 流程,從 Git code 建構容器映像 (container image)、測試/部署應用程式。

  3. 定義 K8S 資源文件:使用 K8S yaml file 定義 K8S 資源,像是 Pod、Service、Deployment、ConfigMap等

後 3 步是設定 GitOps 的方式,包含 [1]將 K8S 資源的變動 commit 到 Git repository、[2]使用 GitOps 工具自動部署和 [3] GitOps 工具定期進行同步和比較:

  1. 將 K8S 資源 commit 到 Git Repository:將 K8S 資源文件 commit 到 Git Repository 中,以實現版本控制和狀態管理。

  2. 使用 GitOps 工具自動部署:使用 Argo CD、Flux 等 GitOps 工具,自動從 Git Repository 中拉取最新版本的 K8S 資源文件,將其應用到 K8S 環境中進行部署。

  3. GitOps 工具定期進行同步和比較:GitOps 工具會定期從 Git repository 中拉取最新版本的 K8S 資源文件,並將其與 K8S 環境中的實際狀態進行比較,以確保環境的實際狀態與 Git Repository 中的狀態保持一致。

 

最後,總結一下上面這 6 步建置裡,使用到的相關 GitOps 工具鍊

  • Container orchestration system: Kubernetes

  • Git Repository: GitHub、GitLab

  • CICD pipeline: Azure DevOps、GitHub Actions、Jenkins、GitLab CI/CD、Circle CI

  • GitOps operator: ArgoCD、Flux

 

[用心去感覺] GitOps CD pipeline 的 pull mode

一般更新 K8S 會分兩種流程模式:push mode 和 pull mode,這裡的 gitops 會是 pull mode,傳統的 command/config 更新方式則是 push mode。Pull mode 時 K8S Cluster 內的 Controller 會負責將變動差異更新到 K8S Cluster,也就是說要更新系統狀態一定要用 Git Repository。

[用心去感覺] 導入 GitOps 的成本考量

GitOps 實務上要使用相關的自動化工具鍊和技術來實現,和其他雲原生的工具/流程導入一樣,對於小型團隊和開發人員來說會需要額外的時間和資源;系統實現 GitOps 流程的作動需要以當下的業務內容、服務擴展的量和人員協作的狀況適時做調整。

 


GitOps 工具:Argo CD 應用範例



Figure: Argo CD - Declarative GitOps CD for Kubernetes

Argo CD 是一款 GitOps 連續交付工具,可以協助管理和部署應用程式,有提供 UI 介面,方便管理和監控應用程式的運行狀態。初始化設定非常簡單:

  • $ kubectl create namespace argocd 
  • $ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

初始化完就可以開始建置 CD 流程,假設有一個運行中的 Kubernetes cluster,並且已經安裝了 Argo CD。首先,我們可以在 Git Repository 中定義應用程序的描述資源。例如:

1apiVersion: argoproj.io/v1alpha1 2kind: Application 3metadata: 4 name: myapp 5 namespace: argocd 6spec: 7 source: 8 repoURL: https://github.com/myuser/myapp.git 9 targetRevision: HEAD 10 path: kubernetes 11 destination: 12 server: https://kubernetes.default.svc 13 namespace: myapp 14 syncPolicy: 15 automated: 16 prune: true 17 selfHeal: true

在這個描述資源中,定義了應用程式的源頭 (repoURL),目的地 (destination) 和同步策略 (syncPolicy),並指定應用程式的 Kubernetes namespace 是 "myapp"。

 

接下來,在 Git Repository 中建立 "kubernetes" 的目錄,其中包含部署應用程式所需的 Kubernetes 資源描述:

1apiVersion: apps/v1 2kind: Deployment 3metadata: 4 name: myapp-deployment 5 namespace: myapp 6spec: 7 replicas: 3 8 selector: 9 matchLabels: 10 app: myapp 11 template: 12 metadata: 13 labels: 14 app: myapp 15 spec: 16 containers: 17 - name: myapp 18 image: myregistry/myapp:latest 19 ports: 20 - containerPort: 80

最後將描述資源和 Kubernetes 資源描述檔案 push 到 GitHub Repository 中。完成後,Argo CD 將會自動同步這些描述資源和資源描述檔案到 Kubernetes cluster 中,部署管理該應用程式。


Figure: 佈署完成後 ArgoCD 的 monitor UI 介面

比較進階的設定可以看官方文件和 Argo examples:

 


結語

GitOps 是雲原生持續整合/持續交付的一種最佳實踐,它以 Git 為中心作為唯一事實的核心想法,來加速持續部署速度,並加強 DevOps 團隊之間的協作。對於習慣雲原生的開發者來說,使用相關的 GitOps 工具鍊可以感受到生產力的大幅提升,以及更穩定流暢的協作方式,非常推薦使用:)

“GitOps is game-changing for the industry. It is a replicable, automated, immutable construct where your change management, everything happens in Git.” — Nicolas Chaillan, Chief Software Officer of the U.S. Air Force

 

 

References

weaveworks - Guide To GitOps

weaveworks - awesome-gitops

Argo CD - Declarative GitOps CD for Kubernetes

Argo CD - Argo Project

Azure - CI/CD workflow using GitOps (Flux v2)

GitOps for Azure Kubernetes Service

GitOps and the Cloud Operating Model

Hwchiu Learning Note - 淺談 GitOps 的概念

Hwchiu Learning Note - [書本導讀]-什麼是GitOps


 

沒有留言:

張貼留言

技術提供:Blogger.