KubeApiserver流程分析
kube-apiserver底层原理使用go-restful框架对路径进行映射,然后通过etcd客户端对etcd进行请求。
我们需要注意kube-apiserver的几个功能:TLS认证、权限验证、webhook。
kube-apiserver使用http2.0作为传输协议所以对请求进行采用TLS认证,在认证完成后会通过类似于过滤链的形式对请求进行调用。
接下来让我们先看一下kube-apiserver是如何创建go-restful以及添加资源映射的。
//创建go-restful服务并返回
func NewAPIServerHandler(name string, s runtime.NegotiatedSerializer, handlerChainBuilder HandlerChainBuilderFn, notFoundHandler http.Handler) *APIServerHandler {
// 创建Container
gorestfulContainer := restful.NewContainer()
gorestfulContainer.ServeMux = http.NewServeMux()
gorestfulContainer.Router(restful.CurlyRouter{}) // e.g. for proxy/{kind}/{name}/{*}
gorestfulContainer.RecoverHandler(func(panicReason interface{}, httpWriter http.ResponseWriter) {
logStackOnRecover(s, panicReason, httpWriter)
})
gorestfulContainer.ServiceErrorHandler(func(serviceErr restful.ServiceError, request *restful.Request, response *restful.Response) {
serviceErrorHandler(s, serviceErr, request, response)
})
director := director{
name: name,
goRestfulContainer: gorestfulContainer,
nonGoRestfulMux: nonGoRestfulMux,
}
return &APIServerHandler{
// 接受到请求并进行TLS认证后会调用该handler链,该链第一步就是对权限进行验证工作。
FullHandlerChain: handlerChainBuilder(director),
GoRestfulContainer: gorestfulContainer,
NonGoRestfulMux: nonGoRestfulMux,
Director: director,
}
}
// handlerChainBuilder(director)的实现
func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {
// trck记录
handler = filterlatency.TrackCompleted(handler)
// 权限认证
handler = genericapifilters.WithAuthorization(handler, c.Authorization.Authorizer, c.Serializer)
handler = filterlatency.TrackStarted(handler, "authorization")
return handler
}
资源映射分为两步,api资源创建与apis资源创建两步基本类似,所以我们只看api资源创建
// 根据每个资源调用该方法,比如pod、service
func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storage, ws *restful.WebService) (*metav1.APIResource, *storageversion.ResourceInfo, error)
这里会根据子资源,是否有命名空间对请求路径进行创建
会通过path以及参数、请求方式生成action。
遍历actions,go-restful中的ws根据请求方式(get,post,put,get等)将生成的handler与path进行添加。
这每个handler都嵌入的webhook操作。