k8s :kube-apiserver Legacy API 初始化

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前言

看 k8s 原始碼有一段時間,總感覺在迷宮裡亂竄,有時候覺得終於找到出口了,一下子又撞牆了,總結下來還是自己的內功不夠深厚,本文是對 kube-apiserver Legacy(遺留,即將廢棄)API 初始化流程(以及資料結構)的一個梳理,算是做個"路標",便於以後在"迷宮"中還能找到回來的路

kube-apiserver 主要功能是提供 api 介面給用戶端訪問 後端 etcd 儲存,當然這中間不光是簡單的 key/value 儲存,為了方便擴充,kube-apiserver 設計了一套代碼架構將 "資來源物件" 映射到 RESTful API

本文梳理了一下 legacy api 即 /api 打頭的那些 api 初始化流程及相關的資料結構

k8s 代碼更新比較快,本文基於 k8s release-1.9.x 代碼

資料結構

kube-apiserver 啟動流程相關的(主要)資料結構

  • XXXOptions 命令列參數相關的類
  • XXXConfig 配置相關的類
  • XXXServer kube-apiserver 服務物件
  • XXXStorage 資來源物件,比如 PosStorage,通過 XXXStorage 操作後端儲存(etcd)

Options,Config 和 Server 對象的(大致)關係:
由 Options 對象建立 Config 對象,然後由 Config 對象建立 Server 對象

ServerRunOptions

ServerRunOptions 類封裝了 kube-apiserver 命令列參數,這些參數按照不同的類別進行分組

// kubernetes/cmd/kube-apiserver/app/options/options.goimport (    ...    genericoptions "k8s.io/apiserver/pkg/server/options"    ...)type ServerRunOptions struct {    GenericServerRunOptions *genericoptions.ServerRunOptions    Etcd                    *genericoptions.EtcdOptions    SecureServing           *genericoptions.SecureServingOptions    InsecureServing         *kubeoptions.InsecureServingOptions    ...}

我們重點看看 EtcdOptions,etcd 儲存相關的配置,它和 kube-apiserver 如何訪問後端 etcd 儲存密切相關

EtcdOptions

StorageConfig 定義了 etcd 詳細配置,比如 etcd 版本,key 公用首碼等

// kubernetes/vendor/k8s.io/apiserver/pkg/server/options/etcd.gotype EtcdOptions struct {    StorageConfig storagebackend.Config    EncryptionProviderConfigFilepath string    ...}// kubernetes/vender/k8s.io/apiserver/storage/storagebackend/config.otype Config struct {    // Type defines the type of storage backend, e.g. "etcd2", "etcd3"    Type string    // Prefix is the prefix to all keys passed to storage.Interface methods.    Prefix string    // ServerList is the list of storage servers to connect with    ...}

建立

Factory 方法 NewEtcdOptions 用於建立 EtcdOptions

// kubernetes/cmd/kube-apiserver/app/options/options.gofunc NewServerRunOptions() *ServerRunOptions {    s := ServerRunOptions {        ...        Etcd: genericoptions.NewEtcdOptions(            storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix, nil))        ...    }}

ApplyWithStorageFactoryTo

EtcdOptions 有一個重要方法 ApplyWithStorageFactoryTo 用於初始化 server.Config(服務配置類,見下文)的 RESTOptionsGetter 屬性,該屬性用於建立 etcd 後端儲存(見下文)

// kubernetes/vendor/k8s.io/apiserver/pkg/server/options/etcd.go
func (s *EtcdOptions) ApplyWithStorageFactoryTo(

factory server storage.StorageFactory, c *server.Config) error {s.RESTOptionsGetter = &storageFactoryRestOptionsFactory{    Options: *s,    StorageFactory: factory}

}

// kubernetes/pkg/kubeapiserver/options/storage_versions.goconst (    DefaultEtcdPathPrefix = "/registry")

GenericAPIServer

GenericAPIServer contains state for a Kubernetes cluster api server

type GenericAPIServer struct {    ...}

Master

Master contains state for a Kubernetes cluster master/api server

type Master struct {    GenericAPIServer *genericapiserver.GenericAPIServer    ClientCARegistrationHook ClientCARegistrationHook}

流程

每個 k8s 服務或公用程式在 kubernetes/cmd 目錄下都有一個對應的檔案夾,裡面放著這些服務或公用程式的入口,順便提一下,通過一下命令可以單獨構建 kube-apiserver

# export GOPATH=/opt/kubernetes-src/# cd $GOPATH/src/k8s.io/kubernetes# make WHAT=cmd/kube-apiserver all

kube-apiserver 的入口(main 函數,main package)

// kubernetes/cmd/kube-apiserver/apiserver.gofunc main() {    rand.Seed(time.Now().UTC().UnixNano())    // 解析命令列參數    s := options.NewServerRunOptions()    s.AddFlags(pflag.CommandLine)    flag.InitFlags()    // 初始化 log    logs.InitLogs()    defer logs.FlushLogs()    ...    stopCh := server.SetupSignalHandler()    if err := app.Run(s, stopCh); err != nil {        fmt.FPrintf(os.Stderr, "%v\n", err)        os.Exit(1)    }}

main 函數只是個殼子,解析完命令列參數後會調用 app 包中的 Run 函數

// kubernetes/cmd/kube-apiserver/app.server.gofunc Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error {    ...    server, err := CreateServerChain(runOptions, stopCh)    if err != nil {        return err    }    return server.PrepareRun().Run(stopCh)}

CreateServerChain 函數使用了《責任鏈》設計模式,多個 Server 組成一個 List 處理用戶端請求,Run 函數最後調用 server 的 PrepareRun 和 Run 方法啟動 kube-apiserver 服務

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.