多云容器編排 Karmada-Operator 實踐( 二 )

  • 需要支持第三方的vip給Karmada-apiserver提供負載均衡,目前vivo都是基于外部vip,并提供了域名 。沒有使用K8s的service給Karmada-apiserver提供負載均衡 。
  • Karmada控制平面一鍵部署和member集群的自動化注冊和注銷 。也需要獲取member集群的kubeconfig,pull模式也需要在member集群部署Karmada-agent 。
  • Karmada集群的addons插件安裝,如istio、anp、第三方的crd等安裝,需要在Karmada的控制平面、host主機集群,甚至需要在member集群上進行配置 。
  • 提供api能力,實現可視化部署 。
  • 針對Karmada單個組件的單獨升級和全量升級 。
  • 支持在offline和離線模式 。
  • 面對Karmada如此復雜的條件限制,我們再來分析下上面3個方案誰可能比較合適 。
    方案一,基于go開發的Operator,比較適合基于K8s集群的有狀態服務管理 , 如etcd,數據庫等,比較成熟的有etcd-Operator 。Karmada涉及到不依賴K8s集群二進制部署、外部etcd、member集群的注冊、注銷和插件安裝,不能很好的支持或者需要增加開發量 。
    方案二 , 基于ansible開發的Operator,既可以基于K8s集群的對狀態服務管理,也可以脫離K8s集群對如不依賴K8s集群二進制部署、外部etcd、member集群的注冊、注銷和插件安裝 。這里主要通過ansible 的ssh登錄能力和K8s模塊管理,通過調研我們也發現90%以上的用戶可以提供ssh登錄 。
    方案三,基于go+ansible的混合的Operator,讀者可以閱讀vivo開發的Kubernetes-Operator,就是基于這種方案 。方案三具備方案二的所有能力,因為底層都是通過ansible去執行 。
    首先我們排除了方案一,對于方案二和方案三 , 本人也糾結了很長是時間 , 最終我們選擇了方案二 。主要原因如下:
    1. Operator SDK ansible已具備了和Operator SDK go相等的能力,并提供K8s、K8s_status模塊、相似的webhook功能去對k8s的資源管理,以及reconciliation的能力 。
    2. 符合目前Karmada實際生產部署的需求 。
    3. 簡單易學 , 只要知道ansbile的jinja模版、和K8s相同的yaml文件 。你只需要編寫ansible task,開箱即用,reconciliation由Operator SDK 解決 。
    4. 對于常用ansible的人比較友好,不需要寫golang代碼 。
    5. 擴展能力強 , 用戶可自定義插件 。管理端也支持local、ssh、zeromq三種方式連接 。local模式可以直接對接K8s接口 , ssh模式可以登錄執行腳本 ??梢院芎玫幕旌鲜褂茫鉀Q我們當前的需求 。
    6. Karmada運維操作相對K8s要簡單,不需要復雜的crd定義,ansible需要解析少量vars去執行playbook就行 。golang+ansible模式比較適合復雜CRD定義和業務邏輯復雜的系統 。
    2.3 API設計
    多云容器編排 Karmada-Operator 實踐

    文章插圖
    如上圖所示,我們只需要執行Operator-SDK create api命令,就可以創建 KarmadaDeployment的CRD,然后就可以定義KarmadaDeployment的API 。在watches.yaml里實現Reconcile的業務邏輯 。
    多云容器編排 Karmada-Operator 實踐

    文章插圖
    這里主要定義KarmadaDeployment、EtcdBackup和EtcdRestore個資源 , 分別用于Karmada的部署,和etcd的數據備份和恢復 。ansible Operator會根據spec里定義解析成ansible的vars 。status將通過 ansible runner 輸出為用戶自定義的狀態 。也可以通過ansible的k8s_status更新KarmadaDeployment的狀態 。當前主要考慮的是在K8s運行Karmada , 后面會添加二進制部署模式,當前的CR沒有涉及 。
    2.4 架構設計
    多云容器編排 Karmada-Operator 實踐

    文章插圖
    如圖所示Karmada Operator提供了容器化和二進制集群部署設計,其中Karmada的容器化部署不需要執行ssh登錄,只需通過K8s和k8s_status就可以完成karmada控制面的管控 。Karmada的二進制部署主要通過ssh登錄完成Karmada控制平面的管控 。member集群的join和unjoin需要提前提供member集群的kubeconfig文件 , 也可以設置member的登錄權限操作,需要在CR里定義member集群的用戶和密鑰 。
    執行流程如下 。
    1. 用戶通過KarmadaDeployment定義Karmada操作
    2. Karmada Operator感知KarmadaDeployment的CR變化,開始進入控制器邏輯
    3. 根據用戶的定義,選擇是容器化部署或者二進制部署,開始執行安裝、擴所容和備份等操作
    4. 執行join/unjoin操作,將member集群注冊到Karmada集群或者注銷member集群
    2.5 Karmada控制平面管理

    推薦閱讀