摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數據結構的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接
前言
看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對 kube-apiserver Legacy(遺留,即將廢棄)API 初始化流程(以及數據結構)的一個梳理,算是做個"路標",便于以后在"迷宮"中還能找到回來的路
kube-apiserver 主要功能是提供 api 接口給客戶端訪問 后端 etcd 存儲,當然這中間不光是簡單的 key/value 存儲,為了方便擴展,kube-apiserver 設計了一套代碼框架將 "資源對象" 映射到 RESTful API
本文梳理了一下 kube-apiserver 啟動流程和相關數據結構
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 類封裝了 kube-apiserver 命令行參數,這些參數按照不同的類別進行分組
// kubernetes/cmd/kube-apiserver/app/options/options.go import ( ... 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 存儲密切相關
EtcdOptionsStorageConfig 定義了 etcd 詳細配置,比如 etcd 版本,key 公共前綴等
// kubernetes/vendor/k8s.io/apiserver/pkg/server/options/etcd.go type EtcdOptions struct { StorageConfig storagebackend.Config EncryptionProviderConfigFilepath string ... } // kubernetes/vender/k8s.io/apiserver/storage/storagebackend/config.o type 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 ... }創建
《工廠方法》NewEtcdOptions 用于創建 EtcdOptions
// kubernetes/cmd/kube-apiserver/app/options/options.go func 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.go const ( DefaultEtcdPathPrefix = "/registry" )server.Config
Config is a structure used to configure a GenericAPIServer
server.Config 類用于配置和創建 GenericAPIServer(見下文)
// kubernetes/vender/k8s.io/apiserver/pkg/server/config.go type Config struct { ... // 這個字段很重要,標記一下 RESTOptionsGetter generic registry.RESTOptionsGetter ... }創建
《工廠方法》NewConfig 創建 server.Config 實例,該方法只是給 server.Config 的一些字段賦予一些默認值,《構建方法》BuildGenericConfig 對剩余的字段進行初始化
func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transport) (...) { //《工廠方法》 genericConfig := genericapiserver.NewConfig(legacy scheme.Codecs) ... // 將 ServerRunOptions.SecureServing "應用" 到 server.Config if err := s.SecureServing.ApplyTo(genericConfig); err 1= nil { ... } }
方法體中還有很多 ApplyTo 函數調用,基本都是將 ServerRunOptions 中的字段 "應用" 到 server.Config
GenericAPIServerGenericAPIServer contains state for a Kubernetes cluster api server
GenericAPIServer 結構體包含 server "通用" 的狀態(字段),一般做為字段內嵌在具體 server(Master, APIAggregator .etc)中,可以把 GenericAPIServer 看作一個基類
type GenericAPIServer struct { ... }Master
Master contains state for a Kubernetes cluster master/api server
Master 結構體包含 GenericAPIServer 的引用,下面將要介紹的幾個其它的結構體也都具有類似的結構
type Master struct { GenericAPIServer *genericapiserver.GenericAPIServer ClientCARegistrationHook ClientCARegistrationHook }APIAggregator
APIAggregator contains state for a Kubernetes cluster master/api server
type APIAggregator struct { GenericAPIServer *genericapiserver.GenericAPIServer ... }kube-apiserver 啟動流程
kube-apiserver 入口在 kubernetes/cmd/kube-apiserver/apiserver.go
PS:通過以下命令可以(多帶帶)構建 kube-apiserver
# export GOPATH=/opt/kubernetes-src/ # cd $GOPATH/src/k8s.io/kubernetes # make WHAT=cmd/kube-apiserver all
// kubernetes/cmd/kube-apiserver/apiserver.go import( ... "k8s.io.kubernetes/cmd/kube-apiserver/app" ... ) func 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 ", err) os.Exit(1) } }
main 函數只是個殼子,解析完命令行參數后會調用 app 包中的 Run 函數
// kubernetes/cmd/kube-apiserver/app.server.go func 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 組成一個鏈條,緊密相連,給客戶端提供 RESTful API 服務
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33052.html
摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數據結構的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對 kube-...
摘要:前言文章字數一多,在線編輯不方便,本文是啟動流程的第部分傳送門啟動流程回顧上回講到方法目前系統中有以下每個都對應一個配置的任務就是根據創建,然后再用創建,各個通過的字段組成責任鏈以創建為例下面將簡要介紹的創建過程,主要分析是如 前言 文章字數一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動流程的第2部分傳送門:k8s :kube-apiserver 啟動流程 -...
摘要:前言文章字數一多,在線編輯不方便,本文是啟動流程的第部分傳送門啟動流程回顧上回講到方法目前系統中有以下每個都對應一個配置的任務就是根據創建,然后再用創建,各個通過的字段組成責任鏈以創建為例下面將簡要介紹的創建過程,主要分析是如 前言 文章字數一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動流程的第2部分傳送門:k8s :kube-apiserver 啟動流程 -...
摘要:年初開始研究,至目前已發表近篇學習筆記。同時,他也是中國社區的活躍者,見證了中國社區的一路成長。經本人授權,從本周開始,中國將轉載他的學習筆記,由淺入深地分享他在學習過程中的收獲。節點包含的組件目前這三個組件需要部署在同一臺機器上。 作者:宋凈超 宋凈超(Jimmy Song),TalkingData 容器技術負責人,微服務和云原生應用布道者。2017 年初開始研究 Kubernete...
摘要:問題是不是定義的一個的容器集群是只部署在同一個主機上楊樂到目前是,同一個里的是部署在同一臺主機的。問題這個圖里的是安裝在哪里的所有的客戶端以及會連接這個嘛楊樂可以任意地方,只要能訪問到集群,會作為的出口。 kubernetes1.0剛剛發布,開源社區400多位貢獻者一年的努力,多達14000多次的代碼提交,最終達到了之前預計的milestone, 并意味著這個開源容器編排系統可以正式在...
閱讀 2320·2021-11-24 10:33
閱讀 1387·2019-08-30 15:43
閱讀 3279·2019-08-29 17:24
閱讀 3487·2019-08-29 14:21
閱讀 2226·2019-08-29 13:59
閱讀 1740·2019-08-29 11:12
閱讀 2815·2019-08-28 18:00
閱讀 1854·2019-08-26 12:17