图解kubernetes中api聚合机制的实现

kubernetes中apiserver的设计无疑是复杂的,其自身内部就包含了三种角色的api服务,今天咱们一块儿来臆测下其内部的设计,搞明白aggregator、apiserver、apiExtensionsServer(crd server)的设计精要web

1.从web服务到web网关到CRD

apiserver仍是蛮复杂的,今天咱们只讨论其kube-aggregator/apiserver/apiextensions三者架构上的设计,而不关注诸如请求认证、准入控制、权限等等后端

1.1 最基础的REST服务

image.png 一个最基础的Rest服务一般会包括一个resource资源和一组HTTP请求的方法, 在kubernetes中被称为一个REST,其内部还内嵌了一个Store(能够理解为继承),其提供了针对某个具体资源的全部操做的集合,也就是咱们常说的最终执行CRUD的具体操做的实现api

1.2 Service

image.png 咱们有了Rest就能够提供各类k8s中资源的管理,可是若是我要进行扩展呢,若是要支持一些外部的资源k8s中不存在, 最简单的方式确定就是在外部独立一个服务了,由这个服务本身管理数据存储、变动、控制等等逻辑微信

1.3 APIAggregator

当经过外部服务来进行集群资源扩展的时候,针对这类资源咱们如何集成到当前的apiserver中呢?为此k8s中设计了APIAggregator组件(其实APIAggreator组件还包括代理后端服务等功能),来实现外部服务的集成,这样开发人员不用修改k8s代码,也能够来自定义服务信息架构

1.4 一个服务的基本功能

image.png 一个基础的业务服务一般包含数据模型、控制逻辑、持久化存储、基础功能(认证、监控、日志等等)等等,为了要建立一个服务,咱们一般须要以下操做(不包含设计阶段):1)选择合适的框架(完成基础功能) 2)定义数据模型 3)选择数据存储 4)编写业务控制逻辑, 这里面除了业务控制逻辑,其他部分在大多数状况下可能都是通用,好比框架、数据存储这些,那能不能简化下?来看大招CRD框架

1.5 CustomResourceDefinitions

image.png CRD中文被称为自定义资源类型,其核心在k8s中提供数据模型定义、数据存储、基础功能,这样若是咱们要扩展服务就只须要编写一个业务逻辑控制器便可, 咱们思考下其场景ide

一般web请求的处理流程都是反序列化、验证字段、业务逻辑处理、数据存储,而在k8s中业务控制逻辑大多数由controller来进行,那为了支持CRD剩余工做确定也是在k8s中完成的源码分析

在咱们完成定义模型以后,k8s的crd模块须要进行对应资源REST的构建、验证、转换、存储等操做这些无疑都是耗费资源的,并且在apiserver这种数据总线上,由此能够发行CRD并不支持大规模的数据存储 学习

1.6 CRD server

image.png CRDServer主要就是负责CRD资源的管理,其会监听CRD资源的变动,而且为其建立对应的REST接口,完成对应的认证、转换、验证、存储等机制ui

2. ServerChan

ServerChan从设计上更相似一种责任链的模式,简单来讲若是我处理不了该请求,我就交给下我的处理,这种操做在k8s中被称为delegate(委托),接下来咱们开始了解其关键实现

2.1 服务的角色划分

到目前咱们已经有了三个server, 其中APIAggregator负责外部服务的集成和内部请求的转发,apiserver服务k8s汇总内部资源的控制,CRDServer则负责用户自定义资源的处理,而后咱们就只须要将三者串联起来,就是咱们最终的apiserver

2.2 责任链上的层层委托

image.png 当APIAggregator接收到请求以后,若是发现对应的是一个service的请求,则会直接转发到对应的服务上不然则委托给apiserver进行处理,apiserver中根据当前URL来选择对应的REST接口处理,若是未能找到对应的处理,则会交由CRD server处理, CRD server检测是否已经注册对应的CRD资源,若是注册就处理

2.3 APIAggregator上的服务注册

image.png APIAggreagtor中会经过informer 监听后端Service的变化,若是发现有新的服务,就会建立对应的代理转发,从而实现对应的服务注册

2.4 CRD Server中的资源感知

image.png 当在集群中建立了对应的CRD资源的时候,会经过内部的controller来感知对应的CRD资源信息,而后为其建立对应的REST处理接口,这样后续接收到对应的资源就能够进行处理了 

3. 基础概览图

image.png 读k8s代码老是这样迷迷糊糊中又能灵光一现直接柳暗花明,流程真的重要嘛,貌似也不是很重要,了解其上层设计,而后直接关注感兴趣点便可,除非和我同样就是感兴趣,那就只能死磕了,我该去吃饭了,祝你好运

kubernetes学习笔记地址: https://www.yuque.com/baxiaoshi/tyado3 > 微信号:baxiaoshi2020 > 关注公告号阅读更多源码分析文章 21天大棚 > 更多文章关注 www.sreguide.com > 本文由博客一文多发平台 OpenWrite 发布

相关文章
相关标签/搜索