ArgoCD + KubeVela:以开发者为中心的 GitOps
來(lái)源|阿里巴巴云原生公眾號(hào)
作者 |?
鄧洪超,阿里云高級(jí)技術(shù)專家
Ed Lee,Argo 項(xiàng)目創(chuàng)始人
介紹
Argo CD 是為 Kubernetes 提供的 GitOps 持續(xù)交付工具。它是 CNCF Argo 項(xiàng)目的一部分,該項(xiàng)目是一組 Kubernetes 原生工具,用于在 Kubernetes 上運(yùn)行和管理作業(yè)和應(yīng)用程序。
KubeVela 是一個(gè)基于 Kubernetes 和 OAM(開(kāi)放應(yīng)用程序模型,Open Application Model)的開(kāi)源應(yīng)用程序引擎。KubeVela 主要是為平臺(tái)和運(yùn)營(yíng)團(tuán)隊(duì)設(shè)計(jì)的,以便在 Kubernetes 上輕松創(chuàng)建簡(jiǎn)單但面向開(kāi)發(fā)人員的高度可擴(kuò)展的抽象。對(duì)開(kāi)發(fā)人員(也就是最終用戶)隱藏了在 Kubernetes 上配置應(yīng)用程序清單的很多復(fù)雜性,比如伸縮策略、部署策略和入口,但允許平臺(tái)團(tuán)隊(duì)基于組織策略獨(dú)立定制和控制這些配置。
在這篇博文中,我們將分享基于阿里云的用例,使用 Argo CD 和 KubeVela 構(gòu)建以開(kāi)發(fā)者為中心的持續(xù)應(yīng)用交付流水線的經(jīng)驗(yàn)。
以開(kāi)發(fā)者為中心的 GitOps 體驗(yàn)
理想情況下,開(kāi)發(fā)人員希望專注于編寫(xiě)應(yīng)用程序并將其代碼推送到 git 倉(cāng)庫(kù)上,而不必?fù)?dān)心 CI/CD 流水線以及配置和運(yùn)行應(yīng)用程序時(shí)的其他操作問(wèn)題。Kubernetes 上一個(gè)非常流行的模式是將應(yīng)用程序從 git 自動(dòng)部署到生產(chǎn)環(huán)境中。這就是 Argo CD 的用武之地。它會(huì)持續(xù)監(jiān)視 git 倉(cāng)庫(kù)的新提交,并自動(dòng)將它們部署到生產(chǎn)環(huán)境中。Argo CD 應(yīng)用倉(cāng)庫(kù)中預(yù)定義的 Kubernetes 部署清單文件來(lái)創(chuàng)建或升級(jí)在 Kubernetes 上運(yùn)行的應(yīng)用程序。這種模式被稱為 GitOps,是在阿里巴巴的現(xiàn)代云原生堆棧中實(shí)現(xiàn)持續(xù)自動(dòng)應(yīng)用交付的關(guān)鍵。
雖然概念上很簡(jiǎn)單,但在將 GitOps 應(yīng)用到更廣泛的最終用戶場(chǎng)景時(shí),會(huì)出現(xiàn)幾個(gè)重要的問(wèn)題:
-
第一個(gè)問(wèn)題是:實(shí)際的生產(chǎn)應(yīng)用程序是復(fù)雜的,需要開(kāi)發(fā)人員理解如何配置許多不同類型的 Kubernetes 資源。
-
第二個(gè)問(wèn)題(與第一個(gè)問(wèn)題相關(guān))是:對(duì)于每個(gè)開(kāi)發(fā)人員來(lái)說(shuō),學(xué)習(xí)如何正確配置和維護(hù)所有這些對(duì)象,同時(shí)遵守組織安全、遵從性和操作策略變得非常具有挑戰(zhàn)性。即使是簡(jiǎn)單的錯(cuò)誤配置也可能導(dǎo)致部署失敗,甚至服務(wù)不可用。
-
第三個(gè)問(wèn)題是:當(dāng) Kubernetes 規(guī)范或組織策略發(fā)生變化時(shí),必須更新所有應(yīng)用程序清單以反映這些變化。對(duì)于一個(gè)可能擁有數(shù)千個(gè)應(yīng)用程序和數(shù)百萬(wàn)行 Kubernetes 清單文件的 YAML 的組織來(lái)說(shuō),這是一項(xiàng)巨大的任務(wù)。
這些問(wèn)題產(chǎn)生了對(duì)應(yīng)用程序抽象的強(qiáng)烈需求,該抽象將開(kāi)發(fā)人員與不會(huì)直接影響其應(yīng)用程序的平臺(tái)和操作關(guān)注點(diǎn)隔離開(kāi)來(lái),并提供了一個(gè)錨來(lái)避免配置漂移。Kubernetes 的核心抽象,通過(guò)有意的設(shè)計(jì),并沒(méi)有為抽象應(yīng)用程序提供一個(gè)標(biāo)準(zhǔn)的機(jī)制。
考慮到這個(gè)目標(biāo),KubeVela 被創(chuàng)建和設(shè)計(jì)為一個(gè)最小的、可擴(kuò)展的應(yīng)用程序引擎,供平臺(tái)構(gòu)建人員在 Kubernetes 上創(chuàng)建“類似 PaaS”的體驗(yàn)。具體來(lái)說(shuō),KubeVela 提供了簡(jiǎn)單而有效的抽象,將應(yīng)用程序配置問(wèn)題與平臺(tái)和操作問(wèn)題分離開(kāi)來(lái)。下面是一個(gè)名為 appfile 的工件示例:
通過(guò)使用 appfile 并將其與 Argo CD 一起部署,開(kāi)發(fā)人員只需要編寫(xiě)一個(gè)簡(jiǎn)單的應(yīng)用配置,并將代碼推送到 git。然后,他們的應(yīng)用程序?qū)⒈蛔詣?dòng)部署,并開(kāi)始在目標(biāo) Kubernetes 集群上處理實(shí)時(shí)流量。在幕后,平臺(tái)和運(yùn)營(yíng)團(tuán)隊(duì)有能力用 CUElang 模板預(yù)先定義和/或修改這些抽象的行為,并確保它們滿足組織的安全性、遵從性和其他運(yùn)營(yíng)需求。
在下面,我們將更詳細(xì)地解釋上述 GitOps 工作流是如何工作的。
KubeVela 搭配 Argo CD
1. 先決條件
對(duì)于平臺(tái)運(yùn)營(yíng)者來(lái)說(shuō),唯一的“技巧”是使 KubeVela 成為 Argo CD 的自定義插件,這樣它就能“理解”appfile 格式。
2. 注冊(cè)插件
Argo CD 允許通過(guò)編輯 argocd-cm ConfigMap 集成額外的配置管理插件,如 Kubevela。
將以下文件保存為 argo-cm.yaml:
data:configManagementPlugins: |- name: velainit:command: ["sh", "-xc"]args: ["vela traits"]generate:command: ["sh", "-xc"]args: ["vela export"]然后執(zhí)行以下命令更新argocd-cm ConfigMap:
kubectl -n argocd patch cm/argocd-cm -p "$(cat argo-cm.yaml)"3. 配置 argo-repo-server
Argo CD 有一個(gè)名為 argo-repo-server 的組件,它從 Git 中提取部署清單文件并呈現(xiàn)最終輸出。在這里,我們將使用 vela cli 解析 appfile 并將其呈現(xiàn)到 Kubernetes 資源中。
首先,使用所需的 kubeconfig 證書(shū)創(chuàng)建 ConfigMap,以便與已經(jīng)安裝了 KubeVela 的目標(biāo) Kubernetes 集群進(jìn)行通信:
apiVersion: v1 kind: ConfigMap metadata:name: vela-kubeconfignamespace: argocd data:config: |# fill your kubeconfig here當(dāng)創(chuàng)建了上面的 ConfigMap,更新 argo-repo-server 以保存 vela cli 和憑證。
將以下補(bǔ)丁文件保存為 deploy.yaml:
spec:template:spec:# 1. Define an emptyDir volume which will hold the custom binariesvolumes:- name: custom-toolsemptyDir: {}- name: vela-kubeconfigconfigMap:name: vela-kubeconfig# 2. Use an init container to download/copy custom binariesinitContainers:- name: download-toolsimage: oamdev/argo-tool:v1command: [sh, -c]args:- cp /app/vela /custom-tools/velavolumeMounts:- mountPath: /custom-toolsname: custom-tools# 3. Volume mount the custom binary to the bin directorycontainers:- name: argocd-repo-serverenv:- name: KUBECONFIGvalue: /home/argocd/.kube/configvolumeMounts:- mountPath: /usr/local/bin/velaname: custom-toolssubPath: vela- mountPath: /home/argocd/.kube/name: vela-kubeconfig然后執(zhí)行以下命令更新 argocd-repo-server 部署:
kubectl -n argocd patch deploy/argocd-repo-server -p "$(cat deploy.yaml)"到目前為止,vela 插件應(yīng)該已經(jīng)注冊(cè),argo-repo-server 應(yīng)該可以訪問(wèn) vela cli,將 appfile 呈現(xiàn)到 Kubernetes 資源中。
在 Argo CD 中使用 KubeVela
現(xiàn)在,作為應(yīng)用程序開(kāi)發(fā)人員,你可以通過(guò) GitOps 部署使用 KubeVela 指定的應(yīng)用程序。通過(guò) argocd 命令行創(chuàng)建應(yīng)用時(shí),要記住指定插件名:
argocd app create <appName> --config-management-plugin vela讓我們用 Argo CD UI 來(lái)演示一下。這里是一個(gè)包含 appfile 的倉(cāng)庫(kù)示例。
配置 Argo CD 來(lái)監(jiān)視 Git 推送的倉(cāng)庫(kù),包括初始狀態(tài):
任何推到倉(cāng)庫(kù)現(xiàn)在將自動(dòng)檢測(cè)和部署:
就是這樣!現(xiàn)在你可以創(chuàng)建/修改 appfile,推送到 git,Argo CD 會(huì)自動(dòng)將它們部署到你的 Kubernetes 集群,所有這些都是通過(guò)神奇的 GitOps!
了解更多
所有上述設(shè)置和配置均可在此倉(cāng)庫(kù)中獲得。KubeVela core 和 Argo CD 目前正在阿里巴巴的 web 應(yīng)用平臺(tái)上生產(chǎn)應(yīng)用,并已用于內(nèi)部和公共云服務(wù)上的數(shù)萬(wàn)個(gè)應(yīng)用程序。請(qǐng)嘗試一下,讓我們知道你的想法!
-
CNCF Slack #kubevela 頻道:
https://slack.cncf.io/ -
ArgoCD Slack 頻道:
https://argoproj.github.io/community/join-slack -
KubeVela?地址:
https://github.com/oam-dev/kubevela
如果你有任何疑問(wèn),歡迎釘釘搜索群號(hào):23310022,和近 2000?名開(kāi)發(fā)者互動(dòng)交流!
總結(jié)
以上是生活随笔為你收集整理的ArgoCD + KubeVela:以开发者为中心的 GitOps的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 再见 2020!Apache Rocke
- 下一篇: Dubbo 版 Swagger 来啦!D