资讯专栏INFORMATION COLUMN

k8s :kube-apiserver 启动流程 - 1

RayKr / 2496人阅读

摘要:前言看源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对遗留,即将废弃初始化流程以及数据结构的一个梳理,算是做个路标,便于以后在迷宫中还能找到回来的路主要功能是提供接

前言

看 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

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 存储密切相关

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
    ...
}
创建

《工厂方法》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

GenericAPIServer

GenericAPIServer 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 服务

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32644.html

相关文章

  • k8skube-apiserver 启动流程 - 1

    摘要:前言看源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对遗留,即将废弃初始化流程以及数据结构的一个梳理,算是做个路标,便于以后在迷宫中还能找到回来的路主要功能是提供接 前言 看 k8s 源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对 kube-...

    wwolf 评论0 收藏0
  • k8skube-apiserver 启动流程 - 2

    摘要:前言文章字数一多,在线编辑不方便,本文是启动流程的第部分传送门启动流程回顾上回讲到方法目前系统中有以下每个都对应一个配置的任务就是根据创建,然后再用创建,各个通过的字段组成责任链以创建为例下面将简要介绍的创建过程,主要分析是如 前言 文章字数一多,在线编辑不方便,本文是 k8s:kube-apiserver 启动流程的第2部分传送门:k8s :kube-apiserver 启动流程 -...

    xiangzhihong 评论0 收藏0
  • k8skube-apiserver 启动流程 - 2

    摘要:前言文章字数一多,在线编辑不方便,本文是启动流程的第部分传送门启动流程回顾上回讲到方法目前系统中有以下每个都对应一个配置的任务就是根据创建,然后再用创建,各个通过的字段组成责任链以创建为例下面将简要介绍的创建过程,主要分析是如 前言 文章字数一多,在线编辑不方便,本文是 k8s:kube-apiserver 启动流程的第2部分传送门:k8s :kube-apiserver 启动流程 -...

    2450184176 评论0 收藏0
  • K8S学习笔记 | 如何部署 Kubernetes master 节点

    摘要:年初开始研究,至目前已发表近篇学习笔记。同时,他也是中国社区的活跃者,见证了中国社区的一路成长。经本人授权,从本周开始,中国将转载他的学习笔记,由浅入深地分享他在学习过程中的收获。节点包含的组件目前这三个组件需要部署在同一台机器上。 作者:宋净超 宋净超(Jimmy Song),TalkingData 容器技术负责人,微服务和云原生应用布道者。2017 年初开始研究 Kubernete...

    ernest.wang 评论0 收藏0
  • Kubernetes v1.0特性解析

    摘要:问题是不是定义的一个的容器集群是只部署在同一个主机上杨乐到目前是,同一个里的是部署在同一台主机的。问题这个图里的是安装在哪里的所有的客户端以及会连接这个嘛杨乐可以任意地方,只要能访问到集群,会作为的出口。 kubernetes1.0刚刚发布,开源社区400多位贡献者一年的努力,多达14000多次的代码提交,最终达到了之前预计的milestone, 并意味着这个开源容器编排系统可以正式在...

    HackerShell 评论0 收藏0

发表评论

0条评论

RayKr

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<