1.2 云资源层
云资源层和云上Kubernetes 之间的关系,相当于计算机硬件与操作系统之间的关系。云资源层为Kubernetes 提供了有弹性优势的软硬件基础,如云服务器、安全组、专有网络、负载均衡、资源编排等。
从本质上来说,Kubernetes 本身并不提供任何计算、网络或存储资源,它仅仅是这些底层资源的封装。
容器集群对底层资源封装的程度,在不同厂商的实现中,可能完全不同。以阿里云为例,用户除了可以通过容器服务的接口使用集群外,还可以通过底层资源的接口(如负载均衡控制台)来对集群底层资源做操作。但是这种操作具有一定程度的风险,如无必要,不要直接操作底层资源。
在以下三节中,我们分别看一下阿里云容器集群三种形态的组成原理,包括专有版、托管版及Serverless 版。
1.2.1 专有版
首先是资源管理。专有版集群使用了多种云资源,如图1-2 所示。在实现的时候,我们可以选择使用编码的方式来管理这些资源实例的生命周期,但这显然是低效的。阿里云的选择是,以资源编排(ROS)模板为基础,结合用户自定义配置来统一管理底层资源。
图1-2 阿里云专有版Kubernetes 集群组成原理
其次是集群网络。专有版集群在被创建之初,就被指定了专有网络VPC的配置,如节点网段等。VPC 实例被创建之后,其他所有集群资源,都必然和这个VPC 实例相关联。VPC 的安全组,在这里扮演着集群网络的防火墙角色。
再次是计算资源。集群在默认情况下会创建三个云服务器作为管控节点,同时集群会根据用户的需求,创建若干云服务器作为集群的Worker 节点。这些Worker 节点与弹性伸缩实例绑定,以实现节点伸缩功能。集群节点和RAM(访问控制)的角色绑定,以授权集群内部组件访问其他云资源。另外,集群节点可以挂载云盘并以本地存储形式来使用。
最后是接口实现。集群使用NAT 网关作为集群默认的网络出口,使用SLB(负载均衡)作为集群的入口,这包括API Server 入口,以及图中未包括的Service 的入口。
1.2.2 托管版
托管版集群在资源管理、集群网络、Worker 节点,以及接口实现方面,基本上采用了与专有版集群相同的实现方法。
托管版与专有版的第一个差别,在于管控组件方面。托管版集群的管控组件,是用户不可见的。这些组件以Pod 的形式运行在专门的Master 集群里,如图1-3 所示。
这会引入一个非常核心的问题,就是位于Master 集群里的API Server Pod与位于客户集群里的节点之间的通信问题。因为Master 集群是阿里云生产账号创建的集群,所以这实际上是一个跨账号、跨VPC 通信的问题。
解决方法是使用一种特殊的弹性网卡ENI。这种网卡逻辑上位于客户集群所在的VPC 里,所以可以和VPC 里的节点通信,而物理上被安装在APIServer Pod 里,即位于Master 集群里。这就完美解决了API Server Pod 与托管版集群节点之间的通信问题。
1.2.3 Serverless 版
与前两种类型的集群相比,Serverless 版的实现要简单一些,可以看作前两种实现的简化版,如图1-4 所示。
图1-4 阿里云Serverless 版Kubernetes 集群组成原理
首先,Serverless 集群因为用到的云资源较少,且变化不大,所以我们直接通过编码的方式实现了资源管理。
其次,Serverless 使用ECI(弹性容器实例)来运行Pod,没有使用云服务器这样的计算资源。
最后,集群直接依靠运行于Master 集群里的Virtual Kubelet 来管理ECI实例。