概述
Kubernetes
核心组件运行机制基于一种高度解耦合、声明式的架构设计,其主要组件包括 Kubernetes API Server
、etcd
、kube-scheduler
、kube-controller-manager
、kubelet
和 kube-proxy
,各组件协同工作以实现容器集群的高效管理和资源调度。
API Server
其核心功能是提供各种资源的增、删、改、查及Watch
,是各个功能模块之间通信的中心枢纽。
- 集群管理的API入口
- 资源配额控制入口
- 集群安全机制
API Server
通过一个名称为kube-apiserver
的进程提供服务,该进程运行在Master
上。默认情况下,在本机的8080端口。
我们通常可以通过kubectl
来与API Server
进行交互,他们之间的接口是RESTfull API
。
由于API Server
是Kubenetes
集群数据的唯一入口,因此安全性与高性能就成为API Server
设计和实现的两大核心目标。通过HTTPS安全通道与CA签名数字证书强制双向认证的方式,使得API Server的安全性得以保证。为了更细粒度的控制用户或应用对k8s资源对象的访问权限,k8s启用了RBAC访问控制策略。
API Server
性能是决定k8s集群整体性能的关键因素,因此k8s的设计者运用以下方式来最大程度的保证API Server
的性能
- 大量高性能的底层代码
- 普通
List
接口结合异步Watch
接口 - 采用高性能数据库
ETCD
API Server 架构
API Server
架构从上到下分为一下几层:
- API层:主要以
REST
方式提供各种API接口,除了Kubernetes
资源对象的CRUD
和Watch
等主要API
,还有健康检查、UI、日志、性能指标等运维监控相关的API。 - 访问控制层:当客户端访问API接口时,访问控制层负责对用户身份鉴权,验明用户身份,核对权限。
- 注册表层:k8s把所有资源对象都保存在注册表中,针对注册表中的各种资源对象都定义了:资源对象的类型、如何创建资源对象、如何转换资源的不同版本等。
etcd
数据库:持久化存储k8s资源对象的kv数据库。etcd
的watch
的API接口对于API Server
来说至关重要,因为通过这个接口,API Server
创新性的设计了List-Watch
这种高性能的资源对象实时同步机制,使得k8s可以管理超大规模的集群,及时响应和快速处理集群中的各种事件。
如下是一个完整Pod调度过程,对API Server的List-Watch机制进行说明
- 借助
etcd
的watch
api接口,API Server
可以监听ETCD
上发生的数据库操作事件,在这些事件发生后,ETCD
会及时通知API Server
。 - 为了让k8s的其他组件在不访问
ETCD
数据库情况下,也能及时获取资源对象的变化。API Server
模仿ETCD
提供了自己的Watch
接口。 - k8s的
List-Watch
用于实现数据同步的代码逻辑。客户端首先调用API Server
的List
接口获取相关资源对象的全量数据并将其缓存到内存中,然后启用对应资源对象的Watch
协程,在接收到Watch
事件后,在根据事件类型(新增,修改,删除)对内存中的全量资源对象列表做出响应的同步修改,从实现上来看,这是一种全量结合增量的高性能数据同步方式
Proxy API 接口
k8s的API Server
最主要的REST
接口是资源对象的增、删、改、查接口,除此之外还提供了代理接口,这类接口的作用是代理REST
请求,即API Server
将收到的请求转发到某个Node
上的kubelet
守护进程的Rest
接口,该kubelet
负责响应。
bash
# 列出指定节点内所有Pod的信息
/api/v1/nodes/{name}/proxy/pods
# 列出指定节点内物理资源的统计信息
/api/v1/nodes/{name}/proxy/stats
# 列出指定节点的概要信息
/api/v1/nodes/{name}/proxy/spec
需要说明的是:这里获取的Pod
信息数据来自Node
而非ETCD
数据库
K8s Proxy API
里关于Pod
的相关接口,通过这些接口,我看可以访问Pod
里某个容器提供的服务
bash
# 访问Pod
/api/v1/namespaces/{namespace}/pods/{name}/proxy
# 访问Pod服务的URL路径
/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path:*}
集群功能模块之间通信
k8s的API Server
作为集群的核心,负责集群各功能模块之间的通信。集群内的各个功能模块通过 API Server
将信息存入ETCD
,当需要获取和操作这些数据时,则通过API Server
提供的REST接口来实现,从而实现各个模块之间的信息交互。
常见的一个交互场景是kubelet
进程与API Server
的交互。每个node
上的kubelet
每隔一个时间周期,就会调用一次API Server
的REST
接口报告自己的状态,API Server
在接收到这些信息后,将这些信息保存到ETCD
中。此外kubelet
也通过API Server
的Watch
接口监听Pod
信息,如果监听到新的Pod
的副本被调用到本节点,则执行Pod
对应的容器创建和启动逻辑,删除和修改同理。
另一个场景是kube-controller-manager
进程与API Server
的交互。kube-controller-manager
中的Node Controller
模块通过API Server
提供的Watch
接口实时监控node
的信息并做相应处理。
调度(Scheduler
)通过API Server
的Watch
接口监听到新的Pod
副本信息后,会检索所有符合该Pod
要求的Node
列表,开始执行Pod
调度逻辑,在调度成功后将Pod
帮到到目标节点上。
结语
总结 Kubernetes
核心组件运行机制的原理解析,Kubernetes
作为一款先进的容器编排系统,其核心组件通过紧密协作实现了自动化部署、扩展和管理容器化应用的目标。以下是对主要组件运行机制的关键要点总结:
Kubernetes API Server
- 作为集群的中央管控点,
API Server
提供了RESTful API
接口,处理对集群状态的增删改查操作。 - 所有资源对象(如 Pod、Deployment、Service 等)的管理和控制指令均通过
API Server
实现。 API Server
连接etcd
存储集群的状态数据,并通过Watch
机制实时同步状态变更给其他组件。
etcd
- 作为高可用键值存储系统,
etcd
存储了Kubernetes
集群的所有配置数据和状态信息。 - 其
watch
功能使得其他组件能够实时获取数据变更通知,确保集群状态一致性。
kubelet:
- 在每个
Node
上运行,kubelet
是Master
和Worker
节点之间的桥梁。 kubelet
通过与API Server
交互获取Pod
的定义,并确保Pod
中容器在本地节点按照要求正确创建、运行和维护。
kube-proxy:
- 每个
Node
上运行的网络代理服务,实现Kubernetes Service
的负载均衡和服务发现功能。 - 它通过监听
API Server
中Service
对象的变化,动态更新网络规则,确保跨多个Pod
的网络流量按需分发。
Controller Manager:
- 包含多个控制器,如
Replication Controller
、Endpoint Controller
等,它们负责监控集群实际状态并调整至期望状态。 - 控制器通过循环检查与实际状态的差异,并采取相应动作使集群达到一致状态。
Scheduler:
- 负责决定新创建的
Pod
应该调度到哪个Node
上运行,考虑的因素包括资源需求、亲和性/反亲和性策略等。 CoreDNS 或者之前的 kube-dns: - 提供了集群内部的服务发现能力,使得
Pod
能够通过服务名访问集群内其他服务。
综上所述,Kubernetes
的核心组件协同运作,共同构建了一个强大且灵活的分布式系统,它不仅保证了容器化的应用程序具有高可用性、弹性伸缩性和自我修复能力,还极大地简化了大规模分布式系统的管理和运维工作。通过深入了解这些组件的运行机制和原理,用户可以更好地设计和优化在 Kubernetes
上运行的应用程序架构。