Skip to main content

minik8s APIServer

API Server是minik8s控制平面的核心。主要负责和ETCD存贮打交道,并提供一些核心的APIObject的API,供其他组件使用。在设计API Server的时候,我们主要考虑了两个特性,一个是状态和期望分离的情况,另外一个是Etcd的路径和API分离。

因为如果没有分离,我们考虑下面的情景:当一个Kubelet想要更新某一个Pod的状态的时候,试图Post或者Put请求写入一个完整的Pod对象,在此之前假如用户刚刚通过kubectl apply更新了一个Pod的信息,如果按照上面我所叙述的时间线,就会出现用户的apply的更新的Pod被覆盖了。同样的道理,如果用户删除了一个Pod,按照上面的设计,Kubelet在回传的时候写入了一个完整的Pod,相当于没有做任何的删除。

虽然说上面的例子是因为期望和状态没有分离,但是本质是kubelet的权限太大,能够写入一个完整的Pod。所以为了解决这种问题,我们对于一个对象,往往设计了更新对象接口(更新整个对象),更新对象的状态接口(仅仅更新Status,如果找不到对象那么久不更新。)

Etcd存储API对象的路径都是registry/pods/<namespace>/<name>,而API的格式大多都是/api/v1/pods/namespaces/:namespace/name/:name,可以看到两者的差别还是比较明显的,这是因为API版本看发生动态变化(在实际的k8s中也是这样),但是存储的路径保证兼容原来的。所以在我们的minik8s中,我们同样借鉴了这样的思路。

最后,特别感谢github.com/gin-gonic/gin 为我们提供了简洁易实现的go语言的Web Server框架。更多详细的接口问题,请查看下面的表格。

API接口表

所有的接口都是严格的Restful接口。

ID请求类型URI描述参数说明资源类型URI字段期望返回值字段名
1GET/api/v1/nodes获取所有的Node暂无NodeNodesURL200 OK
2POST/api/v1/nodes创建一个Node暂无NodeNodesURL201 Created
3GET/api/v1/nodes/:name获取一个Node的信息name是节点的名字,必须NodeNodeSpecURL200 OK
5DEL/api/v1/nodes/:name从集群删除Nodename是节点的名字,必须NodeNodeSpecURL204 DEL
4PUT/api/v1/nodes/:name更新一个Node的信息name是节点的名字,必须NodeNodeSpecURL200 OK
6GET/api/v1/nodes/:name/status获取Node的状态name是节点的名字,必须NodeNodeSpecStatusURL200 OK
7PUT/api/v1/nodes/:name/status更新Node的状态name是节点的名字,必须NodeNodeSpecStatusURL200 OK
8
9GET/api/v1/namespaces/:namespace/pods获取所有的Podnamespace名字空间PodPodsURL200 OK
10POST/api/v1/namespaces/:namespace/pods创建一个Podnamespace名字空间PodPodsURL201 Created
11GET/api/v1/namespaces/:namespace/pods/:name获取某个特定的Pod同上,name是pod名字PodPodSpecURL200 OK
12PUT/api/v1/namespaces/:namespace/pods/:name更新某个特定的Pod同上,name是pod名字PodPodSpecURL200 OK
13DEL/api/v1/namespaces/:namespace/pods/:name删除某个Pod同上,name是pod名字PodPodSpecURL204 DEL
14GET/api/v1/namespaces/:namespace/pods/:name/status获取某个Pod的状态同上,name是pod名字PodPodSpecStatusURL200 OK
15POST/api/v1/namespaces/:namespace/pods/:name/status更新某个Pod的状态同上,name是pod名字PodPodSpecStatusURL200 OK
_
_POST/api/v1/namespaces/:namespace/services创建一个Servicenamespace名字空间ServiceServiceURL201 Created
_GET/api/v1/namespaces/:namespace/services获取所有的Servicenamespace名字空间ServiceServiceURL200 OK
_GET/api/v1/namespaces/:namespace/services/:name获取一个特定Service同上,name是service名字ServiceServiceSpecURL200 OK
_DEL/api/v1/namespaces/:namespace/services/:name删除一个特定Service同上,name是service名字ServiceServiceSpecURL204 DEL
_PUT/api/v1/namespaces/:namespace/services/:name更新一个特定Service同上,name是service名字ServiceServiceSpecURL200 OK
_
_GET/apis/v1/namespaces/:namespace/jobs获取所有的Jobsnamespace名字空间JobJobsURL200 OK
_POST/apis/v1/namespaces/:namespace/jobs创建一个Jobnamespace名字空间JobJobsURL201 Created
_GET/apis/v1/namespaces/:namespace/jobs/:name获取一个特定Job同上,name是Job名字JobJobSpecURL200 OK
_DEL/apis/v1/namespaces/:namespace/jobs/:name删除一个特定Job同上,name是Job名字JobJobSpecURL204 DEL
_GET/apis/v1/namespaces/:namespace/jobs/:name/status获取一个Job的状态同上,name是Job名字JobJobSpecStatusURL200 OK
_PUT/apis/v1/namespaces/:namespace/jobs/:name/status更新一个Job的状态同上,name是Job名字JobJobSpecStatusURL200 OK
_POST/apis/v1/namespaces/:namespace/jobfiles创建一个JobFilenamespace名字空间JobFileJobFileURL201 Created
_GET/apis/v1/namespaces/:namespace/jobfiles获取一个JobFile内容同上,name是Job名字JobFileJobFileSpecURL200 OK
_PUT/apis/v1/namespaces/:namespace/jobfiles/:name更新一个JobFile内容同上,name是Job名字JobFileJobFileSpecURL200 OK
_
_GET/apis/v1/replicasets获取全局所有ReplicareplicaSetGlobalReplicaSetsURL200 OK
_GET/apis/v1/namespaces/:namespace/replicasets获取所有的Replicanamespace名字空间replicaSetReplicaSetsURL200 OK
_GET/apis/v1/namespaces/:namespace/replicasets/:name获取特定的Replica同上,name是Job名字replicaSetReplicaSetSpecURL200 OK
_DEL/apis/v1/namespaces/:namespace/replicasets/:name删除特定的Replica同上,name是Job名字replicaSetReplicaSetSpecURL204 DEL
_PUT/apis/v1/namespaces/:namespace/replicasets/:name更新特定的Replica同上,name是Job名字replicaSetReplicaSetSpecURL200 OK
_GET/apis/v1/namespaces/:namespace/replicasets/:name/status获取特定的Replica同上,name是Job名字replicaSetReplicaSetSpecStatusURL200 OK
_PUT/apis/v1/namespaces/:namespace/replicasets/:name/status更新特定的Replica状态同上,name是Job名字replicaSetReplicaSetSpecStatusURL200 OK
_
_GET/apis/v1/namespaces/:namespace/dns获取DNSnamespace名字空间DNSDnsURL200 OK
_GET/apis/v1/namespaces/:namespace/dns/:name获取DNS同上,name是DNS名字DNSDnsSpecURL200 OK
_POST/apis/v1/namespaces/:namespace/dns创建DNSnamespace名字空间DNSDnsSpecURL201 Created
_DEL/apis/v1/namespaces/:namespace/dns/:name删除DNS同上,name是DNS名字DNSDnsSpecURL204 DEL
_
_GET/apis/v1/namespaces/:namespace/hpa获取所有的HPAnamespace名字空间HPAHPAURL200 OK
_POST/apis/v1/namespaces/:namespace/hpa创建HPAnamespace名字空间HPAHPAURL201 Created
_GET/apis/v1/namespaces/:namespace/hpa/:name获取特定的HPA同上,name是HPA名字HPAHPASpecURL200 OK
_PUT/apis/v1/namespaces/:namespace/hpa/:name更新特定的HPA同上,name是HPA名字HPAHPASpecURL200 OK
_DEL/apis/v1/namespaces/:namespace/hpa/:name删除特定的HPA同上,name是HPA名字HPAHPASpecURL204 DEL
_GET/apis/v1/hpaHPAGlobalHPAURL
_
_GET/apis/v1/namespaces/:namespace/functions获取所有函数namespace名字空间FunctionFunctionURL200 OK
_POST/apis/v1/namespaces/:namespace/functions创建一个函数namespace名字空间FunctionFunctionURL201 Created
_GET/apis/v1/namespaces/:namespace/functions/:name获取特定的函数同上,name是Func名字FunctionFunctionSpecURL200 OK
_PUT/apis/v1/namespaces/:namespace/functions/:name更新特定的函数同上,name是Func名字FunctionFunctionSpecURL200 OK
_DEL/apis/v1/namespaces/:namespace/functions/:name删除特定的函数同上,name是Func名字FunctionFunctionSpecURL204 DEL
_GET/apis/v1/functions获取全局的函数FunctionGlobalFunctionsURL200 OK
_
_GET/apis/v1/namespaces/:namespace/workflow获取某个Workflownamespace名字空间WorkflowWorkflowURL200 OK
_POST/apis/v1/namespaces/:namespace/workflow创建一个Workflownamespace名字空间WorkflowWorkflowURL201 Created
_GET/apis/v1/namespaces/:namespace/workflow/:name获取特定Workflow同上,name是workflow名字WorkflowWorkflowSpecURL200 OK
_PUT/apis/v1/namespaces/:namespace/workflow/:name更新Workflow同上,name是workflow名字WorkflowWorkflowSpecURL200 OK
_DEL/apis/v1/namespaces/:namespace/workflow/:name删除Workflow同上,name是workflow名字WorkflowWorkflowSpecURL200 OK
_GET/apis/v1/namespaces/:namespace/workflow/:name/status获取Workflow状态同上,name是workflow名字WorkflowWorkflowSpecStatusURL204 DEL
_PUT/apis/v1/namespaces/:namespace/workflow/:name/status更新状态同上,name是workflow名字WorkflowWorkflowSpecStatusURL200 OK
_200 OK

返回的json字段

返回字段说明
data返回的数据,可能是数组,也可能是实体
error操作出现错误的原因
message操作执行的结果,一般是成功的信息