Kubernetes的重要概念

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容器运维实战》

 


请使用浏览器的分享功能分享到微信等