对Kubernetes API 请求流程进行解析。后续还将对API Server的存储和扩展点等主题进行介绍。本篇是Kubernetes API Server系列第三篇。
请求和处理流程
在介绍了Kubernetes API中使用到的术语之后,接下来我们介绍如何处理API请求。API源码存在于kubernetes/pkg/api路径中,会处理集群内以及集群外客户端的请求。
那么,当HTTP请求到达Kubernetes API时,具体会发现什么呢?从上层看,会发现以下交互:
1.HTTP请求由一串过滤器(filters)进行处理,这些过滤器注册在DefaultBuildHandlerChain()(参阅源码:https://github.com/kubernetes/apiserver中的config.go)中,并执行相应的处理。过滤器要么会将信息传递并附加到ctx.RequestInfo上(例如通过了身份认证的用户),要么返回适当的HTTP响应代码。
2.第二步,复用器(multiplexer,参阅源码:https://github.com/kubernetes/apiserver中的container.go)会根据HTTP路径,将HTTP请求路由到相应的处理程序(handler)。
3.第三步,routes(在routes/*中定义)会将处理程序(handler)与HTTP路径进行连接。
4.第四步,按照API Group进行注册的处理程序(参阅源码:https://github.com/kubernetes/apiserver中的groupversion.go和installer.go),会处理HTTP请求和上下文(context,如user、rights等),并将请求的对象从存储中传送出来。
注意,为了简洁,在上图中我们省略了HTTP路径中的$NAMESPACE字段。
现在我们进一步深入的对前文中提到的DefaultBuildHandlerChain()中建立的过滤器(filters)进行介绍:
WithRequestInfo():在requestinfo.go中定义,将RequestInfo附加到上下文中。
WithMaxInFlightLimit():在maxinflight.go中定义,对当前的请求数量进行限制。
WithTimeoutForNonLongRunningRequests():在timeout.go中定义,超时暂停非长时间运行请求(如大多数GET,PUT,POST,DELETE请求),这种请求与长时间运行请求(如watch和proxy请求)正好相反。
WithPanicRecovery():在wrap.go中定义,包装一个http Handler来恢复和记录报错。
WithCORS():在cors.go中定义,提供了一个CORS实现;CORS代表跨原始资源共享(Cross-Origin Resource Sharing),是一种允许嵌入在HTML页面中的JavaScript生成XMLHttpRequests请求到一个域(domain)的机制,这个域不同于JavaScript的初始起源。
WithAuthentication():在authentication.go中定义,尝试以用户身份对给定的请求进行验证,并将用户信息存储在提供的上下文中。成功后,授权HTTP header将从请求中删除。
WithAudit():在audit.go中定义,使用所有传入请求的审计日志信息来充实handler。审计日志的条目包含很多信息,例如请求的源IP、调用操作的用户信息以及请求的命名空间等。
WithImpersonation():在impersonation.go中定义,通过检查试图对用户进行修改的请求(类似sudo),来对假用户进行处理;
WithAuthorization():在authorization.go中定义,将所有授权的请求传递给已经将请求分发给正确的handler的复用器,否则返回禁止错误(forbidden error)。
本文转移K8S技术社区-深度解析 | K8S API Server之请求处理