王作敬
作者王作敬·2019-03-12 14:11
管理信息系统总监·银河证券

容器云之标签管理设计

字数 3367阅读 1966评论 1赞 2

作者:汪照辉 王作敬
汪照辉个人页面


随着容器节点和服务的增多,个性化的需求就逐渐提了出来。在容器部署调度资源的时候,可能会需要选择一些具备特定特性的节点进行部署。就像AWS提供的m、c、r、x、i、d等计算服务一样,不同的业务服务可能需要不同的资源。所以我们考虑容器平台资源管理实现也会像IaaS平台资源服务一样,不同的资源需要考虑划分为不同的组或不同的类型,提供分类资源服务,这些服务通过标签的方式来标识。租户根据自身业务实际需求来选择合适的服务类型(例如通过某种标签),就可以快速获取满足自身业务需求的资源。同时Kubernetes可以提供标签功能,可以通过标签实现亲和性和非亲和性部署,比如容器部署时,可以根据宿主机标签非亲和性部署调度到不同的宿主机上。这样就可以通过标签作为过滤条件选择匹配的节点调度部署以实现高可用等能力。

一、 认识标签

在Kubernetes中,标签是附加到对象(如pods)上的键/值对。标签的作用旨在指定对用户有意义和相关的对象的标识属性,但并不直接暗示对核心系统的语义。也就是说标签可以用来标识对使用者有一定价值和一定关系的对象,比如同一个宿主机上的虚拟机作为Kubernetes集群的Node节点,容器调度时要考虑非亲和性策略;同一个应用的不同服务的不同实例Pods,使用相同的应用名称标识;同一租户的计算、存储、网络等资源使用租户名标识,在查询时可以快速方便的查询显示等等。
所以说标签可用于组织和选择对象的子集。标签可以在对象创建时设置,也可以在对象创建后随时添加和修改。Kubernetes中每个对象都可以定义一组键/值标签,并且对于给定的对象,每个键都必须是唯一的。不过我们在实践过程中做了简化,只定义了标签值Value,对象名称作为键Key,可以有很多Values,作为数组处理。Kubernetes中通过标签选择器选择标签,客户或用户通过标签可以标识一组对象。Kubernetes API目前支持两种类型的选择器:基于相等和基于集合的选择器,使用一个或多个标签进行选择。

二、 标签分类定义:

标签是Kubernetes的一个原生对象,有内建的标签。比如kubernetes.io/host name,我们称之为Kubernetes默认标签。kubernetes.io/和K8s.io/是保留用于Kubernetes核心组件的。
在容器云平台层,定义了平台对象的一些标签,比如虚拟机的宿主机,计算资源类型,存储资源类型等,我们称之为容器云平台标签。这些标签是在容器云平台层为平台各对象默认设置的,方便容器平台资源的调度和管理。
另外租户用户也可能会定义一些标签来标识不同的资源或应用,比如应用或服务版本号,我们称之为用户自定义标签。这些标签配合平台标签方便租户用户管理和调度资源、服务和应用。

三、 标签管理视角

从使用者的视角来说,标签管理同样适用于管理员视角和租户视角。因此我们分别从平台管理员视角和租户视角来设计定义和管理标签。

(一) 平台管理员视角

我们说过,平台管理员视角关注的是平台资源,其实也就是租户业务应用使用的软硬件资源。包括计算资源(计算节点,有CPU、内存和本地存储)、存储资源、网络资源等。Pods或容器是运行在节点中的。节点是容器云平台中重要的对象之一。节点可以是物理机节点也可以是虚拟机节点,通常为了管理的便利采用虚拟机节点,这样为了保证应用服务的高可用部署,需要把服务实例部署到虚拟机的不同的宿主机上。如何保证服务实例选择的虚拟机节点分别位于不同的额宿主机上?这就需要通过标签来标识。
另外还有我们定义的分区、不同类型的存储、不同的类型计算节点、不同类型的容器等都需要通过标签来进行区分,方便查询、管理和资源调度。从平台管理角度来看,可以继承Kubernetes内建标签,定义平台对象标签。

(二) 租户视角

从租户角度来说,关心的是使用资源来支撑业务应用的运行运营。租户重在使用而不是维护资源,所以如何方便的为租户提供所需的资源是平台设计时需要考虑的问题。比如服务部署一些强依赖关系的Pod或容器就不适合调度到距离遥远的节点上。我们曾经遇到过有Pod被调度到了深圳节点,结果造成响应延迟很大,性能指标急剧下降。这样的场景可能就适合通过标签定义亲和性调度。
从方便租户使用角度,平台提供标签能力支持容器亲和性和非亲和性调度等需求,也为租户提供资源的查询和管理功能。租户中的节点、分区、存储、应用、服务、实例、容器等都会涉及标签的定义和应用。

四、 标签管理设计

采用工具的目的是为了便利性和敏捷性。使用标签也是一样。标签的设计要能带来敏捷和便利,因此基于这样的思想我们考虑实现下面的内容:

(一) 标签管理作为一级菜单

不管从管理员视角或者是租户视角,标签管理都是比较重要的内容,可以作为独立的一项放到一级菜单来管理。另外考虑到多集群、多云管理等和云管平台的整合,从租户的角度来说,标签标识不同的资源类型和来源,可以快速的了解和调度使用这些资源。

(二) 标签定义类型

1.分区标签
资源分区是我们定义的一个重要对象。分区可以是物理分区、虚拟分区、容器分区、云分区等。分区有自己独立的资源范围,分配给租户供租户使用。分区标签就用来标识不同的分区类型。

2.节点标签
节点使用Kubernetes Node概念,但不仅仅是Kubernetes Node,可以是物理节点、虚拟节点、Kubernetes节点、云节点等。节点标签可能会比较多,比如节点宿主机标签、节点类型标签、节点分区标签、节点网络标签等等,甚至可以把数据中心、机柜机架等信息都作为标签。比如Host esxhx06宿主机上有节点node9、node18、node19、node20、node21等,每个节点都有host=esxhx06标签,通过host=esxhx06标签也可以快速查到这台机器上有哪些容器节点。

3.存储标签
容器平台可以支持多种存储,不同的存储可以通过标签来管理。

4.应用标签
应用标签是租户用来标识应用的。比如同一租户可能有多种应用,用标签来标识不同类型的应用。或者标识租户下某个用户的应用。多用户场景下不同用户部署的应用可能会涉及到权限管理等,应用会和用户相关。

5.服务标签
服务标签类似于应用标签,比如一个应用下有多个服务,这些服务都有一个所属应用的标签来标识其所在应用等。

6.服务实例标签和容器标签
服务实例和容器是一对一的关系。从业务角度来说,关注的是服务实例。从技术角度来说是每个Pod或容器。同一个服务多实例、弹性伸缩场景下,可以标识实例组或容器组等。

(三) 标签管理功能实现

在Kubernetes容器平台,标签是重要的一个对象,用途和范围几乎覆盖每项操作。在界面功能上需要考虑实现标签的查询、新增编辑、删除等能力。

1.标签查询
不同类型的标签都需要实现标签查询功能,在资源调度时,可以根据标签进行过滤和调度。
查询所有标签:每个标签类型页需要列出所有标签,标签所属关系等,按标签类型排序。
提供按类型查询标签能力:查询结果列出该类型的所有标签,标签所属关系等,按标签排序。
按标签查询:列出所有该标签的对象,按对象名称排序。

2.标签新增、编辑
除了平台在新增或生成对象时自动添加的平台标签,租户用户也可以对平台中的对象加标签或修改其标签。
在标签管理页面,新增编辑时可以选择多个对象。
在对象列表页面或对象详情页面新增编辑标签时,只应用于该对象。

3.标签删除
用户自定义标签可以被删除,平台标签不提供删除能力。这样避免用户误删除导致容器调度出现困难。
在标签管理页面,删除标签时删除所有有该标签的对象的标签。
在对象列表页面或对象详情页面删除标签时,只删除该对象的该标签。

4.标签调度
通过标签实现调度是Kubernetes的一项原生能力。可以进行扩展或封装,比如标签可以用同一个key多个value来标识,这样设置时就不用定义那么key=value,直接用value就行。

(四) 实现标签闭环

实现闭环是我们在平台设计中一个很重要的原则。这是平台友好性、便利性的一个重要指导原则。比如标签列表中,其对应的对象要有链接,通过对象链接可以跳转到对象详情页面,对象详情页面又有相应的标签链接可以跳转,这样就形成了一个闭环回路,不会出现死胡同。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论1 条评论

wuwenpinwuwenpin软件开发工程师南京
2019-03-12 19:39
感谢分享!!
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广