API服务器
Last updated
Was this helpful?
Last updated
Was this helpful?
Kubernetes的API服务器作为中心组件,集群中的其他组件或者客户端(如kubectl)都会去调用它。
其以RESTful API的形式提供了可以查询、修改集群资源状态的CRUD(Create、Read、Update、Delete)接口。
它将资源状态存储到etcd中,它是唯一与etcd交互的组件。
kubectl
客户端就是对API服务器提供的接口的封装。例如,当使用kubectl
创建资源时,就是通过HTTP POST请求调用API接口。
下图展示了API服务器在接收请求后的具体操作:
kubectl
将请求封装后,通过HTTP请求发送至API服务器;
认证插件:API服务器有一个或多个认证插件,用于认证发送请求的客户端是否合法,即确定请求是由谁发送的,有的插件是提取客户端证书,有的是通过 HTTP 认证等等,在启动 API 服务器时,可以通过命令行选项选择开启的认证插件。API服务器会轮流调用这些插件,直到有一个能确认客户端合法;
授权插件:API服务器有一个或多个授权插件,用于决定认证的客户端是否具有执行请求操作的权限。API服务器会轮流调用这些插件,直到有一个授权插件确认了客户端可以执行该操作;
准入插件:API服务器有一个或多个准入插件,用于验证、AND/OR修改资源请求:
验证资源请求:客户端发送的请求中,可能存在某一个字段的值不在可用值范围内,像这样会被该类插件拒绝;
AND/OR修改资源请求:客户端发送的请求中,并不会对资源的每个字段都进行定义,此时对应的插件会将其负责的字段设置为默认值;
准入插件包括:
AlwaysPullImages:重写Pod的spec.containers.imagePullPolicy
为Always
,强制每次部署Pod时拉取镜像;
ServiceAccount:未明确定义服务账户的,使用默认账户;
NamespaceLifecycle:防止在命名空间中创建正在被删除的Pod,或在不存在的命名空间中创建Pod;
ResourceQuota:保证特定命名空间中的Pod只能使用该命名空间分配数量的资源,如CPU和内存;
验证资源:验证需要存储到etcd的对象;
将对象存储至etcd中;
重点!!!当资源发生变更(创建、删除、更新)时,API服务器并不会通知其他组件,它只负责将资源变更,并写入etcd中,由其他组件(Controller Manager等)监听各自负责的资源的变化,然后将资源实例的状态变更为期望状态。
再次强调!API服务器不会主动将资源变更通知推送给其他组件,而是需要先由其他组件自己监听的,也就是说其他组件不停的从API服务器处监听其负责的资源!
下面用kubectl
客户端从API服务器处监听Pod资源为例,使用下面的命令即可:
下图展示了一个例子,集群中的其他组件以及一些客户端正在监听Pod资源的变更通知,某用户使用kubectl
客户端更新了名为pod-xyz
的Pod资源实例,此时API服务器将更新后的状态写入etcd中,并向监听该资源对象的其他组件及客户端发送变更通知: