Kubernetes 的重要概念
了解和掌握Kubernetes 的重要概念是非常有必要的。只有深入理解Kubernetes 的基本概念,才能掌握其各个组件的功能,从而能够快速地部署和维护Kubernetes 。本节将对Kubernetes 中的重要概念进行介绍。
集群
在Kubernetes 中,Cluster (集群)是计算、存储和网络资源的集合。Kubernetes 利用这些基础资源来运行各种应用程序。因此,Cluster 是整个Kubernetes 容器集群的基础环境。
控制节点
Master (控制节点)是指集群的控制节点。在每个Kubernetes 集群中,都至少有一个Master 节点来负责整个集群的管理和控制。几乎所有的集群控制命令都是在Master 上面执行的。因此,Master 是整个集群的大脑。正因为Master 如此重要,所以为了实现高可用性,用户可以部署多个Master 节点。Master 节点可以是物理机,也可以是虚拟机。
通常来说,Master 上运行了以下关键的进程。
(1 )Kubernetes API 服务器
Kubernetes API 服务器(Kubernetes API Server )的进程名称为kube-apiserver 。Kubernetes API 服务器提供了Kubernetes 各类资源对象的增、删、改、查的HTTP Rest 接口,是整个系统的数据总线和数据中心。Kubernetes API 服务器提供了集群管理的REST API 接口,包括认证授权、数据校验以及集群状态变更,提供了其他模块之间的数据交互和通信的枢纽,是资源配额控制的入口,拥有完备的集群安全机制。
(2 )Kubernetes 控制器管理器
Kubernetes 控制器管理器(Kubernetes Controller Manager )作为集群内部的管理控制中心,负责管理集群内的Node (节点)、Pod (副本)、服务端点(Endpoint )、命名空间(Namespace )、服务账号(ServiceAccount )、资源配额(ResourceQuota )。当某个节点意外宕机时,Kubernetes 控制器管理器会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
(3 )Kubernetes 调度器
Kubernetes 调度器( Kubernetes Scheduler )的作用是根据特定的调度算法把 Pod 调度到指定的工作节点( Node )上,这个过程也叫绑定( Bind )。 Kubernetes 调度器的输入为需要调度的 Pod 和可以被调度的节点的信息,输出为调度算法选择的 Node 节点,并将该 Pod (基本 操作单元 )绑定到这个节点。
(4 )Etcd
Etcd 是采用Go 语言编写的一个分布式key-value 存储,也是Kubernetes 集群中的一个十分重要的组件。它用于保存集群所有的网络配置和对象的状态信息,以解决分布式系统中数据一致性的问题。
工作节点
在Kubernetes 中,除了Master 节点之外,其他节点都称为Node 节点(注意:Node 这个英文单词本身就是节点的意思)。与Master 节点不同,Node 节点才是Kubernetes 中承担主要计算功能的工作节点。Node 节点可以是一台物理机,也可以是一台虚拟机。
整个Kubernetes 集群中的Node 节点协同工作,Master 会根据实际情况将某些负载分配给各个Node 节点。当某个Node 节点出现故障时,其他Node 节点会替代其功能。
Node 节点上运行以下主要进程。
(1 ) Kubelet
在Kubernetes 集群中,每个Node 节点都会启动Kubelet 进程,用来处理Master 节点下发到本节点的任务,管理Pod 和其中的容器。Kubelet 会在API Server 上注册节点信息,定期向Master 节点汇报节点资源的使用情况,并通过cAdvisor 监控容器和节点资源。可以把Kubelet 理解成一个代理进程,是Node 节点上的Pod 管家。
(2 )Kube-proxy
Kube-proxy 运行在所有Node 节点上,它监听每个节点上Kubernetes API 中定义的服务变化情况,并创建路由规则来进行服务负载均衡。
(3 )Docker 引擎
Docker 引擎就是本书前面介绍的Docker CE 等服务引擎,负责容器的创建和管理等。
Pod
Pod
是Kubernetes
的基本操作单元,一个Pod
中可以包含一个或多个紧密相关的容器,一个Pod
可以被一个容器化的环境看作应用层的逻辑宿主机。一个Pod
中的多个容器应用通常是紧密耦合的,Pod
在Node
节点上被创建、启动或者销毁。每个Pod
中运行着一个特殊的被称为Pause
的容器,其他容器则为业务容器,这些业务容器共享Pause
容器的网络栈和Volume
挂载卷,因此它们之间的通信和数据交换更高效,在设计时我们可以充分利用这个特性,将一组密切相关的服务进程放入同一个Pod
中。
同一个Pod 中的容器之间仅需通过localhost 就能互相通信。同一个Pod 中的业务容器共享Pause 容器的IP 地址,共享Pause 容器挂载的存储卷。
Pod 是Kubernetes 调度的基本工作单元,Master 节点会以Pod 为单位,将其调度到Node 节点上。Pod 的基本组成如图12-1 所示。
图12-1 Pod 的基本组成
服务
在Kubernetes 的集群中,虽然每个Pod 都会被分配一个单独的IP 地址,但这个IP 地址会随着Pod 的销毁而消失。这就引出一个问题,如果有一组Pod 组成一个集群来提供服务,那么如何来访问它呢?答案是通过服务即可。
一个服务可以看作一组提供相同服务的Pod 的对外访问接口,服务作用于哪些Pod 是通过标签选择器来定义的。服务通常拥有以下特点:
拥有一个指定的名字,比如mysql-server 。
拥有一个虚拟IP 地址和端口号,销毁之前不会改变,只能在内网访问。
能够提供某种远程服务能力。
被映射到了提供这种服务能力的一组容器应用上。
如果服务要提供外网服务,就需要指定公共IP 和Node 端口,或外部负载均衡器。
卷
默认情况下,容器的数据都是非持久化的。当容器消亡后,数据也跟着丢失。为了解决这个问题,Docker 提供了卷机制以便将数据持久化存储。类似地,Kubernetes 提供了更强大的卷机制和丰富的插件,可以解决容器数据持久化和容器间共享数据的问题。
与Docker 不同,Kubernetes 卷的生命周期与Pod 绑定。容器宕掉后,Kubelet 再次重启容器时,卷的数据依然还在,而Pod 被删除时,卷才会清理。数据是否丢失取决于具体的卷类型,比如emptyDir 类型的卷实际上是一个临时空目录,是Pod 内多用户同享的一个目录。与Pod 的生命周期一致,这个目录在Pod 创建时创建,删除时删除。持久化存储卷为独立于计算资源的一种物理存储资源,不属于任何一个Node 节点。因此,在Pod 被删除时,不会丢失数据,除非人工将其删除。
命名空间
命名空间是Kubernetes 系统中的另一个重要概念,通过将系统内部的对象分配到不同的命名空间中,形成逻辑上的不同项目、小组或用户组,从而使得在共享使用整个集群的资源的同时还能分别管理它们。
Kubernetes 集群在启动后,会创建一个名为default 的默认命名空间,如果不特别指明命名空间,那么用户创建的Pod 、RC 、服务都会被系统创建到默认的命名空间中。
当团队或项目中具有许多用户时,可以考虑使用命名空间来区分。在未来的Kubernetes 版本中,默认情况下,相同命名空间中的对象将具有相同的访问控制策略。
节选自《Docker与Kubernetes容器运维实战》
