角色(Role)
上一章节我们讲到了Mesos中的资源和属性定义。在Mesos中,可以通过给资源设置特定的角色(Role),将资源预留(参考资源预留章节)给一个或多个框架。角色可以用来对如何向框架提供资源做出各种限制。角色的一些应用场景包括:
将特定节点上的所有资源限定为仅提供给某个特定的框架。
在两个组织间划定集群:为组织A预留的资源只分配给注册在组织A的角色下的框架。
确保由一个框架创建的持久化卷不会提供给以不同角色注册的框架。
标记一组框架比另一组框架具有“更高优先级”,并为其提供更多资源。
为属于某个角色的一个或多个框架提供资源配额保障。
角色与访问控制
有两种方式可以控制框架注册为哪些角色。首先,ACLs可以用来指定哪个框架可以注册为哪个角色;其次,在Mesos的Master节点启动时,通过传递--roles
参数来配置一个角色白名单。
Mesos自0.27.0版本开始,如果未指定--roles
,则角色白名单允许使用任何角色名称。因此,自0.27.0开始推荐只使用ACLs控制使用哪些角色。命令行参数--roles
已启用。
将框架关联到角色
一个框架在注册到Master时,可以选择指定使用哪个角色。
在开发过程中,可以通过FrameworkInfo
消息的role
字段为框架指定一个角色。
在使用过程中,通常在框架启动时可以为其设置一个角色。如何做到这一点取决于你使用的用户界面,例如,Marathon提供了一个命令行参数--mesos_role
。
多个框架使用同一个角色
多个框架可以使用同一个角色。这一特性在某些场景下特别有用,如一个框架创建了一个持久化卷并往里写入数据,数据写入完成后,这个持久化卷可以提供给同一角色下的另一个框架,在第二个框架启动时读取该持久化卷里的数据。
同时配置多个框架使用同一角色应当谨慎,因为具有同一角色的所有框架可以访问预留给该角色的任何资源。比如,框架保存在持久化卷上的某些敏感信息,某些框架可能占用其他框架创建的持久化卷空间来启动等。
将资源关联到角色
通过资源预留可以将资源关联到某个角色。可以通过静态预留(Agent节点启动时)和动态预留来调配资源。详细信息请参考资源预留章节。
默认角色
名为“*”的角色是特殊的。设置了“*”角色的资源被视为“未预留”;类似的,一个框架在注册时未指定角色,则默认被设置为“*”角色。默认情况下,Agent节点上的所有资源最初都被分配给“*”角色(除非在Agent节点启动时通过--default_role命令行参数指定了其它角色)。
默认“*”角色与其它角色有不同的行为。例如,动态预留可用于将资源从“*”角色重新分配到其它特定角色,但不能从一个特定角色重新分配给另一个特定角色(除了首先取消预留的资源,例如通过/unreserve
操作接口取消预留)。类似的,不能在未预留的资源上创建持久化卷。
无效角色
角色的名称必须是一个有效的目录名。所以不能:
是一个空字符串
是一个.或..
以“-”开头
包含任何斜杠(/),退格符或空格字符,
角色与资源分配
默认情况下,Mesos的Master节点使用主导资源公平(DRF)算法来分配资源。特别地,DRF的这种实施首先识别哪一个角色与其所主导资源的公平份额相差是最大的。随之,该角色中的每个框架将被依次提供额外的资源。
资源分配过程可以通过给角色设置权重(weights)来控制调整。拥有权重2的角色将被分配的公平份额是拥有权重1的角色的两倍。默认情况下,角色的权重为1。维护人员可以通过/weights
API为角色配置权重。
角色与主体
主体是一个与Mesos交互的实体信息,类似于用户名。例如,框架向Mesos注册时需要提供一个主体信息,维护人员使用HTTP管理接口时需要提供一个主体身份信息。Mesos可以要求对操作主体进行身份校验和授权。
另一方面,角色仅用于以各种方式将资源与框架相关联,如上所述。
DC/OS中的角色
需要注意的是,DC/OS中用于标识节点类型的“角色”与Mesos中的角色是两个不同的概念。标识节点类型的角色在/etc/mesosphere/roles/
目录下通过文件名为master
, slave
和 slave_public
的空文件识别。
默认情况下,slave_public
节点上的资源会分配给同名的Mesos角色:slave_public
;slave
节点上的资源会分配给Mesos角色:“*”。
可以通过修改/var/lib/dcos/mesos-resources
中的JSON定义,添加自定义的Mesos角色并预留静态资源。 如果需要动态预留资源,请参考资源预留。
限定特定节点的资源角色
如果希望将Agent节点的资源限定为特定资源角色而不是默认的“*”,可以通过修改/var/lib/dcos/mesos-slave-common
文件(可能需要创建),添加:
MESOS_DEFAULT_ROLE=[角色名称]
修改后需要重新启动Mesos Slave服务:
systemctl stop dcos-mesos-slave
rm -f /var/lib/mesos/slave/meta/slaves/latest
systemctl start dcos-mesos-slave
注意,如果在/var/lib/dcos/mesos-resources
中为其它角色预留了资源,则这些资源仍会被分配给指定这些角色的服务。