K8S 核心组件 api server 介绍
ApiServer 核心功能
- 集群管理的API 入口
- 资源配置控制入口
- 提供完备的集群安全机制
api server 是通过kube-apiserver 进程来提供服务的. 默认情况下在本机8080端口提供 rest 服务(--insecure-port), 也可以启用HTTPS 安全端口 (--secure-port=6443)
roger@microk8s:~$ curl localhost:8080/api
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "192.168.10.5:16443"
}
]
}
可以看到API 版本是v1
使用下面的url 来查询资源
curl localhost:8080/api/v1/serivces
curl localhost:8080/api/v1/pods
curl localhost:8080/api/v1/replicaioncontrollers
curl localhost:8080/apis #查看API 分组
注意以上命令都是在master 节点执行
对外暴露REST api
- 方式1
kubectl proxy --reject-paths="/api/v1/replicationcontrollers" ---port=8001
以上命令在8001对外暴露 rest api, 对于/api/v1/replicationcontrollers 的API 不允许访问
- 方式2
也可以使用--accept-hosts 参数指定访问白名单
kubectl proxy --accept-hosts="^localhost.^127\\.0\\.0\\.1$,\\[::1\\]$" ---port=8001
- 方式3
通过编程方式调用api server. 这种方式一般分为两种场景
- 运行在POD里的用户进程需要调用 api server 以获取集群信息,通常应用在分布式集群搭建目标中, 比如ES集群.
- 开发基于K8S的管理平台.
在第一种场景中 apiserver 在K8S 集群中体现为名为 kubernetes的 service
roger@microk8s:~$ kubectl get service --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default default-http-backend ClusterIP 10.152.183.69 <none> 80/TCP 18d
default http-svc ClusterIP 10.152.183.164 <none> 80/TCP 18d
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 87d
kube-system heapster ClusterIP 10.152.183.79 <none> 80/TCP 18d
kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 28d
kube-system kubernetes-dashboard ClusterIP 10.152.183.163 <none> 443/TCP 18d
kube-system monitoring-grafana ClusterIP 10.152.183.244 <none> 80/TCP 18d
kube-system monitoring-influxdb ClusterIP 10.152.183.223 <none> 8083/TCP,8086/TCP 18d
api server 架构解析
image.png- api层: 主要提供对外的 rest api
- 访问控制层: 验证身份与鉴权,根据配置的各种资源访问许可逻辑(Adminssion control) ,判断是否允许访问
- 注册表层: K8S 将所有对象都保存在registry 中, 针对 registry 中的各种资源对象, 都定义对象类型, 如何创建资源对象, 如何转换不同版本, 以及如何将资源编码和解码为json 或protobuf 格式进行存储.
- etcd 数据库: 用于持久化存储快s 资源对象.
api server list watch 机制解析
image.pngapi server 通过etcd的watch 接口监听资源的变更情况,当事件发生时 etcd 会通知 api server 比如步骤3, 为了让K8S的其他组件不依赖于etcd, api server 模仿etcd 提供了watch 机制, 当事件发生时,通知对应的组件 比如 4 8 12步骤中的实践 0 表示最开始进行watch 监控.
api server的api 版本控制
api server 针对每种资源都引入了一个相对不便的interal版本, 所有其他版本的资源对象(数据结构)只要支持能够转换为internal 就可以与其他版本的对象互换.
customer resource definition CRD
K8S 内置资源都包含了如下主要功能
- 资源对象的元数据(Schema)的定义: 可以将其理解为数据库的table定义,定义了资源的数据结构, 官方建议内建资源对象的元数据定义固话在源代码中.
- 资源对象的校验逻辑: 确保用户提交的资源对象的属性的合法性
- 资源对象的CRUD操作代码: 可以将其裂解为数据库表的CRUD代码.
- 资源对象相关的自动控制,比如deployment对象后的控制器. 这是很重要的一个功能, 用户给出期望的资源对象声明, 运行过程中择优背后的"自动控制器"负责, 确保对应的资源对象数量, 状态, 行为 都符合预期.
现在CRD 的1-3 步无序编程实现,直接写yaml 即可, 第四部, 通过调用用 api server 的api 来实现.
k8s proxy api 接口
proxy api 接口是指 api server 会把rest 请求转发到其K8S 组件, 又其他组件(比如kubelet)来响应的特殊接口.
比如node 相关的接口由kubelet响应
/api/v1/proxy/nodes/{name}/pods # 获取节点上所有pod
/api/v1/proxy/nodes/{name}/stats #获取节点的物理资源统计
/api/v1/proxy/nodes/{name}/spec #获取节点的概要信息
注意{name} 是节点的名称或者地址,这里获取的数据都来自kubelet 而非 etcd,所以两者的数据有时候会有偏差, 如果kubelet 启动时包含了 --enable--debugging-handlers=true 参数 那么proxy api 还会增加以下接口
/api/v1/proxy/nodes/{name}/run # 获取节点上运行某个容器
/api/v1/proxy/nodes/{name}/exec # 获取节点上的某个容器中运行某调命令
/api/v1/proxy/nodes/{name}/attach # 在节点上attach某个容器
/api/v1/proxy/nodes/{name}/portForwad # 实现节点上的pod 端口转发
/api/v1/proxy/nodes/{name}/log # 列出节点的个类日志信息,例如tallylog lastlog wtmp ppp/ shsm/ audit/ tuned/ 和 annaconda 等
/api/v1/proxy/nodes/{name}/metrics # 获取节点上相关的metrics信息
/api/v1/proxy/nodes/{name}/runningpods
/api/v1/proxy/nodes/{name}/debug/pprof # 列出当前节点web服务状态包括CPU 占用和内存占用情ingkuang.
集群功能模块之间的通信
image.png原创不易如果文章对您有所帮助