來源|阿里巴巴雲原生公衆號
做者 |
鄧洪超,阿里雲高級技術專家
Ed Lee,Argo 項目創始人git
Argo CD 是爲 Kubernetes 提供的 GitOps 持續交付工具。它是 CNCF Argo 項目的一部分,該項目是一組 Kubernetes 原生工具,用於在 Kubernetes 上運行和管理做業和應用程序。github
KubeVela 是一個基於 Kubernetes 和 OAM(開放應用程序模型,Open Application Model)的開源應用程序引擎。KubeVela 主要是爲平臺和運營團隊設計的,以便在 Kubernetes 上輕鬆建立簡單但面向開發人員的高度可擴展的抽象。對開發人員(也就是最終用戶)隱藏了在 Kubernetes 上配置應用程序清單的不少複雜性,好比伸縮策略、部署策略和入口,但容許平臺團隊基於組織策略獨立定製和控制這些配置。web
在這篇博文中,咱們將分享基於阿里雲的用例,使用 Argo CD 和 KubeVela 構建以開發者爲中心的持續應用交付流水線的經驗。api
理想狀況下,開發人員但願專一於編寫應用程序並將其代碼推送到 git 倉庫上,而沒必要擔憂 CI/CD 流水線以及配置和運行應用程序時的其餘操做問題。Kubernetes 上一個很是流行的模式是將應用程序從 git 自動部署到生產環境中。這就是 Argo CD 的用武之地。它會持續監視 git 倉庫的新提交,並自動將它們部署到生產環境中。Argo CD 應用倉庫中預約義的 Kubernetes 部署清單文件來建立或升級在 Kubernetes 上運行的應用程序。這種模式被稱爲 GitOps,是在阿里巴巴的現代雲原生堆棧中實現持續自動應用交付的關鍵。安全
雖然概念上很簡單,但在將 GitOps 應用到更普遍的最終用戶場景時,會出現幾個重要的問題:app
第一個問題是:實際的生產應用程序是複雜的,須要開發人員理解如何配置許多不一樣類型的 Kubernetes 資源。ide
第二個問題(與第一個問題相關)是:對於每一個開發人員來講,學習如何正確配置和維護全部這些對象,同時遵照組織安全、聽從性和操做策略變得很是具備挑戰性。即便是簡單的錯誤配置也可能致使部署失敗,甚至服務不可用。工具
這些問題產生了對應用程序抽象的強烈需求,該抽象將開發人員與不會直接影響其應用程序的平臺和操做關注點隔離開來,並提供了一個錨來避免配置漂移。Kubernetes 的核心抽象,經過有意的設計,並無爲抽象應用程序提供一個標準的機制。學習
考慮到這個目標,KubeVela 被建立和設計爲一個最小的、可擴展的應用程序引擎,供平臺構建人員在 Kubernetes 上建立「相似 PaaS」的體驗。具體來講,KubeVela 提供了簡單而有效的抽象,將應用程序配置問題與平臺和操做問題分離開來。下面是一個名爲 appfile 的工件示例:阿里雲
經過使用 appfile 並將其與 Argo CD 一塊兒部署,開發人員只須要編寫一個簡單的應用配置,並將代碼推送到 git。而後,他們的應用程序將被自動部署,並開始在目標 Kubernetes 集羣上處理實時流量。在幕後,平臺和運營團隊有能力用 CUElang 模板預先定義和/或修改這些抽象的行爲,並確保它們知足組織的安全性、聽從性和其餘運營需求。
在下面,咱們將更詳細地解釋上述 GitOps 工做流是如何工做的。
對於平臺運營者來講,惟一的「技巧」是使 KubeVela 成爲 Argo CD 的自定義插件,這樣它就能「理解」appfile 格式。
Argo CD 容許經過編輯 argocd-cm ConfigMap 集成額外的配置管理插件,如 Kubevela。
將如下文件保存爲 argo-cm.yaml:
data: configManagementPlugins: | - name: vela init: command: ["sh", "-xc"] args: ["vela traits"] generate: command: ["sh", "-xc"] args: ["vela export"]
而後執行如下命令更新argocd-cm ConfigMap:
kubectl -n argocd patch cm/argocd-cm -p "$(cat argo-cm.yaml)"
Argo CD 有一個名爲 argo-repo-server 的組件,它從 Git 中提取部署清單文件並呈現最終輸出。在這裏,咱們將使用 vela cli 解析 appfile 並將其呈現到 Kubernetes 資源中。
首先,使用所需的 kubeconfig 證書建立 ConfigMap,以便與已經安裝了 KubeVela 的目標 Kubernetes 集羣進行通訊:
apiVersion: v1 kind: ConfigMap metadata: name: vela-kubeconfig namespace: argocd data: config: | # fill your kubeconfig here
當建立了上面的 ConfigMap,更新 argo-repo-server 以保存 vela cli 和憑證。
將如下補丁文件保存爲 deploy.yaml:
spec: template: spec: # 1. Define an emptyDir volume which will hold the custom binaries volumes: - name: custom-tools emptyDir: {} - name: vela-kubeconfig configMap: name: vela-kubeconfig # 2. Use an init container to download/copy custom binaries initContainers: - name: download-tools image: oamdev/argo-tool:v1 command: [sh, -c] args: - cp /app/vela /custom-tools/vela volumeMounts: - mountPath: /custom-tools name: custom-tools # 3. Volume mount the custom binary to the bin directory containers: - name: argocd-repo-server env: - name: KUBECONFIG value: /home/argocd/.kube/config volumeMounts: - mountPath: /usr/local/bin/vela name: custom-tools subPath: vela - mountPath: /home/argocd/.kube/ name: vela-kubeconfig
而後執行如下命令更新 argocd-repo-server 部署:
kubectl -n argocd patch deploy/argocd-repo-server -p "$(cat deploy.yaml)"
到目前爲止,vela 插件應該已經註冊,argo-repo-server 應該能夠訪問 vela cli,將 appfile 呈現到 Kubernetes 資源中。
如今,做爲應用程序開發人員,你能夠經過 GitOps 部署使用 KubeVela 指定的應用程序。經過 argocd 命令行建立應用時,要記住指定插件名:
argocd app create <appName> --config-management-plugin vela
讓咱們用 Argo CD UI 來演示一下。這裏是一個包含 appfile 的倉庫示例。
配置 Argo CD 來監視 Git 推送的倉庫,包括初始狀態:
任何推到倉庫如今將自動檢測和部署:
就是這樣!如今你能夠建立/修改 appfile,推送到 git,Argo CD 會自動將它們部署到你的 Kubernetes 集羣,全部這些都是經過神奇的 GitOps!
全部上述設置和配置都可在此倉庫中得到。KubeVela core 和 Argo CD 目前正在阿里巴巴的 web 應用平臺上生產應用,並已用於內部和公共雲服務上的數萬個應用程序。請嘗試一下,讓咱們知道你的想法!
CNCF Slack #kubevela 頻道:
https://slack.cncf.io/
ArgoCD Slack 頻道:
https://argoproj.github.io/community/join-slack