溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

構(gòu)建API Server的詳細步驟

發(fā)布時間:2021-09-09 13:39:29 來源:億速云 閱讀:209 作者:chen 欄目:云計算

本篇內(nèi)容介紹了“構(gòu)建API Server的詳細步驟”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

API Server利用GenericAPIServer框架依次創(chuàng)建了api_extension_server\api_server\aggregator_server來處理所有請求,server構(gòu)建的核心邏輯如下:

func CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) (*genericapiserver.GenericAPIServer, error) {

   // api server的config結(jié)構(gòu)

   kubeAPIServerConfig, sharedInformers, versionedInformers, insecureServingOptions, serviceResolver, err := CreateKubeAPIServerConfig(runOptions, nodeTunneler, proxyTransport)

   if err != nil {

      return nil, err

   }

 

   // extension server的config結(jié)構(gòu)

   apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, versionedInformers, runOptions)

   if err != nil {

      return nil, err

   }

 

   // 1. 創(chuàng)建api extensions server

   apiExtensionsServer, err := createAPIExtensionsServer(apiExtensionsConfig, genericapiserver.EmptyDelegate)

   if err != nil {

      return nil, err

   }

 

   // 2. 創(chuàng)建api server,delegate到extensions server上(注意,第二個參數(shù))

   kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, apiExtensionsServer.GenericAPIServer, sharedInformers, versionedInformers)

   if err != nil {

      return nil, err

   }

 

   .....

 

   // otherwise go down the normal path of standing the aggregator up in front of the API server

   // this wires up openapi

   kubeAPIServer.GenericAPIServer.PrepareRun()

 

   // This will wire up openapi for extension api server

   apiExtensionsServer.GenericAPIServer.PrepareRun()

 

   ....

   // 3. 創(chuàng)建aggregator server, delegate到api server上

   aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, apiExtensionsServer.Informers)

   if err != nil {

      // we don't need special handling for innerStopCh because the aggregator server doesn't create any go routines

      return nil, err

   }

 

   ....

   return aggregatorServer.GenericAPIServer, nil

}

當中,三個server創(chuàng)建的過程大體類似。以下是API Server創(chuàng)建方法CreateKubeAPIServer的核心邏輯:

func CreateKubeAPIServer(kubeAPIServerConfig *master.Config, delegateAPIServer genericapiserver.DelegationTarget, sharedInformers informers.SharedInformerFactory, versionedInformers clientgoinformers.SharedInformerFactory) (*master.Master, error) {

   kubeAPIServer, err := kubeAPIServerConfig.Complete(versionedInformers).New(delegateAPIServer)

   if err != nil {

      return nil, err

   }

   kubeAPIServer.GenericAPIServer.AddPostStartHook("start-kube-apiserver-informers", func(context genericapiserver.PostStartHookContext) error {

      sharedInformers.Start(context.StopCh)

      return nil

   })

 

   return kubeAPIServer, nil

}

 

// kubeAPIServerConfig.Complete(versionedInformers).New(delegateAPIServer)中的New方法如下所示:

func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*Master, error) {

   ...

 

   // 通過Config創(chuàng)建APIServer對應(yīng)的GenericAPIServer對象

   s, err := c.GenericConfig.New("kube-apiserver", delegationTarget)

   if err != nil {

      return nil, err

   }

 

   ....

   m := &Master{

      GenericAPIServer: s,

   }

 

   // 將所有REST資源(Pods/Deployments)的Storage接口實現(xiàn)類都install到master內(nèi)含的GenericAPIServer上

   restStorageProviders := []RESTStorageProvider{

      authenticationrest.RESTStorageProvider{Authenticator: c.GenericConfig.Authenticator},

      authorizationrest.RESTStorageProvider{Authorizer: c.GenericConfig.Authorizer, RuleResolver: c.GenericConfig.RuleResolver},

      autoscalingrest.RESTStorageProvider{},

      batchrest.RESTStorageProvider{},

      certificatesrest.RESTStorageProvider{},

      extensionsrest.RESTStorageProvider{},

      networkingrest.RESTStorageProvider{},

      policyrest.RESTStorageProvider{},

      rbacrest.RESTStorageProvider{Authorizer: c.GenericConfig.Authorizer},

      schedulingrest.RESTStorageProvider{},

      settingsrest.RESTStorageProvider{},

      storagerest.RESTStorageProvider{},

      // keep apps after extensions so legacy clients resolve the extensions versions of shared resource names.

      // See https://github.com/kubernetes/kubernetes/issues/42392

      appsrest.RESTStorageProvider{},

      admissionregistrationrest.RESTStorageProvider{},

   }

   m.InstallAPIs(c.ExtraConfig.APIResourceConfigSource, c.GenericConfig.RESTOptionsGetter, restStorageProviders...)

 

   ...

   return m, nil

}

經(jīng)過以上幾個步驟,API Server就完成了所有資源的install,可以開始監(jiān)聽并響應(yīng)請求。

“構(gòu)建API Server的詳細步驟”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI