角色(Role)
上一章节我们讲到了Mesos中的资源和属性定义。在Mesos中,资源是通过角色(Role)来进行分配的。
现代主机级操作系统(例如Linux,BSD等)大多都支持多用户。Mesos作为一个多用户集群管理系统同样支持通过一个Mesos集群管理组织机构内的全部计算资源,为组织机构内的所有用户提供资源服务。
因此,Mesos必须解决一些与资源管理相关的需求:
在用户之间公平的分享资源
为用户提供资源保障(如配额,优先级和隔离等)
提供精确的资源计量
- 有多少资源被分配/利用/...
- 每用户的资源提供计量
在Mesos中,这些“用户”即为角色,一个角色(role)对应着集群中的一个资源消费者。资源消费者既可以代表组织机构内的用户,也可以代表团队,组织,服务,框架等。
Mesos的上层框架中的Scheduler通过订阅一个或多个角色,以便代表他们所服务的资源消费者接收资源并安排工作。
Mesos提供的一些资源分配保障示例如:
保证角色能够分配一定数量的资源(通过配额)。
确保特定Agent节点上的某些(或全部)资源被分配到特定角色(通过预留)。
确保角色能够平等的共享资源(通过DRF)。
声明某些角色应该获得更高的相对份额(通过权重)。
角色与访问控制
有两种方式可以控制框架能够订阅哪些角色。首先,ACLs可以用来指定哪个框架可以订阅哪个角色;其次,在Mesos的Master节点启动时,通过传递--roles
参数来配置一个角色白名单,如果对白名单进行修改,则必须重启Master服务。
Mesos自0.27.0版本开始,如果未指定--roles
,则角色白名单允许使用任何角色名称。因此,自0.27.0开始推荐只使用ACLs控制使用哪些角色。命令行参数--roles
已弃用(deprecated)。
将框架关联到角色
一个框架在注册到Master时,可以选择订阅哪个角色。
在开发过程中,可以通过FrameworkInfo
消息的roles
字段为框架订阅一个角色。
在使用过程中,通常在框架启动时可以为其订阅一个角色。如何做到这一点取决于你使用的用户界面,例如,Marathon提供了一个命令行参数--mesos_role
。
多个框架使用同一个角色
多个框架可以订阅同一个角色。这一特性在某些场景下特别有用,如一个框架创建了一个持久化卷并往里写入数据,数据写入完成后,这个持久化卷可以提供给同一角色下的另一个框架,在第二个框架启动时读取该持久化卷里的数据。
同时配置多个框架订阅同一角色应当谨慎,因为具有同一角色的所有框架可以访问预留给该角色的任何资源。比如,框架保存在持久化卷上的某些敏感信息,某些框架可能占用其他框架创建的持久化卷空间来启动等。
将资源关联到角色
通过资源预留可以将资源关联到某个角色。可以通过静态预留(Agent节点启动时)和动态预留来调配资源。详细信息请参考资源预留章节。
默认角色
名为“*”的角色是特殊的。设置了“*”角色的资源被视为“未预留”;类似的,一个框架在注册时未指定角色,则默认被设置为“*”角色。默认情况下,Agent节点上的所有资源最初都被分配给“*”角色(除非在Agent节点启动时通过--default_role
命令行参数指定了其它角色)。
默认“*”角色与其它角色有不同的行为。例如,动态预留可用于将资源从“*”角色重新分配到其它特定角色,但不能从一个特定角色重新分配给另一个特定角色(除了首先取消预留的资源,例如通过/unreserve
操作接口取消预留)。类似的,不能在未预留的资源上创建持久化卷。
此外,在Mesos 1.3中,框架应该使用FrameworkInfo.roles
字段,它不指定\*
的默认值,但如果需要,框架仍可以明确指定\*
。框架和操作人员不能为\*
角色使用资源预留。
无效角色
角色的名称必须是一个有效的目录名。所以不能:
是一个空字符串
是一个.或..
以“-”开头
包含任何斜杠(/),退格符或空格字符,
角色与资源分配
默认情况下,Mesos的Master节点使用主导资源公平(DRF)算法来分配资源。特别地,DRF的这种实施首先识别哪一个角色与其所主导资源的公平份额相差是最大的。随之,该角色中的每个框架将被依次提供额外的资源。
资源分配过程可以通过给角色设置权重(weights)来控制调整。拥有权重2的角色将被分配的公平份额是拥有权重1的角色的两倍。默认情况下,角色的权重为1。维护人员可以通过/weights
API为角色配置权重。
角色与配额
可以通过/quota
指定配额的方式保证指定的角色可以分配特定数量的资源。
在公平分享剩余资源之前,资源分配者将首先尝试满足配额要求。详细信息请参阅配额。
角色与主体
主体是一个与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 kill -s SIGUSR1 dcos-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
中为其它角色预留了资源,则这些资源仍会被分配给指定这些角色的服务。