聊聊第三方注冊中心集成Istio
引言
公司往往有自己的注冊中心,有的使用Nacos、zookeeper等,還有自研的。這些在istio體系外的注冊中心需要融入網(wǎng)格體系,讓注冊中心以及配置中心事件通知到istio,進而通過istio下發(fā)到數(shù)據(jù)面去。
第三方注冊中心集成到istio通常有三種做法:
- 方式一 修改源碼實現(xiàn)serviceregistry.Instance接口適配到service controller
- 方式二 通過自定義MCP Server,例如:Nacos提供了這部分實現(xiàn)
- 方式三 將第三方注冊中心事件封裝成istio的ServiceEntry和WorkloadEntry資源寫入Kubernetes的api server
istiod收到監(jiān)聽后完成轉換
方式一需要修改istio源碼,重度耦合后續(xù)升級istio比較困難;方式二看著比較簡單卻調試比較困難給開發(fā)造成障礙;方式三從業(yè)界實踐來看采用的最為廣泛。
本文將分析第三種方式如何集成istio的,在此之前需要先走查下kubernetes的大體架構。
一、k8s架構簡述
架構與概念
kube-apiserver: 與Kubernetes資源交互的入口,可以通過kubectl或者client-go其他語言類庫進行訪問
kube-scheduler: 負責資源調度與計算,將Pod按照特定策略分發(fā)到計算節(jié)點
etcd: 鍵值存儲數(shù)據(jù)庫,保存Kubernetes集群相關數(shù)據(jù)
kube-controller-manager: 運行一系列列控制器的組件,比如:節(jié)點控制器、任務控制器、端點控制器等
kubelete: 運行在計算節(jié)點中,通過監(jiān)聽控制面接受指令,在節(jié)點內執(zhí)行操作
kube-proxy: 運行在計算節(jié)點的網(wǎng)絡代理,負責Pod內外的網(wǎng)絡通信代理
Pods創(chuàng)建流程
- 通過kubectl或者client-go類庫向kube-apiserver發(fā)起創(chuàng)建請求
- kube-apiserver將請求信息持久化在etcd數(shù)據(jù)庫
- kube-scheduler檢測到請求后,計算Pod應該分配到哪個Node,并將分配策略寫入etcd數(shù)據(jù)庫
- Kubelet檢測到etcd的分配策略后,執(zhí)行該策略調用docker相關api創(chuàng)建container
二、第三方注冊中心集成
架構圖
轉換流程:
從注冊中心(Zookeeper)獲取變更事件,將其轉換為ServiceEntry寫入kube-apiserver;Istiod(Pilot)通過監(jiān)聽kube-apiserver收到ServiceEntry后經(jīng)過轉換通過xDS下發(fā)給數(shù)據(jù)面。
代碼說明
直接去寫比較耗時,快速掌握的方式是參考別人已經(jīng)實現(xiàn)的,下面以社區(qū)項目dubbo2istio跟蹤其如何將zookeeper轉換的。
- https://github.com/aeraki-framework/dubbo2istio
另外,還用到了dubbo 示例中的dubbo-demo-api-provider,地址如下。
- https://github.com/apache/dubbo/tree/3.0/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider
分析過程為:
通過dubbo-demo-api-provider注冊節(jié)點到zookeeper注冊中心
通過跟蹤dubbo2istio代碼觀察其轉換邏輯并通過client-go類庫寫入kube-apiserver
通過相關命令驗證其的確已經(jīng)寫入到kube-apiserver
轉換分析
**@1 ** 運行服務提供者dubbo-demo-api-provider,讓其在注冊中心完成注冊。
@2 運行dubbo2istio跟蹤其邏輯
@3 獲取zookeeper注冊的節(jié)點將其轉換為ServiceEntry,轉換使用的類庫為「istio.io/client-go」
@4 將轉換好的注冊信息寫入kube-apiserver,寫入成功無錯誤返回
@5 再通過代碼查詢是否寫入成功,能夠查到說明寫入成功
@6 通過命令行查詢驗證是否寫入到kube-apiserver
登陸istiod容器
- kubectl -n istio-system exec -it istiod-56f8cc6cb5-xkg4m -- /bin/bash
通過registryz命令查看
- curl http://127.0.0.1:15014/debug/registryz
- [
- {
- "Attributes": {
- "ServiceRegistry": "External",
- "Name": "org.apache.dubbo.demo.demoservice",
- "Namespace": "dubbo",
- "Labels": {
- "manager": "aeraki",
- "registry": "dubbo2istio"
- },
- "UID": "",
- "ExportTo": null,
- "LabelSelectors": null,
- "ClusterExternalAddresses": null,
- "ClusterExternalPorts": null
- },
- "ports": [
- {
- "name": "tcp-dubbo",
- "port": 20880,
- "protocol": "TCP"
- }
- ],
- "creationTime": "2021-09-10T09:58:18Z",
- "hostname": "org.apache.dubbo.demo.demoservice",
- "address": "0.0.0.0",
- "autoAllocatedAddress": "240.240.0.5",
- "Mutex": {},
- "Resolution": 0,
- "MeshExternal": false
- },
- // ....
- ]
備注:可以在istio中查到服務提供者「org.apache.dubbo.demo.demoservice」即從zookeeper注冊中心成功將事件通過kube-apiserver通知到istio。
本文轉載自微信公眾號「瓜農(nóng)老梁」,可以通過以下二維碼關注。轉載本文請聯(lián)系瓜農(nóng)老梁公眾號。