Kube-apiserver源码分析-Handler链

本文深入分析了Kubernetes Kube-apiserver的启动入口,重点探讨了Handler链的工作原理。从启动时的GenericAPIServer.Handler开始,详细解释了Handler链的构造,包括如何通过DefaultBuildHandlerChain生成handler链,并介绍了Director如何处理REST请求分发。此外,还介绍了从WebService到RestStore的过程,以及DefaultBuildHandlerChain中各个Handler的具体作用,如 Panic恢复、Cache-Control设置、RequestInfo解析、流控等。
摘要由CSDN通过智能技术生成

1.启动入口

kube-apiserver启动入口在 cmd/kube-apiserver/app/server.go的Run()函数中:

// Run runs the specified APIServer.  This should never exit.
func Run(completeOptions completedServerRunOptions, stopCh <-chan struct{}) error {
   // To help debugging, immediately log version
   klog.Infof("Version: %+v", version.Get())

   server, err := CreateServerChain(completeOptions, stopCh)
   if err != nil {
      return err
   }

   prepared, err := server.PrepareRun()
   if err != nil {
      return err
   }

   return prepared.Run(stopCh)
}

 

prepared.Run(stopCh)中调用的staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go中的 func (s preparedGenericAPIServer) Run()函数,进而又调用func (s preparedGenericAPIServer) NonBlockingRun()函数。这个函数里面使用preparedGenericAPIServer.Handler启动了http server。这个Handler实现了http.Handler接口。后面分析handler内容。

// NonBlockingRun()函数部分代码
// Use an internal stop channel to allow cleanup of the listeners on error.
internalStopCh := make(chan struct{})
var stoppedCh <-chan struct{}
if s.SecureServingInfo != nil && s.Handler != nil {
   var err error
   stoppedCh, err = s.SecureServingInfo.Serve(s.Handler, s.ShutdownTimeout, internalStopCh)
   if err != nil {
      close(internalStopCh)
      close(auditStopCh)
      return err
   }
}

 

2. Handler链

上面提到的preparedGenericAPIServer.Handler实际是APIServerHandler,

// staging/src/k8s.io/apiserver/pkg/server/config.go
func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*GenericAPIServer, error) {
    // ...
    handlerChainBuilder := func(handler http.Handler) http.Handler {
       return c.BuildHandlerChainFunc(handler, c.Config)
    }
    apiServerHandler := NewAPIServerHandler(name, c.Serializer, handlerChainBuilder, delegationTarget.UnprotectedHandler())

    s := &GenericAPIServer{
       // ...
       Handler: apiServerHandler,
       // ...
    }    
}

 

APIServerHandler 实现了http.Handler

// staging/src/k8s.io/apiserver/pkg/server/handler.go
// ServeHTTP makes it an http.Handler
func (a *APIServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   a.FullHandlerChain.ServeHTTP(w, r)
}

 

从NewAPIServerHandler中可以看出,FullHandlerChain是通过handlerChainBuilder构造的。

// staging/src/k8s.io/apiserver/pkg/server/handler.go
func NewAPIServerHandler(name string, s runtime.NegotiatedSerializer, handlerChainBuilder HandlerChainBuilderFn, notFoundHandler http.Handler) *APIServerHand
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值