任何优秀的项目都离不开优秀的架构设计。本文将介绍 Kubernetes 在架构方面的设计考虑。
如果让我们自己从头设计一套容器管理平台,很容易想到需要考虑资源调度、服务发现、故障恢复、水平伸缩等诸多方面。下面这张图完整展示了 Kubernetes 的运行原理。

图:Kubernetes 架构
可见,Kubernetes 首先是一套分布式系统,由多个节点(Node)组成,节点分为两类:一类是属于管理平面的主节点/控制节点(Master),一类是属于运行平面的工作节点(Worker Node)。
显然,复杂的工作肯定都交给控制节点去做了,工作节点负责提供稳定的操作接口和能力抽象即可。
从这张图上,我们并没有发现 Kubernetes 中对于控制平面的分布式实现,但是由于数据后端自身就是一套分布式的数据库 etcd,因此可以很容易扩展到分布式实现。
主节点上的管理服务
主节点上需要提供如下的管理服务:
- 认证授权(authorization/authentication):对访问 API 的请求进行安全控制;
- REST API:管理
Pod、Service、Replication Controller等资源对象; - Scheduler(调度器):负责
Pod的调度; - Replication Controller(复制控制器):负责
Pod副本的管理; - 分布式可监听存储:由
etcd实现,作为整个集群的数据后端。
这里 etcd 既作为数据后端,又作为消息中间件。通过 etcd 来存储所有主节点上的状态信息,很容易实现主节点的分布式扩展。组件可以自动地侦测 etcd 中的数值变化来获得通知,并且获得更新后的数据来执行相应的操作。
Proxy 代理对服务的请求
kube-proxy 会通过 apiserver 监听 Service 和 Endpoint 的变化,随后在节点上打开代理端口并设置相应的 iptables 规则。客户端(Client)发往服务端口的请求,会被重定向到代理端口,再由 kube-proxy 转发到具体的后端 Pod。

图:Proxy 代理对服务的请求