來源|阿里巴巴雲原生公眾號
作者 |
鄧洪超,阿里雲高級技術專家
Ed Lee,Argo 項目創始人
介紹
Argo CD 是為 Kubernetes 提供的 GitOps 持續交付工具。它是 CNCF Argo 項目的一部分,該項目是一組 Kubernetes 原生工具,用於在 Kubernetes 上運行和管理作業和應用程序。
KubeVela 是一個基於 Kubernetes 和 OAM(開放應用程序模型,Open Application Model)的開源應用程序引擎。KubeVela 主要是為平台和運營團隊設計的,以便在 Kubernetes 上輕松創建簡單但面向開發人員的高度可擴展的抽象。對開發人員(也就是最終用戶)隱藏了在 Kubernetes 上配置應用程序清單的很多復雜性,比如伸縮策略、部署策略和入口,但允許平台團隊基於組織策略獨立定制和控制這些配置。
在這篇博文中,我們將分享基於阿里雲的用例,使用 Argo CD 和 KubeVela 構建以開發者為中心的持續應用交付流水線的經驗。
以開發者為中心的 GitOps 體驗
理想情況下,開發人員希望專注於編寫應用程序並將其代碼推送到 git 倉庫上,而不必擔心 CI/CD 流水線以及配置和運行應用程序時的其他操作問題。Kubernetes 上一個非常流行的模式是將應用程序從 git 自動部署到生產環境中。這就是 Argo CD 的用武之地。它會持續監視 git 倉庫的新提交,並自動將它們部署到生產環境中。Argo CD 應用倉庫中預定義的 Kubernetes 部署清單文件來創建或升級在 Kubernetes 上運行的應用程序。這種模式被稱為 GitOps,是在阿里巴巴的現代雲原生堆棧中實現持續自動應用交付的關鍵。
雖然概念上很簡單,但在將 GitOps 應用到更廣泛的最終用戶場景時,會出現幾個重要的問題:
-
第一個問題是:實際的生產應用程序是復雜的,需要開發人員理解如何配置許多不同類型的 Kubernetes 資源。
-
第二個問題(與第一個問題相關)是:對於每個開發人員來說,學習如何正確配置和維護所有這些對象,同時遵守組織安全、遵從性和操作策略變得非常具有挑戰性。即使是簡單的錯誤配置也可能導致部署失敗,甚至服務不可用。
-
第三個問題是:當 Kubernetes 規范或組織策略發生變化時,必須更新所有應用程序清單以反映這些變化。對於一個可能擁有數千個應用程序和數百萬行 Kubernetes 清單文件的 YAML 的組織來說,這是一項巨大的任務。
這些問題產生了對應用程序抽象的強烈需求,該抽象將開發人員與不會直接影響其應用程序的平台和操作關注點隔離開來,並提供了一個錨來避免配置漂移。Kubernetes 的核心抽象,通過有意的設計,並沒有為抽象應用程序提供一個標准的機制。
考慮到這個目標,KubeVela 被創建和設計為一個最小的、可擴展的應用程序引擎,供平台構建人員在 Kubernetes 上創建“類似 PaaS”的體驗。具體來說,KubeVela 提供了簡單而有效的抽象,將應用程序配置問題與平台和操作問題分離開來。下面是一個名為 appfile 的工件示例:
通過使用 appfile 並將其與 Argo CD 一起部署,開發人員只需要編寫一個簡單的應用配置,並將代碼推送到 git。然后,他們的應用程序將被自動部署,並開始在目標 Kubernetes 集群上處理實時流量。在幕后,平台和運營團隊有能力用 CUElang 模板預先定義和/或修改這些抽象的行為,並確保它們滿足組織的安全性、遵從性和其他運營需求。
在下面,我們將更詳細地解釋上述 GitOps 工作流是如何工作的。
KubeVela 搭配 Argo CD
1. 先決條件
對於平台運營者來說,唯一的“技巧”是使 KubeVela 成為 Argo CD 的自定義插件,這樣它就能“理解”appfile 格式。
2. 注冊插件
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)"
3. 配置 argo-repo-server
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 資源中。
在 Argo CD 中使用 KubeVela
現在,作為應用程序開發人員,你可以通過 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 -
KubeVela 地址:
https://github.com/oam-dev/kubevela