容器化实践指南 | 迈出容器化的第一步:集群管理(下)

在前两期《容器化实践指南 | 迈出容器化的第一步:集群管理(上)》和《容器化实践指南 | 迈出容器化的第一步:集群管理(中)》中,我们详细介绍了容器集群管理的相关概念和网络架构。

 

在本期,我们将会介绍如何为容器集群提供持久化存储、如何分配和监控集群资源,并在最后介绍两种快速搭建容器集群的方式。

 

为容器提供持久化存储

 

我们提到过,容器的特点是快速启停和弹性伸缩,这就不适合存储持久化的数据。然而在实际应用场景中往往会有数据持久化存储的需求,比如服务的配置文件、密码密钥、用户数据、不同服务间的共享数据、服务的状态信息等等。Kubernetes提供了一套声明式(Declarative)的存储架构,用户只需要声明所需的存储资源,Kubernetes以插件的形式来对接各种不同的存储系统,以基于Docker Volume的方式将宿主机的文件目录挂载到容器当中。

 

PersistentVolume(简称为PV)和PersistentVolumeClaim(简称PVC)是Kubernetes中用于描述存储的两种资源。其中PV是由管理员添加的一个全局的描述,定义了存储的类型、存储的大小以及访问模式等信息,PV的生命周期独立于容器组,并不会因为容器组的销毁而被释放。PVC则是对PV的请求描述,通常是与某个容器组共同创建,生命周期也与容器组同步。

 

目前Kubernetes通过PV/PVC方式支持了非常丰富的存储系统,通常我们根据存储系统提供的访问接口将其分为3大类:

 

  • 文件存储,通常是指一个支持POSIX接口的分布式存储系统,常见的文件存储包括NFS、FTP、SamBa等,百度云CFS就是典型的分布式文件存储服务。

 

  • 块存储,通常以QEMU Driver等接口将裸磁盘空间映射主机使用,提供固定大小的RAID块作为逻辑单元号,比如磁盘阵列、硬盘、虚拟硬盘等,在百度云上CDS就是提供块存储的云磁盘服务。

 

  • 对象存储,也就是通常意义的键值存储,通过一系列简单的GET、PUT等接口提供服务,百度云BOS即是典型的对象存储服务。

 

不同的存储系统往往适用于不同的使用场景:对于用户的业务临时数据,通常可以使用块存储。对于应用所需的配置数据或者静态数据,对象存储是比较好的选择。而大量的数据文件如日志、消息等,则使用分布式文件存储最佳。

 

百度云容器引擎CCE为使用者提供了针对云上3种不同存储系统的插件,从而让用户可以直接通过声明PV/PVC的方式使用这些存储,并且支持对存储资源的动态创建和删除,让容器存储的使用更加便利。

 

分配和监控集群资源

 

在搭建好集群的相关资源之后,资源的规划和监控也是集群管理者非常重要的工作。

 

在Kubernetes中,计算资源主要是指CPU和内存。当用户在Kubernetes中创建容器组时,可以为容器组中的每一个容器配置一组资源参数:

 

  • requests.cpu

  • limits.cpu

  • requests. memory

  • limits.memory

 

其中request.cpu将会被转换成启动Docker所需的CPU参数,用于为容器分配基本的CPU资源。limit.cpu则对容器的CPU值做出限制,一个容器无法获得超过其limit.cpu值限定的CPU资源分配。

 

如果一个容器运行内存超过了其request.memory,那么该容器所在的容器组会在节点资源不足时被驱逐,而一旦容器使用了超过limits.memory值的内存,该容器将会被直接终止。

 

除了对容器进行细粒度的资源控制,Kubernetes也支持基于资源配额(ResourceQuota)进行整个集群的资源管理。当存在多个用户或者团队共同使用同一个集群时,资源配额机制就可以防止因为部分使用者超额使用资源而导致其它使用者资源不足的情况。

 

目前Kubernetes的配额系统是以命名空间为粒度的,因此首先需要为不同的团队分配不同的命名空间,同时为这些命名空间创建资源配额对象。如果为某个命名空间启动了配额,当用户在该命名空间中创建容器资源时必须使用request和limit值,配额系统将会追踪资源的使用情况。一旦资源创建或者更新违反了配额规则,请求将会失败。

 

在Kubernetes中,计算资源的使用情况将会作为容器组状态信息的一部分,当容器组因为资源不足而创建失败或者被终止时,用户可以通过describe命名来查看具体的原因。同时Kubernetes的生态中也有许多提供资源监控能力的组件,来满足更加高阶的监控需求。其中最常见的是Prometheus监控系统,主要具有的功能包括:

 

  • 多维数据模型(时序由 metric名字和k/v的labels构成)。

  • 灵活的查询语句(PromQL)。

  • 无依赖存储,支持local和remote不同模型。

  • 采用http协议,使用pull 模式,拉取数据,简单易懂。

  • 监控目标,可以采用服务发现或静态配置的方式。

  • 支持多种统计数据模型,图形化友好。

 

由于集群监控是非常通用的需求,因此百度云CCE提供了对Prometheus系统的组件化集成,用户可以在CCE控制台-监控日志-容器监控中找到Prometheus的一键部署方式。

 

快速搭建Kubernetes集群

 

Kubernetes集群的搭建需要在多个节点上部署各种相互依赖的组件,同时对于网络架构也有一定要求。由于Kubernetes的核心组件和社区组件在不断迭代更新以及底层部署环境存在着差异性,在不依赖外部工具的情况下部署一个Kubernetes集群将会相当复杂。因此我们将介绍两种常见的集群搭建方式:使用云服务商提供的集群托管服务、利用社区提供的Kubeadmin部署工具。

 

搭建Kubernetes最为快捷的方式之一是使用云服务商提供的集群托管服务,百度云容器引擎CCE即是该类型的产品。用户通常只需要根据自己的需求提供集群规模、K8S版本、以及所需组件等信息,托管服务将帮助用户完成集群Master的创建、Node的部署,解决集群网络在不同基础环境中的搭建,并且提供一系列扩缩容集群和管理集群的接口。

 

容器集群托管服务不仅降低了用户搭建管理集群的学习成本,同时也大大提高了生产环境的可靠性,除了对Kubernetes本身复杂的二次开发需求外,托管服务通常都是用户的最佳选择。

 

通常的容器集群托管服务会提供两种不同的服务方式供用户选择:完全托管用户Master节点和暴露Master节点,两者的区别在于部署着集群Master组件的节点是否暴露给用户。前者由服务商完全托管集群的Master,用户无法对Master节点的大小和配置进行自定义,也不能登录到Master节点中进行查看和修改。后者则允许用户自定义Master节点的大小配置,并在完成Master的部署后,将节点的root权限完全交付给用户。

 

对用户而言,这两种服务方式各有利弊,完全托管Master节点将会大大降低用户的维护成本、由服务商完全负责Master的可用性,但同时也限制了用户对Master组件的自定义能力。而暴露Master节点的集群则提供更高的开放性,但是需要用户关注和维护Master,存在因用户错误操作而导致Master组件故障的风险。

 

除了使用托管服务以外,Kubernetes官方的部署工具Kubeadmin也是一个不错的选择。Kubeadmin提供了多种集群管理的命令,其中最为基础的是kubeadmin init和kubeadm join,分别用于部署Master组件和创建Worker节点。同时Kubeadmin还提供了集群升级、集群配置、集群回滚等丰富的功能。

 

KubeAdmin在搭建试验性质的小型集群非常有效,但是在公有云的环境下,容器网络的搭建、PV/PVC与云上各种存储服务的集成等许多复杂工作,还是无法单纯依赖Kubeadmin完成的。

 

总  结

 

我们三篇容器集群管理就到这里结束了,不知道大家是否已经对部署自己的Kubernetes集群跃跃欲试了呢?您现在就可以使用百度云CCE服务快速启动自己的第一个容器集群,并且将我们提供的这些理论知识付诸实践。

 

当然,管理好容器集群只是迈出了容器化的第一步,下一期开始我们将为大家介绍如何管理部署在Kubernetes集群之中的各种容器资源,敬请期待。