約束控制程序運行,允許優化容錯或指定應用運行位置。約束由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