深度解析 | K8S API Server之请求处理
对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之请求处理
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
K8S集群管理 | 4个杀手级工具Get
想要在一瞬间切换Kubernetes上下文吗? 想知道快速消耗CPU的pods吗? 以下工具将帮助到你 Kubernetes,作为容器化工作负载的集群管理器,非常流行。当大K担当起负载均衡和作业管理的重任,你就可以把注意力转移到其他事情了。 但几乎每一个开源项目,都处在进程当中。而且几乎每一个参与Kubernetes项目的人都会发现它的缺点、粗糙以及令人头痛的地方。 以下介绍四个工具,它们都将为Kubernetes集群的管理工作减轻负荷。 Kube-applier Kubernetes取得成功的一个关键是,除了Google,还汲取了其他IT厂商和产品的营养。云存储公司Box在Kubernetes上取得成功并开源了以往用于内部部署的部分工具。kube-applier就是这样一个项目。 作为Kubernetes服务运行的Kube-applier,为Git仓库中托管的Kubernetes集群提供了一组声明性配置文件,并将其持续应用于集群中的pod。无论何时对定义文件进行任何更改,它们都将被自动提取并应用于相关的pod。 这些变化也可以在按时间或者按需求应用。Kube-applier会记录每...
- 下一篇
深度解析 | K8S API Server之专业术语
对Kubernetes API Server的相关术语进行介绍,后续会有新的文章对API请求流程、APIServer的存储和扩展点等主题进行介绍。本篇是KubernetesAPI Server系列第二篇。 术语解释 在简要概述了API Server和HTTP API空间及其属性之后,我们现在对文中使用的术语进行更正式的定义。像pod,service、endpoints、deployment等基元组成了Kubernetes类型的对象。我们使用以下术语: Kind代表一个实体的类型。每个对象都有一个Kind字段,它告诉一个客户端(如kubectl或者oc)它具体代表的实体,如pod: apiVersion: v1 kind: Pod metadata: name: webserver spec: containers: – name: nginx image: nginx:1.9 ports: – containerPort: 80 有三种类型的Kind: 对象(Objects)表示系统中的一个持久实体。对象可能具有多个资源,客户端可以使用它们来执行特定的操作。例如:Pod和Name...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Red5直播服务器,属于Java语言的直播服务器
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7