天天看點

Istio pilot啟動過程淺談

一、func(s*Server)initKubeClient(args*PilotArgs)error{ 45個k8s api k8s的28個特征功能 core接口包括對16種資源的控制;

1、服務發現的注冊中心一定要包含K8s;

2、可以通過動态監控目錄中yaml檔案的變化,感覺配置及服務的變化,用于測試;

3、預設pilot運作在k8s的pod上,可以通過環境變量中的host:port建立K8s rest用戶端;

二、func(s*Server)initClusterRegistries(args*PilotArgs)(errerror){

1、通過本地環境的k8s用戶端讀取指定的明文ConfigMap資料;

2、循環解析明文的ConfigMap配置擷取secret密文的配置資訊;

3、将密文資訊最後解析為遠端k8s叢集的連結配置資訊;

4、最後儲存遠端k8s叢集連結配置,及pilot運作的k8s叢集中secret配置資訊;

三、func(s*Server)initMesh(args*PilotArgs)error{

1、初始化網格全局配置,通過入參配置資訊設定;

2、如果入參MeshConfig為null,通過配置檔案加載;

3、如果還沒有,從目前k8s服務的ConfigMap中加載配置;

四、func(s*Server)initMixerSan(args*PilotArgs)error{

1、配置雙向認證機制

五、func(s*Server)initConfigController(args*PilotArgs)error{ Istio一共14總配置類型

1、通過啟動入參中的本地配置存儲控制器設定pilot服務中的配置控制器;

2、建立檔案目錄配置更新方式,定期拉的方式更新記憶體全量配置資訊;

3、建立Kube的配置資訊更新的k8s用戶端方案,按照Group+Version對14個配置項進行分組,建立k8s 通路API;

4、建立新的基本K8s用戶端,注冊所有14個配置項,并保證注冊成功;

5、基于k8s api建立informer機制,用于緩存CRD到本地Cache中,初始化時拉全量并注冊watch回調,保證緩存一緻;

6、同時向informer注冊add,update,delete函數用于處理CRD變更;

7、最後将通用的配置資訊做一層Istio配置資訊的轉化,既:Config轉化為14種配置;

六、func(s*Server)initServiceControllers(args*PilotArgs)error{

1、通過訂閱配置中的ServiceEntry CRD來進行服務及執行個體的發現,通過IstioConfigStore來擷取服務及執行個體

2、通過K8s訂閱service,endpoint,pod,node來擷取服務及執行個體資訊,方式與訂閱配置相同,通過informer方式;

3、通過Zk的方式更新服務及執行個體資訊;

七、func(s*Server)initDiscoveryService(args*PilotArgs)error{

1、建立http服務的DiscoveryService子產品,并注冊在service,serviceInstance,及Config變更時的更新所有服務發現cache的功能,包括V2版本的DiscoveryService中的緩存,及ADS,EDS全局變量中的緩存;

2、建立新版DiscoveryService子產品,并注冊grpc服務,已流式方式擷取服務資訊,并周期性能對注冊上來的Proxy服務推送變更資訊,為了方式并發量大,可以指定推送多少次後,sleep 100ms;

3、開始監聽所有的TCP端口,包括http,grpc的;

八、func(s*Server)initMonitor(args*PilotArgs)error{

1、建立一個監控服務,擷取pilot自身的監控資訊;

九、func(s*Server)initMultiClusterController(args*PilotArgs)(errerror){僅僅實作了k8s多叢集服務監控

1、訂閱目前k8s中secret資源類型資訊,根據之前initClusterRegistries擷取的叢集ClusterId,擷取其他k8s叢集Config資訊;

2、根據遠端k8s叢集Client通過informer訂閱service,endpoint,node,pod資訊,并加到聚合注冊中心控制器中;

3、同時訂閱服務,執行個體,配置變更事件,更新discoveryService緩存,下發所有連接配接的Proxy,實作多k8s叢集服務發現;

繼續閱讀