国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

k8s :kube-apiserver 啟動流程 - 1

RayKr / 2528人閱讀

摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結(jié)下來還是自己的內(nèi)功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數(shù)據(jù)結(jié)構(gòu)的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接

前言

看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結(jié)下來還是自己的內(nèi)功不夠深厚,本文是對 kube-apiserver Legacy(遺留,即將廢棄)API 初始化流程(以及數(shù)據(jù)結(jié)構(gòu))的一個梳理,算是做個"路標",便于以后在"迷宮"中還能找到回來的路

kube-apiserver 主要功能是提供 api 接口給客戶端訪問 后端 etcd 存儲,當(dāng)然這中間不光是簡單的 key/value 存儲,為了方便擴展,kube-apiserver 設(shè)計了一套代碼框架將 "資源對象" 映射到 RESTful API

本文梳理了一下 kube-apiserver 啟動流程和相關(guān)數(shù)據(jù)結(jié)構(gòu)

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

數(shù)據(jù)結(jié)構(gòu)

kube-apiserver 啟動流程相關(guān)的(主要)數(shù)據(jù)結(jié)構(gòu)

XXXOptions 命令行參數(shù)相關(guān)的類

XXXConfig 配置相關(guān)的類

XXXServer kube-apiserver 服務(wù)對象

XXXStorage 資源對象,比如 PosStorage,通過 XXXStorage 操作后端存儲(etcd)

Options,Config 和 Server 對象的(大致)關(guān)系:
由 Options 對象創(chuàng)建(配置) Config 對象,然后由 Config 對象創(chuàng)建(配置) Server 對象

ServerRunOptions

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

// 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 存儲相關(guān)的配置,它和 kube-apiserver 如何訪問后端 etcd 存儲密切相關(guān)

EtcdOptions

StorageConfig 定義了 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
    ...
}
創(chuàng)建

《工廠方法》NewEtcdOptions 用于創(chuàng)建 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(服務(wù)配置類,見下文)的 RESTOptionsGetter 屬性,該屬性用于創(chuàng)建 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 類用于配置和創(chuàng)建 GenericAPIServer(見下文)

// kubernetes/vender/k8s.io/apiserver/pkg/server/config.go
type Config struct {
    ...
    // 這個字段很重要,標記一下
    RESTOptionsGetter generic registry.RESTOptionsGetter
    ...
}
創(chuàng)建

《工廠方法》NewConfig 創(chuàng)建 server.Config 實例,該方法只是給 server.Config 的一些字段賦予一些默認值,《構(gòu)建方法》BuildGenericConfig 對剩余的字段進行初始化

func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transport) (...) {
    //《工廠方法》
    genericConfig := genericapiserver.NewConfig(legacy scheme.Codecs)
    ...
    // 將 ServerRunOptions.SecureServing "應(yīng)用" 到 server.Config
    if err := s.SecureServing.ApplyTo(genericConfig); err 1= nil {
        ...
    }
}

方法體中還有很多 ApplyTo 函數(shù)調(diào)用,基本都是將 ServerRunOptions 中的字段 "應(yīng)用" 到 server.Config

GenericAPIServer

GenericAPIServer contains state for a Kubernetes cluster api server
GenericAPIServer 結(jié)構(gòu)體包含 server "通用" 的狀態(tài)(字段),一般做為字段內(nèi)嵌在具體 server(Master, APIAggregator .etc)中,可以把 GenericAPIServer 看作一個基類

type GenericAPIServer struct {
    ...
}
Master

Master contains state for a Kubernetes cluster master/api server
Master 結(jié)構(gòu)體包含 GenericAPIServer 的引用,下面將要介紹的幾個其它的結(jié)構(gòu)體也都具有類似的結(jié)構(gòu)

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:通過以下命令可以(多帶帶)構(gòu)建 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())

    // 解析命令行參數(shù)
    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 函數(shù)只是個殼子,解析完命令行參數(shù)后會調(diào)用 app 包中的 Run 函數(shù)

// 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 函數(shù)使用了《責(zé)任鏈》模式,多個 server 組成一個鏈條,緊密相連,給客戶端提供 RESTful API 服務(wù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/32644.html

相關(guān)文章

  • k8skube-apiserver 啟動流程 - 1

    摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結(jié)下來還是自己的內(nèi)功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數(shù)據(jù)結(jié)構(gòu)的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結(jié)下來還是自己的內(nèi)功不夠深厚,本文是對 kube-...

    wwolf 評論0 收藏0
  • k8skube-apiserver 啟動流程 - 2

    摘要:前言文章字數(shù)一多,在線編輯不方便,本文是啟動流程的第部分傳送門啟動流程回顧上回講到方法目前系統(tǒng)中有以下每個都對應(yīng)一個配置的任務(wù)就是根據(jù)創(chuàng)建,然后再用創(chuàng)建,各個通過的字段組成責(zé)任鏈以創(chuàng)建為例下面將簡要介紹的創(chuàng)建過程,主要分析是如 前言 文章字數(shù)一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動流程的第2部分傳送門:k8s :kube-apiserver 啟動流程 -...

    xiangzhihong 評論0 收藏0
  • k8skube-apiserver 啟動流程 - 2

    摘要:前言文章字數(shù)一多,在線編輯不方便,本文是啟動流程的第部分傳送門啟動流程回顧上回講到方法目前系統(tǒng)中有以下每個都對應(yīng)一個配置的任務(wù)就是根據(jù)創(chuàng)建,然后再用創(chuàng)建,各個通過的字段組成責(zé)任鏈以創(chuàng)建為例下面將簡要介紹的創(chuàng)建過程,主要分析是如 前言 文章字數(shù)一多,在線編輯不方便,本文是 k8s:kube-apiserver 啟動流程的第2部分傳送門:k8s :kube-apiserver 啟動流程 -...

    2450184176 評論0 收藏0
  • K8S學(xué)習(xí)筆記 | 如何部署 Kubernetes master 節(jié)點

    摘要:年初開始研究,至目前已發(fā)表近篇學(xué)習(xí)筆記。同時,他也是中國社區(qū)的活躍者,見證了中國社區(qū)的一路成長。經(jīng)本人授權(quán),從本周開始,中國將轉(zhuǎn)載他的學(xué)習(xí)筆記,由淺入深地分享他在學(xué)習(xí)過程中的收獲。節(jié)點包含的組件目前這三個組件需要部署在同一臺機器上。 作者:宋凈超 宋凈超(Jimmy Song),TalkingData 容器技術(shù)負責(zé)人,微服務(wù)和云原生應(yīng)用布道者。2017 年初開始研究 Kubernete...

    ernest.wang 評論0 收藏0
  • Kubernetes v1.0特性解析

    摘要:問題是不是定義的一個的容器集群是只部署在同一個主機上楊樂到目前是,同一個里的是部署在同一臺主機的。問題這個圖里的是安裝在哪里的所有的客戶端以及會連接這個嘛楊樂可以任意地方,只要能訪問到集群,會作為的出口。 kubernetes1.0剛剛發(fā)布,開源社區(qū)400多位貢獻者一年的努力,多達14000多次的代碼提交,最終達到了之前預(yù)計的milestone, 并意味著這個開源容器編排系統(tǒng)可以正式在...

    HackerShell 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<