运维开发网

深度解析 | K8S API Server之请求处理

运维开发网 https://www.qedev.com 2021-01-08 08:22 出处:51CTO 作者:mb5ff5933087b38
请求和处理流程在介绍了Kubernetes API中使用到的术语之后,接下来我们介绍如何处理API请求。API源码存在于kubernetes/pkg/api路径中,会处理集群内以及集群外客户端的请求。那么,当HTTP请求到达Kubernetes API时,具体会发现什么呢?从上层看,会发现以下交互:1.HTTP请求由一串过滤器(filters)进行处理,这些过滤器注册在DefaultBuildHa

请求和处理流程

在介绍了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等),并将请求的对象从存储中传送出来。

完整的流程如下图所示:

深度解析 | K8S API Server之请求处理

注意,为了简洁,在上图中我们省略了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)。

(注:上述filter的Golang源码可在以下链接中找到:

https://github.com/kubernetes/apiserver/tree/master/pkg/

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号