基于Tekton和ArgoCD的GitOps實戰
隨著云原生持續升溫,CI/CD成為了人們討論的焦點,GitOps就是云原生的一種持續交付模式,它將應用系統的聲明性基礎架構和應用程序存放在Git的版本控制庫中。
實現GitOps的工具有很多,Tekton和Argo CD就是后起之秀的代表。
一、Tekton
Tekton是一個強大而靈活的開源框架,用于創建CI/CD系統,通過Operator的方式集成到k8s集群中,并以容器作為驅動,完成流水線模版定義的任務,社區也提供了很多任務模版來方便使用。
Tekton 為 CI/CD 系統提供了諸多好處(主要用于CI):
- 可定制:Tekton 是完全可定制的,具有高度的靈活性,我們可以定義非常詳細的構建塊目錄,供開發人員在各種場景中使用。
- 可重復使用:Tekton 是完全可移植的,任何人都可以使用給定的流水線并重用其構建塊,可以使得開發人員無需"造輪子"就可以快速構建復雜的流水線。
- 可擴展:Tekton Catalog 是社區驅動的 Tekton 構建塊存儲庫,我們可以使用 Tekton Catalog 中定義的組件快速創建新的流水線并擴展現有管道。
- 標準化:Tekton 在你的 Kubernetes 集群上作為擴展安裝和運行,并使用完善的 Kubernetes 資源模型,Tekton 工作負載在 Kubernetes Pod 內執行。
- 伸縮性:要增加工作負載容量,只需添加新的節點到集群即可,Tekton 可隨集群擴展,無需重新定義資源分配或對管道進行任何其他修改。
Tekton為Kubernetes提供了多種CRD資源對象,可用于定義我們的流水線,主要有以下幾個:Task、TaksRun、Pipeline、PipelineRun和PipelineResource。
- Task:Task 為構建任務,是 Tekton 中不可分割的最小單位,正如同 Pod 在 Kubernetes 中的概念一樣。在 Task 中,可以有多個 Step,每個 Step 由一個 Container 來執行。
- TaskRun:PipelineRun 被創建出來后,會對應 Pipeline 里面的 Task 創建各自的 TaskRun。一個 TaskRun 控制一個 Pod,Task 中的 Step 對應 Pod 中的 Container。當然,TaskRun 也可以單獨被創建。
- Pipeline:Pipeline 由一個或多個 Task 組成。在 Pipeline 中,用戶可以定義這些 Task 的執行順序以及依賴關系來組成 DAG(有向無環圖)。
- PipelineRun:PipelineRun 是 Pipeline 的實際執行產物,當用戶定義好 Pipeline 后,可以通過創建 PipelineRun 的方式來執行流水線,并生成一條流水線記錄。
- PipelineResource:表示Pipeline輸入資源,比如GitHub上的源碼,或者Pipeline速輸出資源,例如一個容器鏡像或者構建生成的jar包等。
二、Argo CD
Argo CD 從名字就能看出(有個 CD),它側重于持續部署這一塊兒,因而CD部分使用Argo CD來完成。
Argo CD是用于Kubernetes的聲明性GitOps持續交付工具,可以在指定的目標環境中自動部署所需的應用程序狀態,應用程序部署可以在Git提交時跟蹤對分支,標簽的更新或固定到清單的特定版本。
Argo CD的主要功能
- 可搭配使用各種配置管理工具(如 ksonnet/jsonnet、Helm 和 kustomize)使應用程序與 Git 中定義的保持一致;
- 將應用程序自動部署到指定的目標環境;
- 持續監控已部署的應用程序;
- 基于 Web 和 CLI 的操作,以及應用程序可視化;
- 部署或回滾到 Git 倉庫中提交的應用程序的任何狀態(這也是使用 Git 進行版本管理的一大好處);
- PreSync、Sync、PostSync hooks 以支持復雜的應用程序部署策略(例如:blue/green 、canary upgrades);
- SSO 集成(OIDC、LDAP、SAML 2.0、GitLab、Microsoft、LinkedIn),這些是企業比較需要的功能;
- Webhook 集成(GitHub、BitBucket、GitLab)。
- 可以獨立使用,也可以作為現有 Pipeline 的一部分使用,例如與 Argo Workflow、Jenkins 以及 GitLab CI 等配合使用;
Aego CD中的幾個主要組件:
- API服務:API服務是一個gRPC/REST服務,它暴露了Web暴露了 Web UI、CLI 和 CI/CD 系統使用的接口。
- 倉庫服務:存儲倉庫服務是一個內部服務,負責維護保存應用程序清單Git倉庫的本地緩存。
- 應用控制器:應用控制器是一個Kuberntes控制器,他持續watch正在運行的應用程序并將當前的實時狀態與所期望的目標狀態進行比較。
三、總結
目前,很多敏捷和DevOps實踐已經被廣泛應用,一條條CI/CD流水線已經被建立起來,我們已經也有很好的工具來實現CI/CD,那么下一步就是基于這些工具,我們是否能很好地實踐應用。