K8S-APIServer源码分析组件构成、原理、程序流程

本文详细分析了 Kubernetes APIServer 的组件构成,包括 AggregatorServer、APIServer 和 APIExtensionServer,阐述它们在请求处理和服务发现中的角色。接着,通过源码探讨了 APIServer 的启动流程,特别是资源路由和 handler 处理逻辑的绑定。最后,概述了客户端如何与 APIServer 进行交互的流程。
摘要由CSDN通过智能技术生成

一、组件构成

apiserver 由 3 个组件构成(AggregatorServer、APIServer、APIExtensionServer)

AggregatorServer:实现请求的代理转发,将来自用户的请求拦截转发给其他服务器,并且负责整个 APIServer 的服务发现功能

APIServer:负责对内建资源对象请求的一些处理,包括认证、鉴权等,以及处理各个内建资源的 REST 服务

APIExtensionServer:主要处理自定义资源对象(CR、CRD)的请求

二、程序流程源码分析

在这里插入图片描述
入口函数

//cmd/kube-apiserver/app/server.go
func Run(completeOptions completedServerRunOptions, stopCh <-chan struct{
   }) error {
   
	// 完成 server 初始化
	server, err := CreateServerChain(completeOptions, stopCh)
	if err != nil {
   
		return err
	}
    //PrepareRun:运行前准备(健康检查、存活检查和OpenAPI路由的注册)
    //Run:启动安全的http server提供服务
	return server.PrepareRun().Run(stopCh)
}

CreateServerChain

//cmd/kube-apiserver/app/server.go
func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan struct{
   }) (*genericapiserver.GenericAPIServer, error) {
   
	nodeTunneler, proxyTransport, err := CreateNodeDialer(completedOptions)
	if err != nil {
   
		return nil, err
	}

	kubeAPIServerConfig, sharedInformers, versionedInformers, insecureServingOptions, serviceResolver, pluginInitializer, admissionPostStartHook, err := 
	//创建 KubeAPIServer 所需要的配置(apiServer启动参数配置、分配service的ip、初始化认证授权配置)
	CreateKubeAPIServerConfig(completedOptions, nodeTunneler, proxyTransport)
	if err != nil {
   
		return nil, err
	}

	// 判断是否启用了扩展的apiServer ,调用createAPIExtensionsConfig加载扩展apiServer的配置
	apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, versionedInformers, pluginInitializer, completedOptions.ServerRunOptions, completedOptions.MasterCount)
	if err != nil {
   
		return nil, err
	}
	//创建 apiExtensionsServer 实例
	apiExtensionsServer, err := createAPIExtensionsServer(apiExtensionsConfig, genericapiserver.NewEmptyDelegate())
	if err != nil {
   
		return nil, err
	}
    // 创建 kubeAPIServer 实例
	kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, apiExtensionsServer.GenericAPIServer, sharedInformers, versionedInformers, admissionPostStartHook)
	if err != nil {
   
		return nil, err
	}
	
	kubeAPIServer.GenericAPIServer.PrepareRun()

	apiExtensionsServer.GenericAPIServer.PrepareRun()

	aggregatorConfig, err := createAggregatorConfig(*kubeAPIServerConfig.GenericConfig, completedOptions.ServerRunOptions, versionedInformers, serviceResolver, proxyTransport, pluginInitializer)
	if err != nil {
   
		return nil, err
	}
	aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, apiExtensionsServer.Informers)
	if err != nil {
   
		return nil, err
	}

	if insecureServingOptions != nil {
   
		insecureHandlerChain := kubeserver.BuildInsecureHandlerChain(aggregatorServer.GenericAPIServer.UnprotectedHandler(), kubeAPIServerConfig.GenericConfig)
		if err := kubeserver.NonBlockingRun(insecureServingOptions, insecureHandlerChain, kubeAPIServerConfig.GenericConfig.RequestTimeout, stopCh); err != nil {
   
			return nil, err
		}
	}

	return aggregatorServer.GenericAPIServer, nil
}

InstallLegacyAPI

//pkg/master/master.go
func (m *Master) InstallLegacyAPI(......) error {
   
    //NewLegacyRESTStorage创建多种资源的 Storage对象
    legacyRESTStorage, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(restOptionsGetter)
    if err != nil {
   
        return fmt.Errorf("Error building core storage: %v", err)
    }
    ......

    if err := m.GenericAPIServer.InstallLegacyAPIGroup(genericapiserver.DefaultLegacyAPIPrefix, &apiGroupInfo); err != nil {
   
        return fmt.Errorf("Error in registering group versions: %v", err)
    }
    return nil
}

通过NewLegacyRESTStorage创建了多种资源的 Storage对象(pod、secret等),Storage保存了资源对象的基本字段信息,也就是apiServer和etcd交互的资源对象数据类型。

//pkg/registry/core/rest/storage_core.go
func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(restOptionsGetter generic.RESTOptionsGetter) (LegacyRESTStorage, genericapiserver.APIGroupInfo, error) {
   
	apiGroupInfo := genericapiserver.APIGroupInfo{
   
		PrioritizedVersions:          legacyscheme.Scheme.PrioritizedVersionsForGroup(""),
		VersionedResourcesStorageMap: map[string]map[string]rest.Storage{
   },
		Scheme:               legacyscheme.Scheme,
		ParameterCodec:       legacyscheme.ParameterCodec,
		NegotiatedSerializer: legacyscheme.Codecs,
	}

	var podDisrup
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值