约束控制程序运行,允许优化容错或指定应用运行位置。约束由3个部分组成:field名称、操作符和一个可选参数。这个field可能是slave主机名或任何mesos salve的属性。
属性Fields
Hostname Fields
hostname属性匹配slave hostname,参看UNIQUE操作符的实例。
hostname字段支持marathon所有的操作。
Attribute field
如果这个字段名称不是以上提到的,它将被视为mesos slave属性。mesos slave属性是一个标记slave节点的方法,参考mesos-slave –help获取更多属性信息。
如果在slave节点上指定的属性没有定义,大多数operator将拒绝在slave节点上运行程序。实际上,只有UNLIKE operator将接受这个请求,其他的都拒绝。
attribute字段支持marathon所有的operator。
注意marathon只支持attribute文本值,不能处理任何数字值。例如foo:bar会被任何,但是marathon不能匹配cpu:4这个样的值。
操作符Operators
UNIQUE
UNIQUE告诉marathon强制所有应用程序的任务的唯一性。例如下面的约束,在每个host只能运行一个应用任务。
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-unique",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["hostname", "UNIQUE"]]
}'
CLUSTER
CLUSTER允许你在slave节点上运行所有的应用任务。如果你有特殊的硬件需要,或者你为了低延迟想运行它们在同一个rack,如下面的实例:
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-cluster",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["rack_id", "CLUSTER", "rack-1"]]
}'
你也可以使用这个属性让应用程序运行在一个指定的节点,使用hostname属性:
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-cluster",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["hostname", "CLUSTER", "a.specific.node.com"]]
}'
GROUP_BY
GROUP_BY可用于将任务均匀地分散到机架或数据中心,提高可用性:
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-group-by",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["rack_id", "GROUP_BY"]]
}'
marathon通过分析从mesos获取的信息,只能知道关于属性的不同rack_id值。如果任务没有分布在所有可能的值,那么任务需要在约束中指定值的数量。如果你没有指定数量,你会发现任务被分在一个值,尽管你使用的是GROUP_BY约束。例如,你要跨3个机架,要是使用下面的配置:
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-group-by",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["rack_id", "GROUP_BY", "3"]]
}'
LIKE
LIKE接受一个正则表达式作为参数,允许在slave节点运行你的任务,这个些节点是正则表达式匹配的节点。下面的例子是应用在机架rack-1到rack-3上运行,并均匀分布。
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-group-by",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["rack_id", "LIKE", "rack-[1-3]"]]
}'
注意,这个参数是必须的。
UNLIKE
和LIKE相似,任务只能运行在和正则表达式不匹配的slave节点上。下面的例子是应用不在机架rack-7到rack-9上运行。
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-group-by",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["rack_id", "UNLIKE", "rack-[7-9]"]]
}'
原文
https://mesosphere.github.io/marathon/docs/constraints.html