总结:简介 我看了源码有一段时间了,但总感觉自己在迷宫里跑来跑去。 正当你以为自己终于找到了出路时,你可能会再次碰壁。 综上所述,我的内力还不够。 本文是对一项遗产的回顾,该遗产很快就会放弃初始化过程并清理可以被视为路标的数据结构,以帮助您在未来找到走出迷宫的路。 它的主要功能是提供访问。
简介
我看k8s源码有一段时间了,总感觉自己在做。 在迷宫里。 正当你以为自己终于找到了出路时,你可能会再次碰壁。 综上所述,我的内力还不够。 本文是关于 kube-apiserver 的。 检查旧版 API 的初始化过程(和数据结构)可以作为“路标”,帮助您在未来找到穿过“迷宫”的路。
kube- apiserver的主要功能是为客户端访问后端etcd存储提供API接口。 当然,这不仅仅是键/值存储。 为了促进可扩展性,kube-apiserver 设计了一个将“资源对象”映射到 RESTful API 的代码框架。
本文整理了kube-apiserver启动流程以及相关数据结构。
K8s 代码更新很快,本文基于 k8s 版本 -1.9.x 代码
p>数据结构
kube[ k4]apiserver启动流程相关(主要)数据结构
XXXOptions命令行参数相关类
XXXConfig相关类设置
XXXSServer kube[ k4]apiserver服务对象
XXXStorage资源对象(例如PosStorage)通过XXXStorage对后端存储(etcd)进行操作。
选项,Config 和 Server 对象之间的(粗略)关系:
创建(配置)选项对象 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重点关注存储相关的配置吧。 apiserver 访问后端 etcd 存储的方式与 kube- 密切相关。
EtcdOptions
StorageConfig 定义了 etcd 的详细配置,例如 etcd 版本、密钥的公共前缀等。
//kubernetes/vendor/k8s.io/apiserver/pkg/server/options/etcd.gotype EtcdOptions结构体{ StorageConfig storagebackend.Config EncryptionProviderConfigFilepath string ...}// kubernetes/vender/k8s.io/apiserver/storage/storagebackend/config.otype Config struct { // Type 定义存储后端的类型。 "etcd2", "etcd3 " Type string // Prefix 是传递给 storage.Interface 方法的所有键的前缀。 Prefix string // ServerList是要连接的存储服务器列表...}
创建
使用《Factory Method》NewEtcdOptions创建EtcdOptions
/ / kubernetes/cmd/kube-apiserver/app/options/options.gofunc NewServerRunOptions() *ServerRunOptions { s := ServerRunOptions { .. . Etcd: genericoptions.NewEtcdOptions( storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix , nil)) . .. }}
ApplyWithStorageFactoryTo
EtcdOptions 初始化server.Config(服务配置类,见下文)中的RESTOptionsGetter属性,用于创建etcd后端存储(见下文),其中有一个非常重要的方法applyWithStorageFactoryTo。用于
// kubernetes/vendor/k8s.io/apiserver/pkg/server/options/etcd.gofunc (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")
server.Config
Config 是用于配置 GenericAPIServer 的结构体。
server.Config 类用于配置和创建 GenericAPIServer(见下文)。
// kubernetes/vender/k8s.io/apiserver/pkg /server/config .gotype Config struct { ... // 这个字段非常重要重要,请标记RESTOptionsGetter。 通用Registry.RESTOptionsGetter ...}
创建
“工厂方法”NewConfig创建一个server.Config实例。 此方法仅将一些字段分配给 server.Config。 一些默认值,“构建方法”BuildGenericConfig 初始化剩余字段
func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transport) (...) { //“工厂方法” genericConfig := genericapiserver.NewConfig(legacy Skill.Codecs) ... // 将 ServerRunOptions.SecureServing 应用于 server.Config if err := s.SecureServing.ApplyTo(genericConfig); err 1= .. }}方法体有许多ApplyTo函数调用,它们基本上将ServerRunOptions的字段“应用”到server.Config。
GenericAPIServerGenericAPIServer 包含 Kubernetes 集群 API 服务器的状态
GenericAPIServer 结构包含服务器的“通用”状态(字段),通常嵌入在 a 中。特定服务器(主服务器、APIAggregator.etc)。 ) 作为一个字段。 你可以将 GenericAPIServer 视为您的基类。type GenericAPIServer struct { ...}Master
Master 包含 Kubernetes 集群 master/API 服务器的状态
Master 结构体包含一个参考 GenericAPIServer。 下面介绍的其他几个结构也有类似的结构。type Master struct { GenericAPIServer *genericapiserver.GenericAPIServer ClientCARegistrationHook ClientCARegistrationHook}APIAggregator
APIAggregator 包含 APIAggregator 的状态。 Kubernetes集群master/API server
type APIAggregator struct { GenericAPIServer *genericapiserver.GenericAPIServer ...}kube[k4 ]apiserver启动流程
kube[ k4 ]apiserver 条目位于 kubernetes/cmd/kube-apiserver/apiserver.go
PS:可以通过以下命令构建(多频段)kube-apiserver
。
# import GOPATH=/opt/kubernetes-src/# cd $GOPATH/src/k8s.io/kubernetes# make WHAT=cmd/kube-apiserver all// kubernetes/cmd/kube-apiserver/apiserver.goimport( ... "k8s.io.kubernetes/cmd/kube-apiserver/app " ...)func main() { rand.Seed(time.Now().UTC().UnixNano()) // 解析命令行参数 s := options.NewServerRunOptions() s.AddFlags(pflag .CommandLine) flag.InitFlags() // 初始化日志logs.InitLogs() deferlogs.FlushLogs() ... stopCh := server.SetupSignalHandler() if err := app.Run(s, stopCh); .FPrintf(os.Stderr, "%v", err) os.Exit(1) }}main函数只是一个shell。 解析完命令行参数后,调用应用程序包的Run函数。
// kubernetes/cmd/kube-apiserver/app.server.gofunc Run(runOptions *options.ServerRunOptions, stopCh <-chan struct{}) error { ... 服务器,错误:= CreateServerChain(runOptions, stopCh) if err != nil{ return err } return server.PrepareRun().Run(stopCh)}CreateServerChain 函数使用“责任链”模型。 多台服务器形成一条链,紧密相连,为客户端提供RESTful API服务。
评论前必须登录!
注册