這篇文章會介紹 GitOps 這個 DevOps 的實現方式,在雲原生 (cloud native) 和基礎架構即程式碼 (infrastructure as code, IaC) 的現代軟體開發方法論中,自動化和可靠性是非常關鍵的一部分,GitOps 藉由 CD 中以 Git 為中心的系統狀態定義,讓我們的系統可以實現可靠、可重複的自動化部署管理,那我們就開始吧:)
GitOps 簡介
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 解決的痛點:
部署的無法重複性:一般的 DevOps 方法很難確保 K8S 內運行的狀態與描述的資源檔案 (Yaml/Helm Chart) 完全一致,因為管理人員對基礎架構和應用程式的配置可能有部分是手動完成,所以很難確保每次部署都一樣。
資安風險:用 command 操作 Kubernetes Cluster 時,Kubernetes Cluster 的連線資訊 (KUBECONFIG) 是人為傳遞,一旦暴露會有很大的資安的風險。
GitOps 實現方式
GitOps 的實現方式可以概括為以下 6 個步驟;前 3 步是基本流程建置 (CICD, K8S, …),包含 [1]Git、[2]CICD pipeline 和 [3]K8S IaC 的一些資源文件:
建立 Git Repository:將所有的應用程式程式碼、配置部署文件放到 Git 做版本控制。
建立 CI/CD 流程:建立自動化 CI/CD 流程,從 Git code 建構容器映像 (container image)、測試/部署應用程式。
定義 K8S 資源文件:使用 K8S yaml file 定義 K8S 資源,像是 Pod、Service、Deployment、ConfigMap等
後 3 步是設定 GitOps 的方式,包含 [1]將 K8S 資源的變動 commit 到 Git repository、[2]使用 GitOps 工具自動部署和 [3] GitOps 工具定期進行同步和比較:
將 K8S 資源 commit 到 Git Repository:將 K8S 資源文件 commit 到 Git Repository 中,以實現版本控制和狀態管理。
使用 GitOps 工具自動部署:使用 Argo CD、Flux 等 GitOps 工具,自動從 Git Repository 中拉取最新版本的 K8S 資源文件,將其應用到 K8S 環境中進行部署。
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 應用範例
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 中,部署管理該應用程式。
比較進階的設定可以看官方文件和 Argo examples:
Argo CD - Declarative GitOps CD for Kubernetes
GitHub - argoproj/argocd-example-apps: Example Apps to Demonstrate Argo CD
結語
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
GitOps what you need to know
weaveworks - awesome-gitops
GitHub - weaveworks/awesome-gitops: A curated list for awesome GitOps resources
Argo CD - Declarative GitOps CD for Kubernetes
Argo CD - Declarative GitOps CD for Kubernetes
Argo CD - Argo Project
Argo Project
Azure - CI/CD workflow using GitOps (Flux v2)
CI/CD Workflow using GitOps (Flux v2) - Azure Arc-enabled Kubernetes - Azure Arc
GitOps for Azure Kubernetes Service
GitOps for Azure Kubernetes Service - Azure Example Scenarios
GitOps and the Cloud Operating Model
GitOps and the Cloud Operating Model
Hwchiu Learning Note - 淺談 GitOps 的概念
淺談 GitOps 的概念
Hwchiu Learning Note - [書本導讀]-什麼是GitOps
[書本導讀]-什麼是GitOps
沒有留言:
張貼留言