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

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

被折叠的 条评论
为什么被折叠?



