zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Kubernetes APIServer

Kubernetes ApiServer
2023-09-14 09:15:17 时间

APIServer


kube-APIServer 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能:

  • 提供集群管理的 REST API 接口,包括:
         • 认证 Authentication
         • 授权 Authorization
         • 准入 Admission(Mutating & Valiating)

下面可以看到etcd就一根线连出来了,连到了apiserver,所以apiserver是整个集群的核心,接收了所有的请求,并且所有的请求都是从apiserver过的。

对于任何的API网关通用的功能包括认证,你得知道请求是从哪来,这个人是谁。其次知道这个人是谁是否具有某些操作权限。这些都是API网关需要做到的基本事情,apiserver也一样。

那么准入控制怎么理解?在你的请求之上加入一些东西,添加和更改一些属性,在存入etcd之前,也就是在原始请求上面动一些东西(Mutating)同时还得知道这个请求是否有效(Valiating)。

上面就是作为看门的Gate Keeper的最重要的三个职责。

  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 才直接操作 etcd
  • APIServer 提供 etcd 数据缓存以减少集群对 etcd 的访问。

只有apiserver能够访问etcd,因为apiserver在访问etcd的时候,构建了在apiserver这边的缓存。

所以任何的客户端去访问apiserver的时候,默认的是不穿透apiserver的,apiserver会将数据的缓存直接返回给你,这个请求不会到etcd。

etcd是支持watch的,apiserver本身就会通过watch机制建立一个长连接,然后etcd这边有什么变化都会以通知的形式告诉给apiserver,理论上apiserver上这边数据都是最新的。

作为客户端去访问apiserver,基本上都能够拿到最新的数据。etcd支持watch,apiserver也支持watch。

所以在访问apiserver的时候,如果你要知道一个对象的持续变更,也应该通过watch的机制。

 -v 9来查看debug log

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
hostnames    ClusterIP   10.233.37.101   <none>        80/TCP    30s
kubernetes   ClusterIP   10.233.0.1      <none>        443/TCP   22d
I0317 16:43:24.808068   53005 round_trippers.go:423] curl -k -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.18.8 (linux/amd64) kubernetes/9f2892a" 'https://lb.kubesphere.local:6443/api/v1/namespaces/default/services?resourceVersion=6637&watch=true'
I0317 16:43:24.810361   53005 round_trippers.go:443] GET https://lb.kubesphere.local:6443/api/v1/namespaces/default/services?resourceVersion=6637&watch=true 200 OK in 2 milliseconds
I0317 16:43:24.810411   53005 round_trippers.go:449] Response Headers:
I0317 16:43:24.810420   53005 round_trippers.go:452]     Cache-Control: no-cache, private
I0317 16:43:24.810427   53005 round_trippers.go:452]     Content-Type: application/json
I0317 16:43:24.810433   53005 round_trippers.go:452]     Date: Thu, 17 Mar 2022 08:43:24 GMT


'https://lb.kubesphere.local:6443/api/v1/namespaces/default/services?resourceVersion=6637&watch=true'  可以看到这个请求apiserver就不会断开,这是一个长链接

edit这个svc,那么可以看到这个对象的变更一样的通知到了kubelet,apiserver里面的对象发生了变更通知了kubelet,所以kubelet也需要通过watch的机制来获得通知的。

[root@master ~]# kubectl edit svc hostnames 
service/hostnames edited

hostnames    ClusterIP   10.233.37.101   <none>        81/TCP    2m29s

APIServer展开


 APIserver本身支持一种堆叠的模式,可以建立很多apiserver,不同的apiserver可以去处理不同的对象。当一个请求过来,这个请求发给apiserver。

AuthN解析token,从中得到用户是谁,用户组是谁。AuhtZ基于RBAC,这个用户能够访问哪些对象,并且操作权限是什么。