Docker 系列(五十五):Kubernetes 架构设计

任何优秀的项目都离不开优秀的架构设计。本文将介绍 Kubernetes 在架构方面的设计考虑。

如果让我们自己从头设计一套容器管理平台,很容易想到需要考虑资源调度、服务发现、故障恢复、水平伸缩等诸多方面。下面这张图完整展示了 Kubernetes 的运行原理。

Kubernetes 整体架构图:kubectl 命令经认证授权后访问主节点的 REST API(管理 pods、services、replication controllers),由 Scheduler 和 Replication Controller 等组件处理,状态保存在基于 etcd 的分布式可监听存储中;右侧两个工作节点各自运行 kubelet 与 Proxy,并通过 Docker 承载若干 Pod,外部流量经 Internet 和防火墙由 Proxy 接入

图: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。

kube-proxy 服务代理示意图:三个携带 app=MyApp 标签、端口为 9376 的后端 Pod,Client 的请求经 iptables 转发,由 kube-proxy 代理到后端 Pod,kube-proxy 通过 apiserver 监听 Service 与 Endpoint 的变化

图:Proxy 代理对服务的请求

系列导航


   转载规则


《Docker 系列(五十五):Kubernetes 架构设计》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
RPC 系列导读:从 gRPC 实战到 brpc 内核的完整路径 RPC 系列导读:从 gRPC 实战到 brpc 内核的完整路径
这个系列把 RPC 的知识整理成了一条由浅入深的完整路径:从「RPC 与 gRPC 全景」的第一问开始,用一套 Go gRPC 教程跑通四种通信形态与超时、认证,再进入 gRPC 的高级专题,随后以 brpc 为主线深入一个工业级 RPC
2023-09-04
下一篇 
Docker 系列(五十四):Kubernetes 基本概念 Docker 系列(五十四):Kubernetes 基本概念
Kubernetes 的概念体系可以概括为操作对象、功能组件与功能特性三个层面,如图所示。下面介绍其中最基础的两个概念:节点(Node)与容器组(Pod)。 节点(Node)在 Kubernetes 中,节点是实际工作的点,节点可以是虚拟
2023-08-22
  目录