Kubernetes APIServer
APIServer
kube-APIServer 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能:
- 提供集群管理的 REST API 接口,包括:
下面可以看到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,这个用户能够访问哪些对象,并且操作权限是什么。
相关文章
- 阿里张磊:如何构建以应用为中心的“Kubernetes”?(内含 QA 整理)
- Kubernetes详解(五十九)——Kubernetes Dashboard无法用浏览器访问解决
- 记一次kubernetes集群异常:kubelet连接apiserver超时
- Prometheus 监控Kubernetes平面组件 APIserver
- 本地安装基于Kubernetes的Kyma时遇到的一些错误消息
- 【云原生 | Kubernetes 系列】----亲和与反亲和
- 《Kubernetes网络权威指南》读书笔记 | 岂止iptables:Kubernetes Service官方实现细节探秘
- 【云原生之kubernetes实战】使用docker作为运行时部署Kubernetes集群
- Kubernetes apiserver更换证书
- Kubernetes 网络排错骨灰级指南!
- 一个典型的kubernetes工作流程 - kubernetes
- 【云原生 • Kubernetes】kubernetes 核心技术 - Ingress
- 【云原生 • Kubernetes】kubernetes 核心技术 - 集群安全机制
- 【云原生 • Kubernetes】kubernetes 核心技术 - Service
- Kubernetes 深入理解kubernetes(一)
- Kubernetes APIServer 鉴权
- Kubernetes APIServer 限流策略
- Kubernetes 谈谈Service与Ingress
- Kubernetes Ingress : 为你的应用提供https服务
- 【云原生 | Kubernetes 系列】----Grafana 安装
- Kubernetes中的网络策略
- Kubernetes基础_01_从云原生到kubernetes
- Kubernetes部署_使用kubernetes部署Mysql主从结构(Kubernetes工作实践类)
- Kubernetes部署_使用kubernetes部署prometheus+grafana监控系统(Kubernetes工作实践类)