Kube-ApiServer架构解析

基于1.29

  • API层:主要以REST方式提供各种API,除了K8s的CUED资源还有健康检查、日志等等
  • 访问控制层:当有客户端访问API时,访问控制层负责对用户身份鉴权、校验
  • Registry:K8s把所有的资源对象都保存在注册表,针对不同的资源对象,都定义了资源对象的类型、如何创建资源对象,如何转换资源对象,以及如何资源编码为JSON或ProtoBuf格式进行存储
  • etcd:用于持久化存储K8s资源对象的KV数据库

K8s Proxy API

K8s Proxy API 的作用是代理REST请求,把API Server收到的REST请求转发到K8s进程的REST端口

  • 该进程由kubelet负责响应
  • 这里的信息,来自于Node,而不是ETCD所以可能存在偏差

K8s Porxy API路径如下:

# 列出指定Node的所有Pod
/api/v1/nodes/{node}/proxy/pods
# 列出指定Node都所有性能指标统计信息
/api/v1/nodes/{node}/proxy/metrics
# 列出指定Node都概要信息
/api/v1/nodes/{node}/proxy/spec
# 列出指定Node的当前参数
/api/v1/nodes/{node}/proxy/configz

此外,如果在kubelet进程中开启--enable-deugging-handlers=true,还会支持更多的接口

# 在某个Node上运行某个容器
/api/v1/nodes/{name}/proxy/run
# 在Node上的某个容器执行某个命令
/api/v1/nodes/{name}/proxy/exec
# 在Node上attach某个容器
/api/v1/nodes/{name}/proxy/attach
# 在Node上实现Pod端口转发
/api/v1/nodes/{name}/proxy/portForward
# 列出Node个类目日志信息,比如tallylog
/api/v1/nodes/{name}/proxy/logs

# 列出在Node上运行的Pod信息
/api/v1/nodes/{name}/proxy/runningpods
# 列出Node上当前的Web服务的状态
/api/v1/nodes/{name}/proxy/debug/pprof

集群功能模块之间的通信

kubelete和API Server交互的过程,是每个Node上的kubelet周期性调用一次API Server接口,报告自身状态,同时给予节点缓存,减少对于APIServer对访问压力

  • 在K8s上 Node上的kubelet和kube-proxy组件都需要kube-apiserver签发的安全性HTTPS协议,而需要CA证书,集群规模宏大,会增加集群拓展压力,所以在K8s v1.18提出了TLS Bootstarping,进入稳定特性

  • K8s中由是基本通过client-go来访问, 在K8s v1.22 Stable阶段使用的“Exterbal credential providers”特性,不显示使用Bare Token和证书访问,只需要kubeconfig

  • K8s v1.26 Stable阶段新增使用External Credential Providers,kubelet可以执行本地的 Credential Providers Plugin特征实现获取不同镜像仓库的访问

网络隔离设计

API Server要求核心的Master网络与承载的Node网络实现某种程度的安全隔离,API Server添加了SSH安全隧道。让公有云提供商可以给予SSH安全通道安全访问API Server接口,但是也出现了更新、部署的困难,所以在K8s v1.16 Alpha阶段 提出了API Server Network Policy但是在K8s v1.29仅仅在Beta 的0.0.9版本

  • API Server Network Policy核心思想API Server放在一个独立的网络中和Node网络互相隔离,然后增加独立的网络连通性代理(Connectivity Proxy)来解决这个网络连通问题

引入API Server Network Policy机制实现Master机制和Node网络安全隔离具备以下的优势:

  • Connectivity Porxy可以独立拓展,不影响API Server的发展
  • 通过采用自定义的Connectivity Proxy,也可以实现VPN网络的穿透等高级网络代理特性
  • 网络代理吧Master网络和Node网络分离,提神了API Server代理内聚